linux - ld.so 替代品

标签 linux dynamic-linking

我需要让我的 linux 可执行文件“编译一次,随处运行”。理论上是可以的,因为我的程序只使用了非常基本的系统调用(网络IO和文件IO的系统调用)。实际上,这是一个不同的故事:

我的开发平台是 Ubuntu 12.04,它有最新的内核、glibc 和工具链。我首先尝试静态链接我的可执行文件,但可执行文件拒绝在 centos 5(内核版本 2.6.18)上运行。如果可执行文件是动态链接的,动态加载器 (ld.so) 将拒绝加载我的可执行文件。我什至尝试发布一个修改过的动态加载器(我修改它忽略内核版本),libc,libgcc_s,仍然不起作用,因为修改后的加载器总是尝试从系统加载 libc 并忽略随我一起发布的 libc可执行文件。

我需要一个动态加载器,它可以盲目地加载我想要它加载的所有内容。有人知道 linux 上的这种动态加载器吗?我不确定我的方向是否正确,欢迎提出任何建议。

最佳答案

请检查

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

在这个项目中,我使用了 patchElf、LD_PRELOAD 和 LD_LIBRARY_PATH。

有一些技巧可以使相对路径起作用。经过一些实验,我得出的结论是不需要修补目标二进制文件,因为 ld.so 可用于直接从命令行加载目标程序,例如:

$/lib64/ld-linux-x86-64.so.2 [选项]...可执行文件[ARGS-FOR-PROGRAM...]

在这种情况下,目标二进制文件的 elf header 中写入的解释器将被忽略,例如:

$ 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)

选项:

--库路径

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

我希望这可以帮助:)

关于linux - ld.so 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14576551/

相关文章:

linux - 无法CD进入具有755权限的目录吗?

ios - 函数 'dlopen()' 是私有(private) API 吗?

assembly - 编译错误 : relocation R_X86_64_PC32 against undefined symbol

linux - 在 TIME_WAIT 状态的套接字上接收数据

linux - 在管道 grep 到 grep 后保留颜色

linux - 匹配模式并删除模式之前的 3 行以及匹配的模式行

c - 如果链接了某些库,可能只包含标题?

c++ - 避免包装器 DLL 中的堆栈溢出

c++ - 在 visual studio 中构建 DLL 时使用静态库

linux - 监控服务器上的带宽