使专有的ELF二进制文件在Linux上可移植

时间:2013-03-13 12:58:07

标签: linux shared-libraries portability elf portable-applications

我正在寻找一种方法来制作现有的专有ELF二进制文件,这些文件链接到特定版本的系统库,可移植。使用便携式,我的意思是使可执行程序在具有相同处理器体系结构和兼容系统内核的每个系统上工作,而不必具有库的源代码(如果没有源代码就没有办法,它也会很好)

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

  1. 搜索所有链接库及其依赖项,并将它们包含在二进制文件的子目录中,并将Library-Path更改为该目录。
  2. 将库静态地重新链接到二进制文件中,转换为一个大的可执行文件(如果程序没有根据校验和进行验证)。
  3. 许可不是问题,因为我不想分发创建的便携式程序,它只供私人使用。

    感谢您的回答。

1 个答案:

答案 0 :(得分: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.outfoo.so最终链接产品,无法链接任何进一步的。

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