8

我正在寻找一种方法来使现有的专有 ELF 二进制文件(与特定版本的系统库链接)具有可移植性。对于可移植,我的意思是使可执行文件在具有相同处理器架构和兼容系统内核的每个系统上工作,而不必拥有库的源代码(如果没有源代码就没有办法,那也可以) .

到目前为止,我想到了两种可能性,但我不知道它们是否完全有可能,如果有,应该选择哪一种:

  1. 搜索所有链接库及其依赖项,并将它们包含在二进制文件的子目录中,并将 Library-Path 更改为该目录。
  2. 将库静态重新链接到二进制文件到一个大的可执行文件(如果程序不根据校验和验证自己)。

许可不是问题,因为我不想分发创建的可移植程序,它仅供私人使用。

感谢您的回答。

4

1 回答 1

6

搜索所有链接库及其依赖项,并将它们包含在二进制文件的子目录中,并将 Library-Path 更改为该目录。

这适用于大多数共享库,但不适用于libc.so.6(如果您的目标系统没有足够新的版本,这是最有可能出现问题的库)。

原因:glibc 由 200 多个独立的共享库组成,它们之间有未版本化的二进制接口,并且它们之间没有稳定的 ABI。因此, glibc 的所有部分都必须来自同一个构建。其中之一是libc.so.6. 另一个是ld-linux.so. 后者的绝对路径被硬编码到每个动态可执行文件中。最终结果:如果您提供自己的 副本libc.so.6,并且如果该副本与系统上存在的不匹配/lib/ld-linux*.so.2,那么您将看到非常奇怪的崩溃,您将很难解释或调试。

将库静态重新链接到二进制文件到一个大的可执行文件。

这在 AIX 以外的任何 UNIX 系统上都无法工作:它们都认为a.out并且foo.so最终的链接产品,无法进一步链接。

存在statifier,它确实从一个动态的可执行文件中创建了一个(巨大的)静态可执行文件。我没有使用它的经验。

于 2013-03-18T02:16:33.513 回答