4

我下载了 glibc 源代码,修改了标准库的某些部分,然后LD_PRELOAD将修改后的标准库(以 .so 文件的形式)用于我的程序。但是,当我将该文件复制.so到另一台计算机并尝试在那里运行相同的程序LD_PRELOAD时,我遇到了分段错误。

请注意,两台计算机都有 x86-64 处理器。此外,两台计算机都安装了 gcc 4.4。虽然没有运行它的计算机除了 gcc 4.4 之外还安装了 gcc 4.1.2。但是,一个运行的是 Ubuntu 10.04(我在其中编译),而另一个运行的是 CentOS 5。这是分段错误的原因吗?我怎么解决这个问题?请注意,我在装有 CentOS 5 的计算机上没有管理权限。

4

2 回答 2

2

当您 LD_PRELOAD C 库时,我相信您除了加载默认 C 库之外还加载了它。当它们是完全相同的版本时,所有符号都匹配,并且您的符号优先。所以它有效。当它们是不同的版本时,您可能会在每个符号的基础上混合使用。

此外,NSS(名称服务开关,例如 /etc/nsswitch.conf 中的所有内容)API也不稳定。这些模块与主 libc.so 是分开的,但在程序(例如,执行用户 ID 到用户名映射)时会动态加载。加载错误的版本(因为你复制了 libc.so )会做各种各样的坏事。

此外,Ubuntu 可能正在使用 eglibc 和 CentOS glibc。因此,您可能正在查看 glibc 的不同分支。

如果您的 LD_PRELOAD 库包含您实际需要覆盖的符号,并将它们覆盖到可能的最小数量(例如,如果可能,调用被覆盖的函数),那么您的库具有更高的可移植性。

有关如何执行此操作的示例,请参阅(例如)fakeroot

如果你对 libc 进行了如此多的更改,以至于你唯一的选择就是覆盖所有它,那么(a)你正在做一些非常奇怪的事情;(b) 你可能想使用LD_LIBRARY_PATH,而不是LD_PRELOAD;有关详细信息,请参见ld.so(8) 联机帮助页

于 2012-05-03T18:05:50.423 回答
1

您的 libc 可能无法在内核版本之间移植。

于 2012-05-02T18:47:59.707 回答