运行Ubuntu 10.04
$ uname -a Linux minion 2.6.32-36-generic-pae #79-Ubuntu SMP Tue Nov 8 23:25:26 UTC 2011 i686 GNU/Linux
下载源代码并执行以下操作:
CFLAGS="-O2 -U_FORTIFY_SOURCE -fno-stack-protector" '/home/user/Desktop/eglibc-2.11.1/configure' --prefix='/home/user/Desktop/eglibc_pristinebuild' make -j4 export LD_LIBRARY_PATH=/lib/tls/i686/cmov:/lib:/usr/lib
这工作:
$ ./elf/ld-linux.so.2 /bin/ls /usr bin games include lib lib64 local sbin share src
这失败了:
$ ./elf/ld-linux.so.2 /bin/true Segmentation fault
但是这个工作:
/lib/ld-linux.so.2 /bin/true
False
, grep
和cat
以及其他所有我在/bin
segfault中以相同方式尝试过的东西。 源代码有问题吗? 我编译不正确?
另外值得注意的是,我为树莓派(ARM)下载了正确的版本(稍微更新),编译了它,并且没有段错误。
这失败了:
$ ./elf/ld-linux.so.2 /bin/true Segmentation fault
这完全是预期的结果。
GLIBC由〜200个独立的文件组成,它们必须完全匹配(必须来自同一个版本),因为它们之间使用了未版本化的二进制接口。
运行./elf/ld-linux.so.2 /bin/true
,您正在使用自己的ld-linux
版本,但是系统版本的libc.so.6
不是来自您的版本。
你可以通过使用以下来确认事实:
LD_DEBUG=files,libs ./elf/ld-linux.so.2 /bin/true
(这将证明正在使用/lib/libc.so.6
)。
你可以通过使用例如
./elf/ld-linux.so.2 --library-path . /bin/true
然后使用./libc.so.6