1
<?xml version="1.0" encoding="iso-8859-1"?>
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-transitional.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5
<title>Explaining LD_ASSUME_KERNEL</title>
9
<h1>Explaining <tt>LD_ASSUME_KERNEL</tt></h1>
11
<p>Ulrich Drepper, 2004-5-12</p>
13
<p>It is frightening how something as simple as the mechanism
14
behind <tt>LD_ASSUME_KERNEL</tt> can create that much confusion. So
15
here are a few details which should enable everybody to
16
investigate the issue closer by her/himself.</p>
20
<p>First, <tt>LD_ASSUME_KERNEL</tt> is handled by the dynamic
25
<p>The behavior of a specific value of <tt>LD_ASSUME_KERNEL</tt>
26
is <b>not</b> hardcoded in the dynamic linker.</p>
30
<p>Every DSO (Dynamic Shared Object, aka shared library) can
31
tell the dynamic linker in glibc which minimum OS ABI version
32
is needed. NB: dynamic linkers other than glibc's do not
33
have this feature. The information about the minimum OS ABI
34
version is encoded in a ELF note section usually named
35
<tt>.note.ABI-tag</tt>. This note section must be referenced
36
by a <tt>PT_NOTE</tt> entry in the DSO's program header.</p>
38
<p>To examine the content of a DSO's note section use the
39
<tt>readelf</tt> program from <tt>elfutils</tt> (the version
40
from <tt>binutils</tt> is not capable enough). On Red Hat
41
system the binary is called <tt>eu-readelf</tt>. Using it on
42
a Fedora Core 2 system shows the following:</p>
44
<pre>$ eu-readelf -n /lib/tls/libc-2.3.3.so
46
Note segment of 32 bytes at offset 0x174:
49
OS: Linux, ABI: 2.4.20
52
<p>This means the <tt>/lib/tls/libc-2.3.3.so</tt> DSO
53
requires at least OS ABI version 2.4.20.</p>
57
<p>The specific ABI version requirements on a RHL9, and
58
Fedora Core 1 and 2 system are as follows (NB: this implies
59
IA-32 is the architecture):</p>
62
<li><p>DSOs in <tt>/lib/tls</tt> need ABI version 2.4.20.</p></li>
63
<li><p>DSOs in <tt>/lib/i686</tt> need ABI version 2.4.1.</p></li>
64
<li><p>DSOs in <tt>/lib</tt> need ABI version 2.2.5.</p></li>
67
<p>This means no <tt>LD_ASSUME_KERNEL</tt> setting requesting
68
versions earlier than 2.2.5 will work at all. Versions from
69
2.2.5 to 2.4.0 will use the DSOs in <tt>/lib</tt>, versions
70
from 2.4.1 to 2.4.19 will use the DSOs in <tt>/lib/i686</tt>,
71
versions 2.4.20 and younger will use the DSOs in
72
<tt>/lib/tls</tt>.</p>
74
<p>For the Red Hat releases this layout was chosen to provide
75
the maximum amount of backward compatibility for
76
<b>broken</b> applications (correctly written applications
77
have no problems anyway). The code in <tt>/lib</tt> consists
78
of the very early LinuxThreads code which had fixed size
79
threads which could not be placed by the application. The
80
version in <tt>/lib/i686</tt> is the LinuxThreads code which
81
does away with this limitation (aka floating stacks). The
82
code in <tt>/lib/tls</tt> is the new NPTL POSIX thread
88
<p>The fact that a DSO has a more stringent version
89
requirement does not mean it is automatically chosen. The
90
dynamic only rejects loading DSOs based on the version
91
information, it does not look for the best fit. The above
92
description is true because the dynamic linker always looks
93
in the directories <tt>/lib/tls</tt>, <tt>/lib/i686</tt>, and
94
<tt>/lib</tt> in this order. Why this is the case is
95
complicated and not explained here. Read the dynamic linker
100
<p>For architectures other than IA-32 the situation is
101
similar, but less complicated. In RHEL3 only two versions of
102
glibc are needed, one using LinuxThreads and one using NPTL.
103
The very old LinuxThreads code is not needed.</p>