链接器忽略库链接
Posted
技术标签:
【中文标题】链接器忽略库链接【英文标题】:linker ignores library linking 【发布时间】:2020-02-15 23:37:54 【问题描述】:我有一个简单的链接器脚本,用于链接 armv7 处理器。我还不需要 libc,所以它并没有真正链接进去。但是现在当我尝试编译一些 C 源代码时,我遇到了对 memset 的未定义引用,该引用应该在编译器附带的 libc.a 中。
所以我所做的是ld -Llib -lc
(我将 libc 移到项目的 lib 文件夹中)。它仍然给了我对 memset 的未定义引用。
接下来我直接指定使用 libc.a 与 INPUT(libc.a) 链接,但我仍然得到未定义的引用。
最终起作用的是ld $(objects) lib/libc.a
,并且将其链接起来没问题。我看了反汇编,一切都很好,它使用了 memset。
谁能给我解释一下这里发生了什么,我对所有这些东西还是陌生的:)
【问题讨论】:
@Someprogrammerdude 你可以假设它是 $(Objects) 【参考方案1】:我找到了解决方案,并且对于所有刚接触 armv7 编程的人来说都很有趣。
首先,即使链接正常,您最终也会进入 HardFault 处理程序,因为 ld 将使用不是为 thumb 构建的 libgcc。
解决方案: 代替链接器 (ld) 使用 gcc,例如
arm-none-eabi-gcc -T linker.ld -O1 -nostartfiles -mthumb -o bin/prog.elf src/obj/boot.o src/obj/stm32f746_startup.o
这里非常重要的是-mthumb
,因此您的链接器会选择正确的 libc/libgcc,或者使用 thumb 编译您自己的 libc 并将其与 ld 链接。
【讨论】:
以上是关于链接器忽略库链接的主要内容,如果未能解决你的问题,请参考以下文章
用于匹配链接忽略查询中的 href 的 Jquery 选择器
linux ldconfig命令的作用(Linker Configuration 链接器配置)更新动态链接库(共享库)的链接器程序缓存