gpt4 book ai didi

c - 静态库中的 Newlib stub

转载 作者:太空宇宙 更新时间:2023-11-04 08:15:57 24 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

重复库

要使其正常工作,您需要确保您的"new"静态库出现在链接器命令行中的 newlib(C 库)之后。 GCC 会在所有其他对象和库之后自动将 -lc 添加到链接器的命令行。但是,如果需要,您可以重复它们。

因此,假设您的库名为 mylibrary,您的应用程序和主文件名为 SO,像这样设置链接器选项将起作用:

gcc  -o SO ./src/SO.o -lc -lmylibrary

这在链接器上解析为(简化!):

ld -o SO ./src/SO.o -lc -lmylibrary -lc -lgcc

在设置中是这样的:

library settings

要获得正确的组合,您可能需要重复调​​整/添加。特别是如果“mylibrary”依赖于 newlib 的其他部分,而 newlib 又依赖于 mylibrary 的其他部分。

强制提前链接

另一种选择是确保 _sbrk 简单地在早期链接。这可以通过多种方式完成:

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

为什么?

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

关于c - 静态库中的 Newlib stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35784602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com