2012-03-20 55 views
3

在我的项目链接过程中,除非我在我的代码中对某个存根函数(即_sbrk)进行显式调用,否则链接器将失败,并显示以下错误:newlibc stub应该如何包含/链接到代码中

c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libg.a(lib_a-abort.o): In function `abort': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\stdlib/../../../../../newlib-1.19.0/newlib/libc/stdlib/abort.c:63: undefined reference to `_exit' 
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libg.a(lib_a-signalr.o): In function `_kill_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:61: undefined reference to `_kill' 
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libg.a(lib_a-signalr.o): In function `_getpid_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:96: undefined reference to `_getpid' 
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libg.a(lib_a-sbrkr.o): In function `_sbrk_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/sbrkr.c:60: undefined reference to `_sbrk' 
collect2: ld returned 1 exit status 

我知道我需要一些存根函数的是Newlibc需要,我有一个“C”文件,该文件包含上文作为失踪提到的那些和我也正该文件被编译并添加到一个后来被链接的档案文件(* .a)。

我使用下面的命令

调用连接
arm-none-eabi-gcc -L -T linkerscript.ld -nostartfiles -Wl,-Map,$(TARGET).map -lc archive.a 

我的问题很简单(我希望)我怎样才能确保链接器链接我的存根功能为ELF文件,而不必做出明确函数调用从我的项目文件之一?

+0

链接顺序在这里是否像构建可执行文件一样重要?这些错误看起来像我在将库链接到可执行文件时出错的顺序。 – Mosby 2012-03-20 04:41:44

+0

@Mosby到目前为止,我发现解决该问题的唯一方法是通过显式调用其中一个存根函数。更改我的项目文件的链接顺序似乎对此问题没有影响 – maguirre 2012-03-20 04:46:54

回答

3

我认为你得到的这些错误是指链接器无法找到合适的库。我的第一个怀疑是你如何使用你的参数,特别是你的归档目录(-L)和archive.a文件的规格。我想应该是这样的:

arm-none-eabi-gcc -L. -T linkerscript.ld -nostartfiles -Wl,-Map,$(TARGET).map -lc -larchive 

,我会做的更改是:

  1. -L。表示使用当前目录查找要链接的库文件。
  2. -lc指定使用存档文件libc.a.
  3. -larchive指定使用归档文件libarchive.a。

欲了解更多信息,我建议查看GNU GCC reference

+0

我将尝试您的建议。同时你在哪里找到那个标志** - lc **我已经搜索了GCC参考,但是我在那里找不到它。即使Google在寻找gcc手册页-lc的位置方面也没有太大的帮助 – maguirre 2012-03-20 15:52:52

+0

@Mischief其实这个标志是-l,我假设你有一个名为libc.a的lib文件它并不是真正的变化,那是在你的问题的命令行中。 – spade78 2012-03-20 18:42:20

2

通过--verbosegcc来确切地看到archive.a显示在传递给链接器的库和对象的列表中。

你需要让archive.a之后libg.a搜索因为这包含结束了未定义的引用对象存档安排的事情。

您可能可以通过在gcc命令行上的archive.a之前添加-lg来解决此问题。 -lg应该在libg.a之前,现在默认情况下它已被拉入,更重要的是在archive.a之前拉入。