复制glibc库

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

请注意,这两台计算机都有x86-64处理器。 而且,两台电脑都安装了gcc 4.4。 虽然没有运行的电脑也安装了gcc 4.1.2,除了gcc 4.4。 然而,一个正在运行的Ubuntu 10.04(我编译),而另一个正在运行CentOS 5.这是分段错误的原因? 我怎么解决这个问题? 请注意,我在CentOS 5上没有电脑的pipe理权限。

当你LD_PRELOAD C库,我相信你加载它,除了默认的C库。 当它们是完全相同的版本时,所有符号都匹配,并且您的优先权。 所以它的工作。 当他们是不同的版本,你可能有一个混合,在每个符号的基础上。

另外,NSS(名称服务交换机,例如来自/etc/nsswitch.conf的所有东西)API 不稳定 。 这些模块与主libc.so是分开的,但是当一个程序例如用户id到用户名映射时被动态加载。 加载错误的版本(因为你拷贝了libc.so)会造成各种不好的结果。

此外,Ubuntu可能使用eglibc和CentOS glibc。 所以你可以看看glibc的另一个分支。

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

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

如果你正在改变这么多的libc,你唯一的选择就是覆盖所有的libc,那么(a)你正在做一些非常奇怪的事情; (b)你可能想要使用LD_LIBRARY_PATH ,而不是LD_PRELOAD ; 有关详细信息,请参阅ld.so(8)联机帮助页 。

内核版本之间很可能是不可移植的。