我正在尝试使我的可执行文件在linux上可移植,为此我需要复制程序本身使用的所有共享库,以检查我需要使用哪一个:
ldd program_name
该程序的输出帮助我找到所有必需的.so
,这些库之间有:
libc.so.6 => /lib64/libc.so.6 (0x00007f5b61ac2000)
此时我将所有库复制到一个名为shared_libs
的文件夹中,并将它们与程序一起发送到另一台PC,当我这样做时会出现问题:
LD_LIBRARY_PATH=./shared_libs ./program_name
给出:
[1] 4619 segmentation fault (core dumped) LD_LIBRARY_PATH=./shared_libs ./program_name
我很确定libc.so.6会导致问题,因为如果我这样做:
LD_LIBRARY_PATH=./shared_libs ls
只有shared_libs文件夹中的那个库,ls
也会出现seg错误。
我如何捆绑我的申请?
编辑1:为什么我不静态链接所有内容?
我试过了,我唯一得到的就是头痛......
答案 0 :(得分:3)
要做到这一点,我需要复制程序本身使用的所有共享库
不,你不。特别是,复制GLIBC根本不起作用(正如您所发现的那样)。
你实际所需要的是针对足够大的程序构建程序(不比你分发程序的任何系统更新)libc,然后依赖于GLIBC ABI兼容性(这保证了程序)链接旧GLIBC在运行时绑定到较新的GLIBC时继续正确运行。
这可以通过在旧系统上构建程序,或使用chroot
,或构建“linux to old linux”交叉编译器来实现。
我很确定libc.so.6导致问题
正确。解释这不起作用的原因,例如here
问题是GLIBC由多个必须匹配的二进制文件组成。并且其中一个二进制文件的路径(ld-linux
)在静态链接时被硬编码到程序中,无法更改。