Newlib存根在静态库中

时间:2016-03-03 22:47:39

标签: c linker eclipse-cdt newlib sbrk

我正在使用Eclipse开发裸机应用程序。我链接到newlib,所以我提供了自己的_sbrk()实现。这个功能通常包含在我的项目中,一切都运行良好。

现在我尝试将此函数移动到我过去几个月开发的静态库中。

在关联期间,我收到undefined reference to _sbrk错误。该文件所在的路径已正确包含在Eclipse设置中(同一目录中的其他文件已正确链接)。

显然,链接器通过我的代码的顺序存在一些问题,并且此函数被丢弃。

我尝试使用__attribute__((used)),但没有运气。

如何通过Eclipse设置克服此问题?(基于Makefile或命令行编译不是我需要的解决方案)。

2 个答案:

答案 0 :(得分:1)

重复图书馆

为了让这个工作,你需要确保你的"新"在连接器的命令行中,newlib(C库)之后出现静态库。在所有其他对象和库之后,GCC将自动将-lc添加到链接器的命令行。但是,如果需要,您可以重复使用它们。

因此假设您的库名为mylibrary,您的应用程序和主文件名为SO,设置链接器选项就像这样:

gcc  -o SO ./src/SO.o -lc -lmylibrary

这解决了链接器上的这个(简化!):

ld -o SO ./src/SO.o -lc -lmylibrary -lc -lgcc

在设置中,这看起来像:

library settings

要获得正确的组合,您可能需要稍微调整/添加重复。特别是如果" mylibrary"然后依赖于newlib的其他部分,而这些部分又取决于mylibrary的其他部分。

强制链接早期

另一种方法是确保_sbrk只是提前链接。这可以通过多种方式完成:

  • 在链接描述文件中添加依赖项
  • 从直接传递给GCC的目标文件中添加_sbrk。例如。:
    • 从本身未使用的extern(即未优化的)函数调用_sbrk
    • 在c文件中取_sbrk的地址
    • 添加_sbrk对程序集文件的引用,如果空间紧张,可能在一个不会在目标上结束的部分

为什么?

你不知道为什么会发生这种情况,但是对于其他任何想知道这里有一个很好的问答的读者:Why does the order in which libraries are linked sometimes cause errors in GCC?了解有关订单重要性的更多细节。

答案 1 :(得分:1)

我解决了我的问题,只需将以下代码添加到我的链接器脚本中即可。

GROUP(
   libgcc.a
   libg.a
   libc.a
   libm.a
   libnosys.a
 )

这样,在任何设置或发出的链接器命令中都不需要更改。