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

使专有ELF二进制文件在Linux上可移植,linux,shared-libraries,portability,elf,portable-applications,Linux,Shared Libraries,Portability,Elf,Portable Applications,我正在寻找一种方法,使现有的专有ELF二进制文件(它们与特定版本的系统库相链接)可移植。对于portable,我的意思是让可执行文件在具有相同处理器体系结构和兼容系统内核的每个系统上工作,而不一定要有库的源代码(如果没有源代码就没有办法,也可以) 到目前为止,我想到了两种可能性,但我不知道它们是否有可能,如果有,选择哪一种: 搜索所有链接库及其依赖项,并将它们包含在二进制文件的子目录中,并更改该目录的库路径 将库静态地重新链接到二进制文件中,使其成为一个大的可执行文件(如果程序没有基于校验和进行

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

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

  • 搜索所有链接库及其依赖项,并将它们包含在二进制文件的子目录中,并更改该目录的库路径
  • 将库静态地重新链接到二进制文件中,使其成为一个大的可执行文件(如果程序没有基于校验和进行自我验证)
  • 许可不是问题,因为我不想分发创建的便携程序,它仅供私人使用

    谢谢你的回答

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

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

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

    将库静态地重新链接到二进制文件中,使其成为一个大的可执行文件

    不能在AIX以外的任何UNIX系统上工作:它们都考虑<代码> A.OUT/<代码>和<代码> Fo.S/<代码>作为最终的链接产品,不能进一步链接。


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

    谢谢你详细的回答。今天晚些时候(GMT+1),我会尝试一下statifier,看看它是否能在某种程度上帮助我。statifier似乎没有那么好用,另外一个可以帮助我实现目标的软件(ermine)是专有的。但至少有一种方法可以实现我所想的。我试过貂皮,效果很好(使用试用版)||