gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:49:03 25 4
gpt4 key购买 nike

我试图让我的可执行文件在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com