19

我遇到了问题_sbrk。在编译的链接阶段,我使用下面的命令来链接我的对象,我得到未定义的引用_sbrk

arm-none-eabi-ld -static -T linkerscript.ld -o exe timer_example.o /home/ziga/projects/cs_lite/arm-none-eabi/lib/libc.a /home/ziga/projects/cs_lite/lib/gcc/arm-none-eabi/4.5.1/libgcc.a

我正在为arm926ej-s和 ARM 模式编译,所以我认为我选择了正确的 multilib ( libc.aand libgcc.a),它位于文件夹中home/ziga/projects/cs_lite/arm-none-eabi/lib/

我一直在互联网上搜索_sbrk功能,它是某种内存管理调用,它不包含在标准 C 库中,因为它依赖于微处理器。那么我必须自己编写_sbrk函数吗?我该怎么做?你有arm926ej-s 的例子吗?编写此函数后,我打算将其编译为目标文件并将其与其他对象、库链接在一起。

4

6 回答 6

19

这有助于:

-mcpu=cortex-m4 -mthumb -specs=nano.specs -specs=nosys.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard

重要的开关“似乎”是:

-specs=nano.specs -specs=nosys.specs

于 2017-01-09T19:46:21.957 回答
8

我遇到了同样的问题,将这些添加到链接器标志有助于:

-specs=nano.specs -specs=nosys.specs

此外,仅使用 nosys.specs 解决了该问题,但代码大小要大得多。

于 2018-11-14T13:34:25.403 回答
3

这个问题与_sbrk它本身没什么关系,而是你尝试直接调用链接器,绕过编译器驱动程序。相反,使用 gcc 命令调用链接器和-Wl,-linkeroptionhere将额外选项传递给链接器的语法。

一种可能的解决方案,如果您必须自己调用链接器。尝试在命令行末尾重复两次libc.a和第二次。libgcc.a还有一些“作为组”链接器选项可以用来实现这一点,但我不知道它马上。

于 2011-04-23T15:53:07.723 回答
2

最近我也遇到了这个(再次)。对我有用的最简单的解决方案是将“malloc”和“免费”api 提供/重定向到我在其上构建应用程序的 SDK 中可用的 API。

基本上它是因为链接时缺少内存管理 api 而发生的。就像上面的答案提到它并不是这里特别缺少 _sbrk 。brk/sbrk 系统调用内部用于堆管理。因此 _sbrk 缺少关于内存管理 API 的链接。

我注意到添加 -lnosys(即 libnosys.a)在某些集成中也在一定程度上有所帮助。

于 2016-03-11T07:56:52.197 回答
2

使用visualgdb(使用gcc)和nanolib,我必须添加链接器标志

-specs=nosys.specs
于 2019-02-24T10:11:45.833 回答
1

我解决了这个问题,并将在此处发布解决方案,以便我回馈社区。该函数_sbrk位于 ARM 的 NXP CDL 包内。包可供下载(链接适用于所有不知道的人) 在这里的子文件夹中CDL_v005/csps/lpc313x/bsps/ea3131/source,您将找到名为的源文件libnosys_gnu.c,该文件应添加到项目中并编译为目标文件,然后链接到可执行文件以及其他对象和库。

最良好的祝愿和很多成功。

于 2021-04-22T16:41:58.910 回答