Aaron 1 28 июля, 2011 Опубликовано 28 июля, 2011 · Жалоба В рамках изучения eclipse/gcc/make взял готовый проект для at91sam7s, переделал код под at91sam7a3, дописал нужные функции, добавил парочку сишных файлов, подключил библиотеку at91lib, makefile перековырял существенным образом - замесил вместе из родного проекта и другого, "универсального". Всякие простенькие проекты я уже научился компилировать, makefile вроде тоже теперь мне кажется роднее, чем непонятные кракозябры :) постоянно открыты маны по 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 :) Файлы flash-reset.s, makefile и ldscript-flash (на всякий случай) прикладываю. project_files.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Petka 0 29 июля, 2011 Опубликовано 29 июля, 2011 · Жалоба ... на этапе линковки вылазит совершенно непонятная мне ошибка. .... поменяйте в скрипте линкера строку ".text : { compile/obj/flash-reset.o(.text) *(.text) }" на ".text : { *flash-reset.o(.text) *(.text) }" и всё слинкуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 30 июля, 2011 Опубликовано 30 июля, 2011 · Жалоба Я так вроде пробовал - линкер тогда ругается, что не может найти файл flash-reset.o. На работе, конечно, ещё попробую так сделать, чтобы наверняка уже говорить, но имхо ошибка не в этом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Petka 0 30 июля, 2011 Опубликовано 30 июля, 2011 · Жалоба Я так вроде пробовал - линкер тогда ругается, что не может найти файл flash-reset.o. На работе, конечно, ещё попробую так сделать, чтобы наверняка уже говорить, но имхо ошибка не в этом. Я бы не посоветовал, если бы у меня это успешно не откомпилировалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 1 августа, 2011 Опубликовано 1 августа, 2011 · Жалоба поменяйте в скрипте линкера строку ".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):(.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 0 1 августа, 2011 Опубликовано 1 августа, 2011 · Жалоба Я ж в мейкфайле нигде не указывал использовать libc, почему он её всё равно линкует? Вот все флаги линкера, которые сейчас включены: Потому что это стандартная библиотека Си. Для отключения стандартной библиотеки есть ключик "-nostdlib" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться