--ld_assume_kernel

This flag is named after the environment variable LD_ASSUME_KERNEL used by ld-linix.

Here is an excellent article written by Ulrich Drepper on LD_ASSUME_KERNEL: Explaining LD_ASSUME_KERNEL

In short: if there are a number of kernel-dependent libraries installed (such as libc, libpthread, etc.), then LD_ASSUME_KERNEL (and --ld_assume_kernel) allows us to choose which one to use. For example, let's try to run ldd on Fedora Core 3 x86 system with different values for LD_ASSUME_KERNEL:

$ ldd /bin/dd
	linux-gate.so.1 =>  (0x00ba6000)
	libc.so.6 => /lib/tls/libc.so.6 (0x00110000)
	/lib/ld-linux.so.2 (0x00b40000)

$ LD_ASSUME_KERNEL=2.4.19 ldd /bin/dd
	linux-gate.so.1 =>  (0x00980000)
	libc.so.6 => /lib/i686/libc.so.6 (0x00110000)
	/lib/ld-linux.so.2 (0x00b40000)

$ LD_ASSUME_KERNEL=2.4.0 ldd /bin/dd
	linux-gate.so.1 =>  (0x009a6000)
	libc.so.6 => /lib/libc.so.6 (0x0081d000)
	/lib/ld-linux.so.2 (0x00b40000)

Different LD_ASSUME_KERNEL values will make the program use different libc:

  • /lib/tls/libc.so.6
  • /lib/i686/libc.so.6
  • /lib/libc.so.6

And now run ldconfig:

$ /sbin/ldconfig -p | grep libc.so.6
	libc.so.6 (libc6, hwcap: 0x8000000000000000, OS ABI: Linux 2.4.20) => /lib/tls/libc.so.6
	libc.so.6 (libc6, hwcap: 0x8000000000000, OS ABI: Linux 2.4.1) => /lib/i686/libc.so.6
	libc.so.6 (libc6, OS ABI: Linux 2.2.5) => /lib/libc.so.6

In the example above LD_ASSUME_KERNEL can change the minimal required kernel from 2.4.20 to 2.2.5

If there are a number of libc libraries installed, the --ld_assume_kernel flag can be used to allow running the Ermine-packed application with older kernels. There is no point using this flag if there is only one libc.