复制 glibc 库

标签 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 的计算机上没有管理权限。

最佳答案

当您 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了解详情。

关于复制 glibc 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419489/

相关文章:

linux - 使用 SSH key 使用 "sudo su - username"切换用户

c++ - 哈希符号 + 数字 "# 1"形式的 gcc 预处理输出行是什么意思?

Python到C的转换,将csv的列读入数组

c - 当用户未给出大小时求数组的总和,

c - 为什么执行时显示为82? For 循环 - 阶乘

ruby-on-rails - 最喜欢的 Linux 版 Ruby/Rails IDE

c - 静态链接 OpenSSL 正在尝试加载 DLL

linux - 如何向 bash 脚本添加线程?

macos - 在 Mac 上的 Matlab 中使用 mex 进行 Openmp

Codeblocks 在 Linux Mint 中不打印任何内容