ld.so 替代方案

7
我需要让我的Linux可执行文件“一次编译,到处运行”。理论上是可能的,因为我的程序只使用非常基本的系统调用(网络IO和文件IO的系统调用)。但实际情况则不同:
我的开发平台是Ubuntu 12.04,它有相当新的内核、glibc和工具链。我首先尝试静态链接我的可执行文件,但该可执行文件拒绝在CentOS 5(内核版本2.6.18)上运行。如果可执行文件是动态链接的,则动态加载器(ld.so)拒绝加载我的可执行文件。我甚至尝试提供一个修改过的动态加载器(我将其修改为忽略内核版本)、libc、libgcc_s,仍然不起作用,因为修改后的加载器总是试图从系统中加载libc并忽略与我的可执行文件一起提供的libc。
我需要一个动态加载器,可以盲目地加载我想要加载的所有内容。有人知道在Linux上这样的动态加载器吗?我不确定自己是否朝着正确的方向前进,所以欢迎任何建议。

1
你尝试过 http://musl-libc.org/ 吗?它也许能解决这个问题(但也可能不行);如果可以,告诉我们... - Basile Starynkevitch
你是否尝试过在Centos 5上对静态链接程序的失败执行进行“strace”调试?这样做会更清楚地了解问题所在。 - Basile Starynkevitch
我已经阅读了glibc的源代码,静态链接的libc将检查运行内核的版本,如果运行内核版本太低,则会简单地退出。 - user416983
1
刚刚检查了musl-libc。这是它的官方FAQ:”目前,一些与glibc链接的共享库可以在musl中加载,但是,如果将musl投入/lib/ld-linux.so.2的位置,则除最简单的glibc链接应用程序外,所有其他应用程序都会失败。“ 基本上意味着我需要针对musl-libc构建libstdc ++,因为我的程序是用C++编写的。还没有找到有关“musl libstdc ++组合”的稳定性的太多信息。 - user416983
3个回答

5

请检查

http://sourceforge.net/projects/html5remote/

在这个项目中,我使用了patchElf、LD_PRELOAD和LD_LIBRARY_PATH。有一些技巧可以让相对路径工作。经过一些实验,我得出的结论是不需要对目标二进制文件进行修补,因为ld.so可以直接从命令行加载目标程序,例如: $ /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]
在这种情况下,目标二进制文件中写入elf头的解释器被忽略,例如: $ ldd /usr/bin/mysql
    linux-vdso.so.1 =>  (0x00007fff3fde0000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f72f89ea000)
    libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f72f87a8000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f72f8590000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f72f838c000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f72f8090000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f72f7cd0000)
    /original/path/to/ld.so (0x00007f72f9187000) ** ignored **
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f72f7aa9000)

选项:

--library-path

告诉ld.so加载器在哪里搜索共享库(例如:libc.so等)

希望这可以帮到您:)


3
尝试使用CentOS 5作为您的构建机,并在较新的平台上运行该可执行文件,而不是采取相反的方式。

2
我不想使用CentOS 5作为开发机器,因为它对日常使用来说太过陈旧。同时,我也不喜欢在CentOS 5上构建并在其他机器上进行调试,这样很不方便。 - user416983
2
你绝对可以在你的开发机上安装CentOS 5,使用chroot环境。 - Basile Starynkevitch


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