Я работаю над встроенным проектом, и я дублирую примерный проект. Не учитывая порядок связывания объектных файлов, я просто помещаю файлы c
в произвольном порядке в свой Makefile
.найти дублированные объявленные функции в библиотеке c (отдельные файлы)
Компиляция и связывание дает executable.elf
из 1.9Mb
. Ошибок не было, но исполняемый файл не работал.
После долгих поисков, без решения я, наконец, дублирует проект именно, в том числе порядка c
файлов (120 из них), и вот я получил executable.elf
из 2.2Mb
и без каких-либо ошибок. И исполняемый файл работал.
Ничего не изменилось в параметрах компиляции и/или ссылках. Просто изменил порядок, в котором файлы c
перечислены в make-файле и, следовательно, порядок объектных файлов во время ссылки.
Я подозреваю, что существует несколько реализаций дубликатов функций с разными телами/размерами. Моя гипотеза заключается в том, что время ссылки компоновщика, без памяти предыдущих действий ссылки, просто выбирает первый, с которым он сталкивается, не поднимая ошибку.
Однако я хотел бы получить эту предоставленную библиотеку (все файлы c
, файл lib *.a
) и найти дубликаты функций. Поэтому я знаю, в каком порядке я должен предоставить файлы c и, что более важно, почему.
Два вопроса:
- ли приведенное выше описание, на самом деле потенциальной причиной вопросов?
- Есть ли другие возможности?
- Как найти дубликаты функций?
К сожалению, скомпилированный код является патентованным, и детали не могут быть предоставлены в настоящее время.
Компилятор:
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496]
Цель является:
cortex-m3
Ваша помощь ценится.
--- EDIT ---
Есть два файла:
является список со всеми исходным кодом (source.mk):
C_FILES_SRC = $(SDK_DIR)/file001.c C_FILES_SRC += $(SDK_DIR)/file002.c C_FILES_SRC += $(SDK_DIR)/ ..... | C_FILES_SRC += $(APPL_DIR)/file121.c C_FILES_SRC += $(APPL_DIR)/file122.c
является
Makefile
(краткая версия):include source.mk CFLAGS = xxxxx # create objects %.o: %.c $(GCC) $(CFLAGS) -MMD -MP -MF($(@:%.o=%.d) -o [email protected] -c $< # link it all together executable.elf $(GCC) $(MAIN_CFLAGS) $(LINK_SCRIPTS) -Xlinker --gc-sections $(LIBS_DIR) $(EXTRA_LINK_FLAGS) $(SPECS) -o [email protected] $(OBJS) $(LIBS) $(SIZE) --format=berkeley [email protected]
В Makefile
ничего не меняю. Изменен только порядок файлов в источнике.mk
Я знаю, что вы сказали, что не можете публиковать сам код, но можете ли вы опубликовать обфусканный эквивалент вашего 'Makefile'? Благодаря! Как мы знаем, мы даже не знаем, что такое структура вашего 'Makefile' или какая buildsystem вы используете для его создания (если есть). Это, скорее всего, затруднит вам окончательный ответ. –
Вы говорите: «Моя гипотеза заключается в том, что ... компоновщик ... просто выбирает первый, с которым он сталкивается, не создавая ошибки». Это было бы крайне необычно и неправильно. Если есть два объектных файла, определяющих одну и ту же внешнюю видимую функцию, соединение должно завершиться ошибкой с повторяющейся функцией. Самый простой способ имитации заключается в том, чтобы добавить один объектный файл в список дважды; ссылка не сработает, когда вы это сделаете. Вы проверили размеры объектных файлов? Вы сравнили вывод 'size' для двух бинарных файлов? Были ли варианты компиляции одинаковыми? Версия компилятора? –
Я просто добавил произвольный файл библиотеки 'c' в мое приложение и скомпилировал/связал его. Таким образом, существует два идентичных объектных файла с разными местоположениями. Ошибок от компоновщика нет. – Robert