Перейти к содержанию
    

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... на этапе линковки вылазит совершенно непонятная мне ошибка.

....

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

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

на

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...