Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сборка проекта с помощью makefile
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Aaron
В рамках изучения eclipse/gcc/make взял готовый проект для at91sam7s, переделал код под at91sam7a3, дописал нужные функции, добавил парочку сишных файлов, подключил библиотеку at91lib, makefile перековырял существенным образом - замесил вместе из родного проекта и другого, "универсального". Всякие простенькие проекты я уже научился компилировать, makefile вроде тоже теперь мне кажется роднее, чем непонятные кракозябры sm.gif постоянно открыты маны по gcc, as и ld.
Дак вот, в этом проекте все необходимые мне файлы компилируются в объектники (или я всего лишь ошибочно так пологаю), а на этапе линковки вылазит совершенно непонятная мне ошибка. Вот лог из консоли эклипса (неинтересные моменты я удалил):
Цитата
mingw32-make build
--- compiling fromflash.c
--- compiling bootrom.c
--- compiling globals.c
--- compiling usb.c
--- compiling swTimer.c
--- assembling flash-reset.s
--- linking Objects to ELF file...
arm-kgp-eabi-gcc ./compile/obj/fromflash.o ./compile/obj/bootrom.o ./compile/obj/globals.o ./compile/obj/usb.o ./compile/obj/swTimer.o ./compile/obj/flash-reset.o -mcpu=arm7tdmi -mthumb -nostartfiles -Wl,-Map="./compile/lst/BootLoaderROM_FLASH.map" -Wl,-Map="./compile/lst/BootLoaderROM_FLASH.map",--cref,--gc-sections -lgcc -lc -lm -Tldscript-flash -o "./compile/exe/BootLoaderROM_FLASH.elf"
compile/obj/flash-reset.o: In function `start':
E:\work\workspace\Bootloader\bootrom/flash-reset.s:9: multiple definition of `start'
./compile/obj/flash-reset.o:E:\work\workspace\Bootloader\bootrom/flash-reset.s:9: first defined here

compile/obj/flash-reset.o: In function `CallRam':
E:\work\workspace\Bootloader\bootrom/flash-reset.s:39: multiple definition of `CallRam'
./compile/obj/flash-reset.o:E:\work\workspace\Bootloader\bootrom/flash-reset.s:39: first defined here

collect2: ld returned 1 exit status
mingw32-make: *** [compile/exe/BootLoaderROM_FLASH.elf] Error 1

То есть при линковке мне говорят, что в файле flash-reset.s ссылка уже была определена, первичное её положение в этом же файле flash-reset.s sm.gif
Файлы flash-reset.s, makefile и ldscript-flash (на всякий случай) прикладываю.
Petka
Цитата(Aaron @ Jul 28 2011, 11:29) *
... на этапе линковки вылазит совершенно непонятная мне ошибка.
....

поменяйте в скрипте линкера строку
".text : { compile/obj/flash-reset.o(.text) *(.text) }"
на
".text : { *flash-reset.o(.text) *(.text) }"

и всё слинкуется.
Aaron
Я так вроде пробовал - линкер тогда ругается, что не может найти файл flash-reset.o. На работе, конечно, ещё попробую так сделать, чтобы наверняка уже говорить, но имхо ошибка не в этом.
Petka
Цитата(Aaron @ Jul 30 2011, 13:14) *
Я так вроде пробовал - линкер тогда ругается, что не может найти файл flash-reset.o. На работе, конечно, ещё попробую так сделать, чтобы наверняка уже говорить, но имхо ошибка не в этом.

Я бы не посоветовал, если бы у меня это успешно не откомпилировалось.
Aaron
Цитата(Petka @ Jul 29 2011, 19:16) *
поменяйте в скрипте линкера строку
".text : { compile/obj/flash-reset.o(.text) *(.text) }"
на
".text : { *flash-reset.o(.text) *(.text) }"
и всё слинкуется.

Спасибо, помогло.
Теперь встал следующий вопрос при компиляции. Использую библиотеку функций at91lib, в частности файл stdio.c оттуда же.
Цитата
--- linking Objects to ELF file...
c:/devtools/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.6.0/../../../../arm-kgp-eabi/lib/thumb\libc.a(lib_a-impure.o)sad.gif.data._impure_ptr+0x0): multiple definition of `_impure_ptr'
./compile/obj/stdio.o:(.data._impure_ptr+0x0): first defined here

Я ж в мейкфайле нигде не указывал использовать libc, почему он её всё равно линкует? Вот все флаги линкера, которые сейчас включены:
Цитата
linker_flags = -mcpu=$(mcu)
linker_flags += -mthumb
linker_flags += -nostartfiles # from at91lib makefile
linker_flags += $(optimization)
linker_flags += -Wl # from at91lib makefile
linker_flags += -Map="$(mapfile)"
linker_flags += -T$(ld_script)
Petka
Цитата(Aaron @ Aug 1 2011, 16:47) *
Я ж в мейкфайле нигде не указывал использовать libc, почему он её всё равно линкует? Вот все флаги линкера, которые сейчас включены:

Потому что это стандартная библиотека Си.
Для отключения стандартной библиотеки есть ключик "-nostdlib"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.