Неопределенная ссылка на _sbrk - PullRequest
13 голосов
/ 23 апреля 2011

У меня проблема с _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, поэтому я думаю, что выбрал правильную мультибиблиотеку (libc.a и libgcc.a), которая находится в папке home / ziga / projects / cs_lite / arm-none-eabi /lib/.

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

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


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

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

Ответы [ 5 ]

9 голосов
/ 09 января 2017

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

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

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

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

3 голосов
/ 23 апреля 2011

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

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

2 голосов
/ 14 ноября 2018

У меня была такая же проблема, и добавление их в флаги компоновщика помогло:

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

Кроме того, только с nosys.specs исправлена ​​проблема, но размер кода был намного больше.

2 голосов
/ 11 марта 2016

недавно я тоже столкнулся с этим (снова). самое простое решение, которое работало для меня, состояло в том, чтобы предоставить / перенаправить «malloc» и «бесплатный» apis к тому, что доступно в SDK, на котором я собирал свое приложение.

В основном это происходит из-за отсутствия управления файлами при подключении. Как и в предыдущем ответе, упомянуто не то, что _sbrk специально отсутствует здесь. Системный вызов brk / sbrk специально используется для управления кучей. отсюда _sbrk, недостающее звено, когда дело доходит до управления записью mem.

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

0 голосов
/ 24 февраля 2019

с visualgdb (используя gcc) и nanolib, мне пришлось добавить флаг компоновщика

-specs=nosys.specs
...