9

运行 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段错误中以同样的方式尝试过的所有其他内容。来源有问题吗?我编译不正确吗?

另外值得注意的是,我为树莓派(ARM)下载了正确的版本(略新),对其进行了编译,并且没有段错误。

4

1 回答 1

11

这失败了:

$ ./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

于 2013-10-31T18:33:22.437 回答