【问题标题】:Newlib stubs in static library静态库中的 Newlib 存根
【发布时间】:2016-03-03 22:47:38
【问题描述】:

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

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

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

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

我尝试使用__attribute__((used)),但没有成功。

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

【问题讨论】:

    标签: c linker eclipse-cdt newlib sbrk


    【解决方案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 只是在早期链接。这可以通过多种方式完成:

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

    为什么?

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

    【讨论】:

      【解决方案2】:

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

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

      这种方式不需要更改任何设置或发出的链接器命令。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-18
        相关资源
        最近更新 更多