【问题标题】:ld.so alternativesld.so 替代品
【发布时间】:2013-03-18 18:38:12
【问题描述】:

我需要让我的 linux 可执行文件“编译一次,到处运行”。理论上这是可能的,因为我的程序只使用非常基本的系统调用(网络 IO 和文件 IO 的系统调用)。在实践中,情况就不同了:

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

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

【问题讨论】:

  • 你试过musl-libc.org 吗?它可能会解决问题(但可能不会);如果有,请告诉我们...
  • 您是否也尝试过strace Centos 5 上静态链接程序的失败执行?你会更好地理解失败的原因......
  • 我看过glibc的源码,静态链接的libc会检查运行内核的版本,如果运行内核版本过低直接退出。
  • 刚刚检查了 musl-libc。这来自其官方常见问题解答:“目前,一些 glibc 链接的共享库可以使用 musl 加载,但是如果将 musl 放入 /lib/ld-linux 的位置,除了最简单的 glibc 链接的应用程序之外的所有应用程序都会失败。所以.2."。基本上这意味着我需要针对 musl-libc 构建 libstdc++,因为我的程序是用 C++ 编写的。没有找到太多关于“musl libstdc++组合”稳定性的资料。

标签: linux dynamic-linking


【解决方案1】:

请检查

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

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

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

$ /lib64/ld-linux-x86-64.so.2 [选项]... 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)

选项:

--库路径

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

我希望这可以帮助:)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不想用centos 5作为开发机,太老了,不适合日常使用。也不喜欢在centos 5上构建并在另一个上调试,不方便。
    • 您绝对可以在您的开发机器上的 chroot-ed 环境中安装 centos 5。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 2011-06-10
      • 2014-04-18
      • 2012-04-08
      • 2012-07-09
      • 2011-03-31
      • 2023-03-12
      • 2017-02-26
      相关资源
      最近更新 更多