C 链接器忽略库链接

C 链接器忽略库链接,c,linker,C,Linker,我有一个简单的链接器脚本,用于链接armv7处理器。我还不需要libc,所以它并没有真正的链接。但现在当我试图编译一些C源代码时,我遇到了对memset的未定义引用,这些引用应该在编译器附带的libc.a中 所以我所做的是ld-Llib-lc(我把libc移到了project的lib文件夹中)。它仍然给了我对memset的未定义引用 接下来,我直接指定在与输入(libc.a)的链接中使用libc.a,但仍然得到未定义的引用 最后起作用的是ld$(objects)lib/libc.a,链接它没有问

我有一个简单的链接器脚本,用于链接armv7处理器。我还不需要libc,所以它并没有真正的链接。但现在当我试图编译一些C源代码时,我遇到了对memset的未定义引用,这些引用应该在编译器附带的libc.a中

所以我所做的是
ld-Llib-lc
(我把libc移到了project的lib文件夹中)。它仍然给了我对memset的未定义引用

接下来,我直接指定在与输入(libc.a)的链接中使用libc.a,但仍然得到未定义的引用

最后起作用的是
ld$(objects)lib/libc.a
,链接它没有问题。我看了反汇编,一切都很好,它使用了memset


有人能给我解释一下这里发生了什么吗,我对所有这些东西都还不熟悉:)

我找到了解决方案,对所有刚接触armv7编程的人来说都很有趣

首先,即使它链接良好,您也会在HardFault处理程序中结束,因为ld将使用不是为thumb构建的libgcc

解决方案: 例如,使用gcc代替链接器(ld)

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链接。

@Someprogrammerdude您可以假设它是$(Objects)