簡體   English   中英

對 _sbrk 的未定義引用

[英]Undefined reference to _sbrk

我遇到了_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.alibgcc.a ,它位於文件夾home/ziga/projects/cs_lite/arm-none-eabi/lib/ .

我一直在互聯網上搜索_sbrk函數,它是某種內存管理調用,它不包含在標准 C 庫中,因為它依賴於微處理器。 那么我必須自己編寫_sbrk函數嗎? 我該怎么做? 你有arm926ej-s 的例子嗎? 寫完這個函數后,我打算將它編譯成一個對象文件,並將它與其他對象、庫鏈接在一起。

這有助於:

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

重要的開關“似乎”是:

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

我遇到了同樣的問題,將這些添加到鏈接器標志有幫助:

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

此外,僅使用 nosys.specs 修復了該問題,但代碼大小要大得多。

問題與_sbrk本身_sbrk ,而是您嘗試直接調用鏈接器,繞過編譯器驅動程序。 相反,使用 gcc 命令調用鏈接器和-Wl,-linkeroptionhere語法將額外選項傳遞給鏈接器。

一種可能的解決方案,如果您必須自己調用鏈接器。嘗試在命令行末尾libc.a重復libc.alibgcc.a 還有一些“作為組”鏈接器選項可以用來實現這一點,但我不知道它馬上。

最近我也遇到了這個(再次)。 對我有用的最簡單的解決方案是提供/重定向“malloc”和“免費”apis到我構建應用程序的SDK中可用的api。

基本上這是因為鏈接時缺少內存管理 API。 就像上面的答案提到的不是 _sbrk 在這里特別丟失。 brk/sbrk 系統調用內部用於堆管理。 因此,當涉及到內存管理 API 時,_sbrk 缺少鏈接。

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

使用visualgdb(使用gcc)和nanolib,我不得不添加鏈接器標志

-specs=nosys.specs

我解決了這個問題,並將在此處發布解決方案,以便我回饋社區。 _sbrk函數位於 ARM 的 NXP CDL 包內。 包可供下載(鏈接是所有誰不知道這已經)在這里的子文件夾CDL_v005/csps/lpc313x/bsps/ea3131/source ,你會發現源文件名為libnosys_gnu.c這應該被添加到該項目,並編譯成目標文件,然后鏈接到可執行文件以及其他對象和庫。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM