Как заглушки newlibc должны быть включены / связаны в свой код - PullRequest
3 голосов
/ 20 марта 2012

Во время процесса компоновки моего проекта компоновщик не работает со следующими ошибками, если я не сделаю в своем коде явный вызов одной из функций-заглушек (т. Е. _Sbrk):

c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libg.a(lib_a-abort.o): In function `abort':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\stdlib/../../../../../newlib-1.19.0/newlib/libc/stdlib/abort.c:63: undefined reference to `_exit'
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libg.a(lib_a-signalr.o): In function `_kill_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:61: undefined reference to `_kill'
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libg.a(lib_a-signalr.o): In function `_getpid_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/signalr.c:96: undefined reference to `_getpid'
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.19.0/newlib/libc/reent/sbrkr.c:60: undefined reference to `_sbrk'
collect2: ld returned 1 exit status

Я знаю, что яМне нужны некоторые функции-заглушки, которые требуются newlibc, и у меня есть файл "C", который содержит все упомянутые выше как отсутствующие, и я также уверен, что файл компилируется и добавляется в файл архива (* .a), который будет позже.связаны между собой.

Я звоню компоновщику, используя следующие команды

arm-none-eabi-gcc -L -T linkerscript.ld -nostartfiles -Wl,-Map,$(TARGET).map -lc archive.a

Мой вопрос прост (надеюсь) Как я могу убедиться, что компоновщик связывает мои функции-заглушки в файл elf, не имеясделать явный вызов функции из одного из моих файлов проекта?

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Я думаю, что те ошибки, которые вы получаете, относятся к компоновщику, который не может найти подходящую библиотеку.Мое первое подозрение в том, как вы используете ваши аргументы, в частности, вашу спецификацию архивной директории (-L) и файла archive.a.Я думаю, что это должно выглядеть так:

arm-none-eabi-gcc -L. -T linkerscript.ld -nostartfiles -Wl,-Map,$(TARGET).map -lc -larchive

, где я внесу следующие изменения:

  1. -L. означает использование текущегокаталог для поиска файлов библиотеки для ссылки.
  2. -lc указывает на использование файла архива libc.a.
  3. -larchive указывает на использованиеархивный файл libarchive.a.

Для получения дополнительной информации я бы предложил проверить ссылку GNU GCC .

2 голосов
/ 20 марта 2012

Передайте --verbose в gcc, чтобы точно определить, где archive.a отображается в списке библиотек и объектов, переданных компоновщику.

Вам нужно упорядочить вещи таким образом, чтобы поиск archive.a осуществлялся после libg.a, поскольку это архив, содержащий объекты, которые заканчиваются неопределенными ссылками.

Выможно исправить это, добавив -lg перед archive.a в командной строке gcc.-lg должен быть на libg.a раньше, чем там, где он по умолчанию втягивается, и, что еще важнее, вытянуть его до archive.a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...