复制glibc库

时间:2012-05-02 18:22:56

标签: c linux gcc x86-64 glibc

我下载了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的计算机没有管理权限。

2 个答案:

答案 0 :(得分:2)

当你LD_PRELOAD C库时,我相信除了默认的C库之外你还要加载它。如果它们是完全相同的版本,则所有符号都匹配,并且您的符号优先。所以它有效。当它们的版本不同时,您可能会按照每个符号进行混合。

此外,NSS(名称服务开关,例如来自/etc/nsswitch.conf的所有内容)API 不稳定。这些模块与主libc.so分开,但是当程序例如用户id为用户名映射时动态加载。加载错误的版本(因为您复制了libc.so)会造成各种不良。

此外,Ubuntu可能正在使用eglibc和CentOS glibc。所以你可能正在寻找一个不同的glibc分支。

如果你的LD_PRELOAD库只包含 你实际需要覆盖的符号,并将它们覆盖到尽可能少的数量(例如,如果可能的话,调用被覆盖的函数),那么你的库有一个< em>很多更高的便携性。

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

如果你改变了很多libc,你唯一的选择是覆盖所有这些,那么(a)你做的事情很奇怪; (b)您可能想要使用LD_LIBRARY_PATH,而不是LD_PRELOAD;有关详细信息,请参阅ld.so(8) manpage

答案 1 :(得分:1)

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