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

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

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

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

许可证没有问题,因为我不想分发创建的便携式程序,它仅供私人使用.

谢谢你的回答.

解决方法

Searching all linked libraries and their dependencies and include them in a subdirectory of the binary and changing the Library-Path to that directory.

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

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

Relinking the libraries statically into the binary file to one big executable.

这不适用于AIX以外的任何UNIX系统:它们都认为a.out和foo.so是最终的链接产品,无法进一步链接.

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

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...