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

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

我试图让我的可执行文件在 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 也会给出 seg 错误。

我如何捆绑我的应用程序?

编辑 1:为什么我不静态链接所有内容?

我试过了,唯一的问题就是头痛......

最佳答案

to do this i need to copy all the shared library used by the program itself

不,你。特别是,复制 GLIBC 根本行不通(如您所见)。

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

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

I'm pretty sure that libc.so.6 is causing the problem

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

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

关于c++ - 使用 libc.so.6 捆绑 C++ 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49279087/

相关文章:

c++ - 同时重新排序和旋转图像的高效方法

linux - bash shell sys.path.append 问题

c - 使用 __attribute__ ((section "STACK")) 将变量准确地放在 ("STACK"部分中可能有什么意义?

c++ - 捆绑动态库 : keep looking in the usr/local/lib

c++ - 无法调用基类函数

c++ - 将输入的 char* 拆分为 vector

c++ - QKeySequence 到 QKeyEvent

linux - 带有 TileGX 工具链和 LTO 的 LLVM 3.3 不工作

c - 多处理器系统上的线程

java - 在 Java 项目中使用 Kotlin 库作为依赖项