首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态库中的Newlib存根

静态库中的Newlib存根
EN

Stack Overflow用户
提问于 2016-03-03 22:47:38
回答 2查看 1.1K关注 0票数 0

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

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

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

显然,链接器通过我的代码的顺序有一些问题,这个函数被丢弃了。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-04 19:30:18

重复图书馆

要使其工作,您需要确保在链接器的命令行中的newlib (C库)之后出现“新”静态库。GCC将在完成所有其他对象和库之后,自动将-lc添加到链接器的命令行。然而,如果需要的话,您可以让它们重复。

因此,假设您的库名为mylibrary,并且您的应用程序和主文件被调用为SO,那么像这样设置链接器选项就可以了:

代码语言:javascript
复制
gcc  -o SO ./src/SO.o -lc -lmylibrary

这解决了这个问题(简化了!)在链接器上:

代码语言:javascript
复制
ld -o SO ./src/SO.o -lc -lmylibrary -lc -lgcc

在这些设置中,这看起来是:

为了得到正确的组合,您可能需要调整/添加一些重复。特别是如果" mylibrary“依赖于newlib的其他部分,而这些部分又依赖于mylibrary的其他部分。

力连接早

另一种选择是确保_sbrk在早期链接。可以通过多种方式做到这一点:

  • 在链接器脚本中添加依赖项
  • 从直接传递给GCC的对象文件中添加_sbrk的使用。例如:
    • 从未使用的外部函数(即未优化的out)调用_sbrk
    • 在c文件中获取_sbrk的地址
    • _sbrk引用添加到程序集文件中,如果空间紧张,则可能在不以目标结束的部分中进行。

为什么?

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

票数 1
EN

Stack Overflow用户

发布于 2016-03-06 16:56:31

我通过在链接器脚本中添加以下代码解决了我的问题。

代码语言:javascript
复制
GROUP(
   libgcc.a
   libg.a
   libc.a
   libm.a
   libnosys.a
 )

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35784602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档