Неопределенная ссылка на _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, поэтому я думаю, что выбрал правильную мультибиблиотеку (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, который следует добавить в проект и скомпилировать в объектный файл, а затем связать с исполняемым файлом вместе с другими объектами и библиотеками.

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

6 ответов

Решение

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

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

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

-mcpu = cortex-m4 -mthumb -specs = nano.specs -specs = nosys.specs -mfpu = fpv4-sp-d16 -mfloat-abi = жесткий

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

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

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

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

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

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

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

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

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

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

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

-specs=nosys.specs
Другие вопросы по тегам