Xorg 32 bit development libraries with nix-shell

Hello!

I have some trouble with linking an simple C program that depends on 32 bit version of libX11.

I can provide an minimal example:

#include <X11/Xlib.h>
int main()
{
 XrmInitialize();
 return 0;
}

And I am trying to compile it with gcc -m32 myprogram.c -lX11 but linker fails with the following output:

/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: cannot find -lX11: No such file or directory
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/m81vwjvzw0js60ca2g1j02z30pfr68fw-libX11-1.8.7/lib/libX11.so when searching for -lX11
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/hd2dlkkz5mpxpgdfxqbzfmn07qyvdw3k-gcc-12.3.0-lib/lib64/libgcc_s.so.1 when searching for libgcc_s.so.1
/nix/store/3z013mdl9cvpgvavpj19rbilihz4clvi-binutils-2.40/bin/ld: skipping incompatible /nix/store/hd2dlkkz5mpxpgdfxqbzfmn07qyvdw3k-gcc-12.3.0-lib/lib64/libgcc_s.so.1 when searching for libgcc_s.so.1
collect2: error: ld returned 1 exit status

My .nix shell configuration file is looks like this:

{ 
  pkgs            ? import <nixpkgs> {},
  pkgsx86_64Linux ? import <nixpkgs> { system = "x86_64-linux"; },
  pkgsi686Linux   ? import <nixpkgs> { system = "i686-linux"; }
}:

pkgs.multiStdenv.mkDerivation {
  name = "Xprog";
  buildInputs = with pkgs;
  [
    gcc
    gnumake
    xorg.libX11
    xorg.libX11.dev
  ];
}

What I am doing wrong?

P.S linker has no problems in 64 bit mode

stdenv comes with its own copy of gcc, and you should not add extra copies of gcc to your shell.


If you want a pure 32 bits programs, then take all packages from pkgsi686Linux, including stdenv:

{ 
  # pkgs            ? import <nixpkgs> {},
  pkgsi686Linux   ? import <nixpkgs> { system = "i686-linux"; }
}:

pkgsi686Linux.stdenv.mkDerivation {
  name = "Xprog";
  buildInputs = with pkgsi686Linux;
  [
    xorg.libX11
  ];
}