Ответ 1
Это помогает:
-mcpu = cortex-m4 -mthumb -specs = nano.specs -specs = nosys.specs -mfpu = fpv4-sp-d16 -mfloat-abi = hard
Важными переключателями "кажутся":
-specs = nano.specs -specs = nosys.specs
У меня проблема с _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, который должен быть добавлен в проект и скомпилирован для объекта файл и после этого связанный с исполняемым файлом вместе с другими объектами и библиотеки.
С наилучшими пожеланиями и большим успехом.
Это помогает:
-mcpu = cortex-m4 -mthumb -specs = nano.specs -specs = nosys.specs -mfpu = fpv4-sp-d16 -mfloat-abi = hard
Важными переключателями "кажутся":
-specs = nano.specs -specs = nosys.specs
Проблема имеет мало общего с _sbrk
, а ваша попытка напрямую вызвать компоновщик, минуя драйвер компилятора. Вместо этого используйте команду gcc для вызова компоновщика и синтаксиса -Wl,-linkeroptionhere
для передачи дополнительных параметров компоновщику.
Одно из возможных решений, если вы должны сами ссылаться на компоновщик. Попробуйте повторить как libc.a
, так и libgcc.a
второй раз в конце командной строки. Там также есть опция "как группа", которую вы можете использовать для достижения этой цели, но я не знаю ее сразу.
Недавно я также столкнулся с этим (снова). самым простым решением для меня было предоставление/перенаправление "malloc" и "free" apis на тот, который доступен из SDK, на котором я создавал свое приложение.
В основном это происходит из-за недостатка управления mem при соединении. как и в приведенном выше ответе, упоминается не то, что _sbrk здесь отсутствует. brk/sbrk syscall intenrally используется для управления кучей. следовательно, _sbrk, отсутствует ссылка, когда дело доходит до mem управления apis.
Я заметил, что добавление -lnosys (например, libnosys.a) также помогло этому в некоторой степени в некоторых интеграциях.