yanvasilij 0 27 ноября, 2015 Опубликовано 27 ноября, 2015 · Жалоба Доброго времени суток! Пытаюсь собрать из скомпилинных объектников статическую либу следующим образом: arm-none-eabi-gcc -mcpu=cortex-m3 -mlittle-endian -mthumb -Wl,--gc-section -L _output/system_stm32f4xx.o (тут много много объектников) _output/beremizProcess.o _output/startup_stm32f407xx.o -o _output/beremizStm32Port.a -lstdc++ Получаю сообщение .\beremizStm32Port/./source/src/main.cpp:39: undefined reference to `initBeremizProcess()' Но дело в том, что эту функцию я хотел реализовать уже в приложении, которое будет использовать эту библиотеку. Что я делаю неправильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 27 ноября, 2015 Опубликовано 27 ноября, 2015 · Жалоба Либы собираются другой программой, arm-none-eabi-ar. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yanvasilij 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Либы собираются другой программой, arm-none-eabi-ar. Спасибо! Сегодня наконец-то добрался до этого и попробовал. Получилось слинковать библиотеку. В нее я добавил все общие для моего проекта файлы в том числе и файлы startup_stm32f407xx.s, system_stm32f4xx.c и syscalls.c: arm-none-eabi-ar -q -o _output/libBeremizStm32Port.a _output/system_stm32f4xx.o _output/syscalls.o _output/startup_stm32f407xx.o ...далее длинный список всех остальных объектников для библиотеки... Далее попытался собрать уже приложение с иcпользованием этой библиотеки. Если я правильно понял, то при линковке нужно исключить из названия преффикс lib и расширение файла: "arm-none-eabi-gcc" "D:\_tmp\_beremiz2\build\plc_common_main.o" ...Все мои объектники для приложения... -o "D:\_tmp\_beremiz2\build\_beremiz2.elf" -L C:\Beremiz\beremiz\targets\STM32\port\BeremizStm32Port -mcpu=cortex-m3 -mlittle-endian -mthumb -Wl,--gc-section -T C:\Beremiz\beremiz\targets\STM32\port\STM32F407ZG_FLASH.ld В ответ на это он мне пишет: c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol Reset_Handler; defaulting to 08000000 c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-sbrkr.o): In function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk' Я не понимаю: то что он просит реализовано в startup_stm32f407xx.s и syscalls.c. Так почему же он не вытащил их из библиотеки? Что я делаю неправильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Radmir 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба наверно забыл добавить что-то типа " --specs=nosys.specs" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Далее попытался собрать уже приложение с иcпользованием этой библиотеки. Если я правильно понял, то при линковке нужно исключить из названия преффикс lib и расширение файла: Я просто в команде линкеру добавлял к списку объектников библиотечный файл: arm-none-eabi-gcc mylib.a main.o -o main.elf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба Либы собираются другой программой, arm-none-eabi-ar. Если включено LTO, то arm-none-eabi-ar не канает. Приходится использовать arm-none-eabi-gcc-ar. Коллега недавно по этим граблям прошёл и тоже при допиливании beremiz))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба Спасибо, запомню на будущее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yanvasilij 0 14 января, 2016 Опубликовано 14 января, 2016 · Жалоба Если включено LTO, то arm-none-eabi-ar не канает. Приходится использовать arm-none-eabi-gcc-ar. Коллега недавно по этим граблям прошёл и тоже при допиливании beremiz))) Спасибо! Еще идиотский вопрос: А что такое LTO? Оно включается передачей параметра линковщику? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 15 января, 2016 Опубликовано 15 января, 2016 · Жалоба https://gcc.gnu.org/wiki/LinkTimeOptimization Эта опция и компилятора и линкера. ... CFLAGS += -flto ... ALL_CFLAGS += $(CFLAGS) ... $(OBJDIR)/%.o : %.c makefile @echo $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ $(TARGET).elf: $(OBJ) | sizebefore @echo $(MSG_LINKING) $@ $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yanvasilij 0 31 марта, 2016 Опубликовано 31 марта, 2016 · Жалоба Снова вернулся к попыткам собрать статическую либу. Проблема так и не решилась. Достоверно выяснилось следующее: 1) Когда я добавляю syscalls.o в статическую библиотеку вместе со всем остальным, то при компиляции приложения с использованием этой либы вылазит ошибка: c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-abort.o): In function `abort': abort.c:(.text.abort+0xa): undefined reference to `_exit' c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk' c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_kill_r': signalr.c:(.text._kill_r+0xe): undefined reference to `_kill' c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_getpid_r': signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid' c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-writer.o): In function `_write_r': writer.c:(.text._write_r+0x10): undefined reference to `_write' c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-closer.o): In function `_close_r': closer.c:(.text._close_r+0xc): undefined reference to `_close' c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-fstatr.o): In function `_fstat_r': fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat' c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-isattyr.o): In function `_isatty_r': isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty' c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-lseekr.o): In function `_lseek_r': lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek' c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-readr.o): In function `_read_r': readr.c:(.text._read_r+0x10): undefined reference to `_read' collect2.exe: error: ld returned 1 exit status Но все перечисленные функции реализованы в syscalls.c! Почему он их не видит?! 2) Когда я исключаю из библиотеки syscalls.o и приликовываю ее на этапе компиляции приложения вместе с библиотекой, все компилируется без ошибок и прекрасно работает. Компилирую arm-none-eabi-gcc, линкую либу arm-none-eabi-gcc-ar, линкую приложение arm-none-eabi-gcc. Флаги следующие: #common flags SET(COMMON_FLAGS "-mthumb") SET(COMMON_FLAGS "${COMMON_FLAGS} -Wall") SET(COMMON_FLAGS "${COMMON_FLAGS} -mcpu=cortex-m3") SET(COMMON_FLAGS "${COMMON_FLAGS} -mlittle-endian") #common compiler flags SET(COMMON_CFLAGS "-D USE_STDPERIPH_DRIVER") SET(COMMON_CFLAGS "${COMMON_CFLAGS} -D USE_STDPERIPH_DRIVER") SET(COMMON_CFLAGS "${COMMON_CFLAGS} -D STM32F429_439xx") #SET(COMMON_CFLAGS "${COMMON_CFLAGS} --specs=rdimon.specs") #SET(COMMON_CFLAGS "${COMMON_CFLAGS} -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group") #c-files compiler flags SET(CMAKE_C_FLAGS "${COMMON_FLAGS} ${COMMON_CFLAGS}" CACHE INTERNAL "c compiler flags") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") #cpp-files compiler flags SET(CMAKE_CXX_FLAGS "${COMMON_FLAGS} ${COMMON_CFLAGS}" CACHE INTERNAL "cxx compiler flags") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics") #linker flags SET(CMAKE_EXE_LINKER_FLAGS "${COMMON_FLAGS}" CACHE INTERNAL "exe link flags") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-section") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ./linkScript/STM32F407ZG_FLASH.ld") Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 31 марта, 2016 Опубликовано 31 марта, 2016 · Жалоба Попробуйте поменять очерёдность включения библиотек, как ни странно, но это роялит... Также хочу подметить, что я никогда не линкую syscalls.o вручную, а использую механизм спецификаций: LDFLAGS += --specs=nano.specs LDFLAGS += --specs=nosys.specs Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yanvasilij 0 1 апреля, 2016 Опубликовано 1 апреля, 2016 · Жалоба Попробуйте поменять очерёдность включения библиотек, как ни странно, но это роялит... Также хочу подметить, что я никогда не линкую syscalls.o вручную, а использую механизм спецификаций: LDFLAGS += --specs=nano.specs LDFLAGS += --specs=nosys.specs При включении этих флагов файл syscalls.c не нужен ни при компиляции ни при линковке? А ретаргет на printf, fprinf и т.п. будет работать при этом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 1 апреля, 2016 Опубликовано 1 апреля, 2016 · Жалоба При включении этих флагов файл syscalls.c не нужен ни при компиляции ни при линковке?Да не нужен. А ретаргет на printf, fprinf и т.п. будет работать при этом?У меня вроде как всё работает. Я в отдельном файле имею: //============================================================================= int __is_used fputc(int c, FILE* stream) { dbg_putchar(c, stream); return (c); } //============================================================================= int __is_used _write(int file, char *ptr, int len) { (void)file; while (len--) { dbg_putchar(*ptr++, debug_stream); } return len; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 4 апреля, 2016 Опубликовано 4 апреля, 2016 (изменено) · Жалоба 1) Когда я добавляю syscalls.o в статическую библиотеку вместе со всем остальным, то при компиляции приложения с использованием этой либы вылазит ошибка: c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-abort.o): In function `abort': abort.c:(.text.abort+0xa): undefined reference to `_exit' Но все перечисленные функции реализованы в syscalls.c! Почему он их не видит?! Покажите полностью команду, которая завершается приведенными Вами выше ошибками. Покажите также (для полноты понимания ситуации) вывод команд: objdump -a <ваша библиотека> | grep syscalls nm <ваша библиотека> | grep _exit Попробуйте поменять очерёдность включения библиотек, как ни странно, но это роялит... Ничего странного в этом нет. Если Вы при линковке, к примеру, сначала укажете библиотеку с файлом syscalls.o, на символы которого ссылок нет, то линкер, естественно, syscalls.o из библиотеки не загрузит. А потом Вы, допустим, укажете фйл, ссылающийся на что-то из syscalls.o - и, естественно, получите ошибку "символ не определен". Точно так же очевидно, что если Вы поменяете местами этот файл с библиотекой, ошибки не будет, так как на момент чтения библиотеки у линкера уже будет неопределенная ссылка, скажем, на тот же _exit, и линкер разрешит ее загрузкой syscalls.o из библиотеки. Изменено 4 апреля, 2016 пользователем alx2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 4 апреля, 2016 Опубликовано 4 апреля, 2016 · Жалоба Ничего странного в этом нет.Возможно и нет, но я бы делал иначе (в два прохода, чтобы исключить подобную ситуацию на корню). Ага! Есть такой способ: -Wl,--start-group .... ... ... .... ... -Wl,--end-group --start-group archives --end-group The archives should be a list of archive files. They may be either explicit file names, or `-l' options. The specified archives are searched repeatedly until no new undefined references are created. Normally, an archive is searched only once in the order that it is specified on the command line. If a symbol in that archive is needed to resolve an undefined symbol referred to by an object in an archive that appears later on the command line, the linker would not be able to resolve that reference. By grouping the archives, they all be searched repeatedly until all possible references are resolved. Using this option has a significant performance cost. It is best to use it only when there are unavoidable circular references between two or more archives. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться