我正在使用Eclipse开发裸金属应用程序。我链接到newlib,所以我提供了自己的_sbrk()实现。这个功能通常包含在我的项目中,而且一切都很好。
现在我尝试将这个函数移到我在过去几个月中开发的静态库中。
在链接期间,我得到一个undefined reference to _sbrk错误。文件所在的路径正确地包含到Eclipse设置中(同一目录中的其他文件正确链接)。
显然,链接器通过我的代码的顺序有一些问题,这个函数被丢弃了。
我试着使用__attribute__((used)),没有运气。
如何通过设置来克服这个问题?(基于Makefile或命令行编译不是我需要的解决方案)。
发布于 2016-03-04 19:30:18
重复图书馆
要使其工作,您需要确保在链接器的命令行中的newlib (C库)之后出现“新”静态库。GCC将在完成所有其他对象和库之后,自动将-lc添加到链接器的命令行。然而,如果需要的话,您可以让它们重复。
因此,假设您的库名为mylibrary,并且您的应用程序和主文件被调用为SO,那么像这样设置链接器选项就可以了:
gcc -o SO ./src/SO.o -lc -lmylibrary这解决了这个问题(简化了!)在链接器上:
ld -o SO ./src/SO.o -lc -lmylibrary -lc -lgcc在这些设置中,这看起来是:

为了得到正确的组合,您可能需要调整/添加一些重复。特别是如果" mylibrary“依赖于newlib的其他部分,而这些部分又依赖于mylibrary的其他部分。
力连接早
另一种选择是确保_sbrk在早期链接。可以通过多种方式做到这一点:
_sbrk的使用。例如:_sbrk_sbrk的地址_sbrk引用添加到程序集文件中,如果空间紧张,则可能在不以目标结束的部分中进行。
为什么?
您不是在问为什么会发生这种情况,但是对于任何其他想知道这里有一个好的Q&A:Why does the order in which libraries are linked sometimes cause errors in GCC?的读者来说,有关订单为什么重要的更多细节。
发布于 2016-03-06 16:56:31
我通过在链接器脚本中添加以下代码解决了我的问题。
GROUP(
libgcc.a
libg.a
libc.a
libm.a
libnosys.a
)这样,在任何设置或发出的链接器命令中,都不会发生更改。
https://stackoverflow.com/questions/35784602
复制相似问题