gpt4 book ai didi

linux - 如何将 libc.a 链接到 arm-linux 中的共享库中使用 arm-none-linux-gnueabi-gcc

转载 作者:IT王子 更新时间:2023-10-29 00:39:18 26 4
gpt4 key购买 nike

在一个项目中,我的同事创建了一个静态库,例如 liba.a,它与应用程序链接。

在 liba.a 中,他将 libc malloc() 覆盖为他的所有者版本。

我创建了一个共享库 libs.so,它也与应用链接。

问题是当我的 libs.so 与应用程序链接时,我的 libs.so 中使用的 malloc() 将是 liba.a 中的那个,不是标准 libc.so 中的那个,这会导致问题。

然后,我想将 libc.a 静态链接到我的 libs.so,我为 gcc 使用了 -static -shared -fPIcflags。

但我总是得到 arm-2012.03/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.3/../../../../arm-none-linux- gnueabi/bin/ld: arm-2012.03/bin/../arm-none-linux-gnueabi/libc/usr/lib/libc.a(dl-tsd.o)(.text+0x14): 不允许 R_ARM_TLS_LE32 重定位在共享对象中。

有人知道吗?

感谢转发。

最佳答案

你不能,因为共享库中的代码必须用 -fPIC 编译,而静态库中的代码则不需要。如果你设法做到了,生成的可执行文件将最终与 libc 链接多次,无论如何它都非常脆弱并且可能迟早会崩溃,所以你无论如何都不应该这样做。因此:

不要。动态库必须动态链接到系统库,链接到任何动态库的任何可执行文件也必须动态链接到系统库。

我还想提醒您,将 GNU libc 静态链接到非 GPL 应用程序是非法的,因为 LGPL 仅排除动态链接代码。这是为了允许在不重新编译源可能不可用的可执行文件的情况下修复库错误。在 Linux 中,在不重新编译依赖的可执行文件的情况下升级具有错误修复版本的共享库是相当普遍的; libc 开发人员知道如何做到这一点。

关于linux - 如何将 libc.a 链接到 arm-linux 中的共享库中使用 arm-none-linux-gnueabi-gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12401347/

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