我遇到了_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.a和libgcc.a),它位于home / ziga / projects / cs_lite / arm-none-eabi文件夹中/ lib中/.
我一直在网上搜索_sbrk函数,它是某种内存管理调用,它不包含在标准C库中,因为它依赖于微处理器。所以我必须自己编写_sbrk函数吗?我该怎么做?你有arm926ej-s的例子吗?编写此函数后,我打算将其编译为目标文件,并将其与其他对象库连接在一起。
亲切的问候,Ziga。
我解决了这个问题并将在这里发布解决方案,所以我回馈一下 comunity。函数_sbrk位于ARM的NXP CDL包中。包 可以下载(链接适用于所有不知道这一点的人)这里: http://www.lpclinux.com/Downloads/WebHome 在子文件夹CDL_v005 / csps / lpc313x / bsps / ea3131 / source中,您将找到源文件 名为libnosys_gnu.c,应该添加到项目中并编译为对象 文件和之后链接到可执行文件以及其他对象和 库。
祝福和成功。
答案 0 :(得分:9)
这有助于:
-mcpu = cortex-m4 -mthumb -specs = nano.specs -specs = nosys.specs -mfpu = fpv4-sp-d16 -mfloat-abi = hard
重要的开关"似乎"是:
-specs = nano.specs -specs = nosys.specs
答案 1 :(得分:3)
这个问题与_sbrk
本身没什么关系,而是你试图直接调用链接器,绕过编译器驱动程序。相反,使用gcc命令调用链接器和-Wl,-linkeroptionhere
语法以将额外选项传递给链接器。
一种可能的解决方案,如果您必须自己调用链接器。请尝试在命令行末尾再次重复libc.a
和libgcc.a
。还有一些“as group”链接器选项可用于实现此目的但我不知道它。
答案 2 :(得分:2)
最近我也遇到了这个问题。对我有用的最简单的解决方案是提供/重定向" malloc"并且"免费" apis到我正在构建我的应用程序的SDK中可用的那个。
基本上是因为链接时缺少mem管理api。像上面的回答一样提到它并不是说_sbrk在这里特别缺失。 brk / sbrk syscall用于堆管理。因此_sbrk,在mem管理apis方面缺少链接。
我注意到在某些集成中添加-lnosys(即libnosys.a)也有助于达到某种程度。
答案 3 :(得分:2)
我遇到了同样的问题,将它们添加到链接器标志中有帮助:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https"
android:host="my.package.name" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="app"
android:host="my.package.name" />
</intent-filter>
此外,仅通过nosys.specs即可解决此问题,但是代码大小更大。
答案 4 :(得分:0)
使用visualgdb(使用gcc)和nanolib,我必须添加链接器标记
-specs=nosys.specs
答案 5 :(得分:0)
我解决了这个问题,并将在此处发布解决方案,以便回馈社区。函数 _sbrk
位于 ARM 的 NXP CDL 包内。软件包可供下载(链接适用于所有不知道的人) here 在子文件夹 CDL_v005/csps/lpc313x/bsps/ea3131/source
中,您将找到名为 libnosys_gnu.c
的源文件,应将其添加到项目并编译为目标文件,然后链接到可执行文件以及其他对象和库。
最良好的祝愿和很多成功。