使用libc.so.6捆绑c ++应用程序

时间:2018-03-14 13:31:16

标签: c++ linux shared-libraries libc dynamic-library

我正在尝试使我的可执行文件在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:为什么我不静态链接所有内容?

我试过了,我唯一得到的就是头痛......

1 个答案:

答案 0 :(得分:3)

  

要做到这一点,我需要复制程序本身使用的所有共享库

不,你。特别是,复制GLIBC根本不起作用(正如您所发现的那样)。

实际所需要的是针对足够大的程序构建程序(不比你分发程序的任何系统更新)libc,然后依赖于GLIBC ABI兼容性(这保证了程序)链接旧GLIBC在运行时绑定到较新的GLIBC时继续正确运行。

这可以通过在旧系统上构建程序,或使用chroot,或构建“linux to old linux”交叉编译器来实现。

  

我很确定libc.so.6导致问题

正确。解释这不起作用的原因,例如here

问题是GLIBC由多个必须匹配的二进制文件组成。并且其中一个二进制文件的路径(ld-linux)在静态链接时被硬编码到程序中,无法更改。

相关问题