我正在使用Eclipse开发裸机应用程序。我链接到newlib,所以我提供了自己的_sbrk()实现。这个功能通常包含在我的项目中,一切都运行良好。
现在我尝试将此函数移动到我过去几个月开发的静态库中。
在关联期间,我收到undefined reference to _sbrk
错误。该文件所在的路径已正确包含在Eclipse设置中(同一目录中的其他文件已正确链接)。
显然,链接器通过我的代码的顺序存在一些问题,并且此函数被丢弃。
我尝试使用__attribute__((used))
,但没有运气。
如何通过Eclipse设置克服此问题?(基于Makefile或命令行编译不是我需要的解决方案)。
答案 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
在设置中,这看起来像:
要获得正确的组合,您可能需要稍微调整/添加重复。特别是如果" mylibrary"然后依赖于newlib的其他部分,而这些部分又取决于mylibrary的其他部分。
另一种方法是确保_sbrk
只是提前链接。这可以通过多种方式完成:
_sbrk
。例如。:
_sbrk
_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
)
这样,在任何设置或发出的链接器命令中都不需要更改。