Как правильно делать ссылки только на символы

Я предполагаю, что это продолжение этого вопрос. Я скомпилировал свою промежуточную библиотеку загрузчика и проверил ее работу, теперь пришло время написать для нее код приложения.

Я могу создать список символов из сгенерированного загрузчиком файла .hex, используя $(OBJCOPY) --wildcard --strip-symbol=main --strip-symbol="_*" $(TARGET).elf $(TARGET).syms, это дает мне bootloader.syms.

Я написал тестовое приложение, которое использует несколько функций из библиотечного раздела памяти, и я скомпилировал его следующим образом:

Я передаю GCC расположение всех файлов заголовков, используемых в загрузчике/библиотеке, а также файл символов, сгенерированный выше. Я проверил, что GCC берет файлы заголовков, как и предполагалось.

Вызов Makefile:

 Making:  obj/main.o
avr-gcc -Os -std=gnu99 -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -static -DF_CPU=8000000UL -DBAUD= -iquote../firmware/src/ -I. -I../firmware/src/ -MP -MD -mmcu=atmega16 -c -o obj/main.o src/main.c;
avr-gcc -Wl,-Map,app.map -Wl,--just-symbols=../firmware/bootloader.syms -T ld_script_app.x -mmcu=atmega16 obj/main.o  -o app.elf
obj/main.o: In function `main':
main.c:(.text.startup.main+0x14): undefined reference to `lcd_init'
main.c:(.text.startup.main+0x8e): undefined reference to `lcd_fill'
main.c:(.text.startup.main+0x142): undefined reference to `gfx_draw_line'
collect2: error: ld returned 1 exit status
make: *** [app.elf] Error 1

Я не уверен, что вызывает неопределенные ссылки. У меня сложилось впечатление, что на них будут ссылаться через файл символов.


person lberezy    schedule 19.10.2015    source источник


Ответы (1)


Недавно у меня заработала сборка прошивки из двух частей. См. этот вопрос и мой ответ на вопрос о том, как я это сделал: Создание образа встроенного ПО, состоящего из двух частей, с помощью набора инструментов GCC. Ваши вопросы здесь помогли встать на правильный путь - спасибо! - но было довольно много шагов, необходимых, чтобы сделать это правильно.

Я предполагаю, что неопределенные ссылки, которые вы получаете, относятся к функциям, которые находятся в исходном коде загрузчика, но фактически не используются в загрузчике. Таким образом, компоновщик не включает их в готовый образ загрузчика. Когда вы пытаетесь связать свое приложение, они недоступны ни в main.o, ни в bootloader.syms, поэтому они отображаются как неопределенные ссылки.

Если это так, есть несколько способов справиться с этим:

  1. Попробуйте заставить компоновщик сохранить эти символы в образе загрузчика, даже если они не используются. Я думаю, что есть несколько способов сделать это.

  2. Переместите эти функции в отдельные исходные файлы и встройте их в приложение.

  3. Предоставьте объектные файлы для загрузчика при связывании приложения. Порядок в командной строке компоновщика имеет значение, поэтому, если они предоставлены последними, их следует использовать только для предоставления любых функций, которые еще не были определены предыдущими входными данными.

person Martin L    schedule 10.02.2016