繁体   English   中英

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

How can I link libc.a into a shared library in arm-linux use arm-none-linux-gnueabi-gcc

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

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

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

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

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

但我总是得到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重定位。

有没有人有这个想法?

谢谢你。

1 个回复

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

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

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

5 如何将libc.a链接到共享库

我有一个名为nvdebug.so的共享库,它是编译的结果。 我想要与libc.a链接的.so文件 尽管我搜索了几乎所有的Google网站,但找不到解决方案。 我认为“-整体存档”命令是最合适的解决方法。 如果运行良好,则必须增加nvdebug.so文件的大小,但效果不佳。 ...

8 移植到ARM-LINUX

我正在尝试将应用程序移植到ARM_LINUX平台。 我已将所有交叉编译的库复制到目标。 程序启动并崩溃。 我正在使用gdb进行远程调试。 有两件事, 在调用库函数时,返回值为-1,因此程序以gdb退出代码0377终止。 我插入了断点并使用了回溯,但都无济于事,或 ...

9 arm-linux-gnueabi-gcc找不到库

我正在尝试在狗仔队自动驾驶环境中使用支持ARM Mali GPU的OpenGL ES编译ac程序。 我已经从Mali SDK编译了libGLESv2库,并且一切正常。 现在,我正在尝试让交叉编译器找到这样的库,但是它说: 我试图添加-v选项来检查库路径,它说: 我已将libG ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM