Undefined ссылка на _sbrk

У меня проблема с _sbrk. В фазе компоновки ссылок я использую ниже comand для ссылки на мои объекты, и я получаю ссылку undefined на _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/Library/.

Я искал интернет для функции _sbrk, и это какой-то вызов управления памятью, который не включен в стандартные библиотеки C, поскольку он зависит от микропроцессора. Су, мне нужно написать функцию _sbrk самостоятельно? Как мне это сделать? Есть ли у вас пример для arm926ej-s? После написания этой функции я собираюсь скомпилировать ее в объектный файл и связать ее вместе с другими объектами, библиотеками.

С уважением, Зига.


Я решил эту проблему и разместил решение здесь, поэтому я возвращаю распространяемый. Функция _sbrk находится внутри пакета NXP CDL для ARM. пакет доступен для скачивания (ссылка предназначена для всех, кто этого не знает): http://www.lpclinux.com/Downloads/WebHome В подпапке CDL_v005/csps/lpc313x/bsps/ea3131/source вы найдете исходный файл named libnosys_gnu.c, который должен быть добавлен в проект и скомпилирован для объекта файл и после этого связанный с исполняемым файлом вместе с другими объектами и библиотеки.

С наилучшими пожеланиями и большим успехом.

Ответ 1

Это помогает:

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

Важными переключателями "кажутся":

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

Ответ 2

Проблема имеет мало общего с _sbrk, а ваша попытка напрямую вызвать компоновщик, минуя драйвер компилятора. Вместо этого используйте команду gcc для вызова компоновщика и синтаксиса -Wl,-linkeroptionhere для передачи дополнительных параметров компоновщику.

Одно из возможных решений, если вы должны сами ссылаться на компоновщик. Попробуйте повторить как libc.a, так и libgcc.a второй раз в конце командной строки. Там также есть опция "как группа", которую вы можете использовать для достижения этой цели, но я не знаю ее сразу.

Ответ 3

Недавно я также столкнулся с этим (снова). самым простым решением для меня было предоставление/перенаправление "malloc" и "free" apis на тот, который доступен из SDK, на котором я создавал свое приложение.

В основном это происходит из-за недостатка управления mem при соединении. как и в приведенном выше ответе, упоминается не то, что _sbrk здесь отсутствует. brk/sbrk syscall intenrally используется для управления кучей. следовательно, _sbrk, отсутствует ссылка, когда дело доходит до mem управления apis.

Я заметил, что добавление -lnosys (например, libnosys.a) также помогло этому в некоторой степени в некоторых интеграциях.