0

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

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

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

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

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

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

4

2 回答 2

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从直接传递给 GCC 的目标文件中添加使用。例如:
    • _sbrk从本身未使用的外部(即未优化)函数调用
    • _sbrkac文件中的地址
    • 添加_sbrk对程序集文件的引用,如果空间紧张,可能会在不会出现在目标上的部分中

为什么?

您不是在问为什么会发生这种情况,但是对于任何其他想知道的读者来说,这里有一个很好的问答:为什么链接库的顺序有时会导致 GCC 中的错误?有关订单为何重要的更多详细信息。

于 2016-03-04T19:30:18.700 回答
1

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

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

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

于 2016-03-06T16:56:31.227 回答