在Linux上制作可移植的专有ELF二进制文件
问题描述:
我正在寻找一种方法来制作与特定版本的系统库链接的现有专有ELF二进制文件。对于可移植性,我的意思是使每个系统具有相同的处理器架构和兼容的系统内核的可执行文件,而不必拥有这些库的源代码(如果没有源代码就没有办法,那也可以) 。在Linux上制作可移植的专有ELF二进制文件
到目前为止,我想到了两种可能性,但我不知道他们是否在所有可能的,如果是,可供选择:
- 搜索所有链接库和他们的依赖,并将其包含在二进制文件的子目录并将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,它确实创建了一个动态的(巨大)静态可执行文件。我没有使用它的经验。
http://*.com/questions/2157636 | http://*.com/questions/16250831 | http://*.com/questions/15386027 – 2015-06-04 16:00:14