Jump to content

    
Sign in to follow this  
Aaron

Сборка проекта с помощью makefile

Recommended Posts

В рамках изучения 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

Share this post


Link to post
Share on other sites
... на этапе линковки вылазит совершенно непонятная мне ошибка.

....

поменяйте в скрипте линкера строку

".text : { compile/obj/flash-reset.o(.text) *(.text) }"

на

".text : { *flash-reset.o(.text) *(.text) }"

 

и всё слинкуется.

Share this post


Link to post
Share on other sites

Я так вроде пробовал - линкер тогда ругается, что не может найти файл flash-reset.o. На работе, конечно, ещё попробую так сделать, чтобы наверняка уже говорить, но имхо ошибка не в этом.

Share this post


Link to post
Share on other sites
Я так вроде пробовал - линкер тогда ругается, что не может найти файл flash-reset.o. На работе, конечно, ещё попробую так сделать, чтобы наверняка уже говорить, но имхо ошибка не в этом.

Я бы не посоветовал, если бы у меня это успешно не откомпилировалось.

Share this post


Link to post
Share on other sites
поменяйте в скрипте линкера строку

".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)

Share this post


Link to post
Share on other sites
Я ж в мейкфайле нигде не указывал использовать libc, почему он её всё равно линкует? Вот все флаги линкера, которые сейчас включены:

Потому что это стандартная библиотека Си.

Для отключения стандартной библиотеки есть ключик "-nostdlib"

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this