2012-05-02 37 views
4

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

请注意,两台计算机都有x86-64处理器。而且,这两台电脑都安装了gcc 4.4。尽管未运行的计算机也安装了除gcc 4.4之外的gcc 4.1.2。然而,其中一个运行的是Ubuntu 10.04(我编译的地方),另一个运行的是CentOS 5.这是导致分段故障的原因吗?我怎么解决这个问题?请注意,我在CentOS 5的计算机上没有管理权限。

+3

请注意,使用'LD_PRELOAD',您不必修改标准库,就可以创建一个新库来替换标准库中的一些函数。这可能更容易。 –

+2

你可以在gdb中运行它来获得回溯?在gdb提示符下使用'set environment LD_PRELOAD = blah'。 – Tobu

回答

2

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

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

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

如果LD_PRELOAD库包括只有你确实需要覆盖的符号,并将其推翻的最低金额可能的(例如,如果可能的话,重写的功能),那么你的图书馆有机会较高便携式。

有关如何操作的示例,请参阅(例如)fakeroot。 (a)你做了一件非常奇怪的事情;但是,如果你正在改变很多libc,你唯一的选择就是重写所有的libc,那么(a) (b)您可能要使用LD_LIBRARY_PATH,而不是LD_PRELOAD;详情请参阅ld.so(8) manpage

1

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