使用 libc.so.6 捆绑 C++ 应用程序
Bundle c++ application using libc.so.6
我正在尝试使我的可执行文件在 linux 上可移植,为此我需要复制程序本身使用的所有共享库,以检查我需要使用哪个:
ldd program_name
程序的输出帮助我找到所有需要的 .so
,在这些库之间有:
libc.so.6 => /lib64/libc.so.6 (0x00007f5b61ac2000)
此时我将所有库复制到一个名为 shared_libs
的文件夹中,并将它们与程序一起发送到另一台电脑,当我这样做时出现了问题:
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
也会出现段错误。
如何捆绑我的应用程序?
编辑 1:为什么我不 link 静态化所有内容?
我试过了,唯一的问题就是头痛...
to do this i need to copy all the shared library used by the program itself
不,你不。特别是,复制 GLIBC 根本行不通(如您所见)。
您实际上需要的是针对足够旧的(不比您分发程序的任何系统新的)libc 构建您的程序,然后依赖于 GLIBC ABI 兼容性(这保证了 link 针对旧 GLIBC 编辑的程序在 运行 时间绑定到较新的 GLIBC 时继续 运行 正确。
这可以通过在旧系统上构建程序或使用 chroot
或构建 "linux to older linux" cross-compiler.
来实现
I'm pretty sure that libc.so.6 is causing the problem
正确。解释了这不起作用的原因,例如here.
问题是 GLIBC 由多个必须匹配的二进制文件组成。这些二进制文件之一(ld-linux
)的路径在静态 link 时间 hard-coded 进入程序,无法更改。
我正在尝试使我的可执行文件在 linux 上可移植,为此我需要复制程序本身使用的所有共享库,以检查我需要使用哪个:
ldd program_name
程序的输出帮助我找到所有需要的 .so
,在这些库之间有:
libc.so.6 => /lib64/libc.so.6 (0x00007f5b61ac2000)
此时我将所有库复制到一个名为 shared_libs
的文件夹中,并将它们与程序一起发送到另一台电脑,当我这样做时出现了问题:
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
也会出现段错误。
如何捆绑我的应用程序?
编辑 1:为什么我不 link 静态化所有内容?
我试过了,唯一的问题就是头痛...
to do this i need to copy all the shared library used by the program itself
不,你不。特别是,复制 GLIBC 根本行不通(如您所见)。
您实际上需要的是针对足够旧的(不比您分发程序的任何系统新的)libc 构建您的程序,然后依赖于 GLIBC ABI 兼容性(这保证了 link 针对旧 GLIBC 编辑的程序在 运行 时间绑定到较新的 GLIBC 时继续 运行 正确。
这可以通过在旧系统上构建程序或使用 chroot
或构建 "linux to older linux" cross-compiler.
I'm pretty sure that libc.so.6 is causing the problem
正确。解释了这不起作用的原因,例如here.
问题是 GLIBC 由多个必须匹配的二进制文件组成。这些二进制文件之一(ld-linux
)的路径在静态 link 时间 hard-coded 进入程序,无法更改。