复制glibc库

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的计算机上拥有管理员权限。

3
请注意,使用 LD_PRELOAD,您不必修改标准库,只需创建一个新的库来替换标准库中的一些函数即可。这可能更容易实现。 - Dietrich Epp
2
你可以在gdb中运行它以获取回溯吗?在gdb提示符下使用set environment LD_PRELOAD=blah - Tobu
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) manpage

1

很可能你的libc在内核版本之间不可移植。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接