STM32 gcc (arm-none-eabi-gcc) связывает printf, даже если он не используется

#gcc #linker #arm #printf #stm32

#gcc #компоновщик #arm #printf #stm32

Вопрос:

Кажется, я не могу понять, почему некоторые printf библиотечные функции связываются с моим кодом из libc_nano.a, хотя я никогда их не использую printf . Он крадет не менее 2 КБ ценного пространства флэш-памяти. Я вижу разделы _printf_i _vfprintf_r , _vfiprintf_r , и т.д. в моем файле компоновщика.

Я пытался

  • Опция Wl,—exclude-libs
  • EXCLUDE_FILE(..) в скрипте компоновщика

Ни один из них не приводит к исчезновению символов из файла карты..

Мои параметры gcc:

 CFLAGS = -Og -Wall -g3 -Wdouble-promotion -mcpu=cortex-m0 -mthumb -fmessage-length=0 -ffunction-sections -mfloat-abi=soft -DUSE_HAL_DRIVER

LFLAGS = -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -specs=nosys.specs -specs=nano.specs -Wl,--gc-sections 
  

arm-none-eabi-gcc.exe (GNU Tools для встроенных процессоров ARM) 5.2.1
20151202 (повторная аренда) [ARM / embedded-5-branch редакция 231848] Авторское право
(C) 2015 Free Software Foundation, Inc. Это бесплатное программное обеспечение; условия копирования см. В
источнике. Гарантии НЕТ; даже на
ТОВАРНУЮ ПРИГОДНОСТЬ или ПРИГОДНОСТЬ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.

Прежде всего, почему они связаны? Есть ли какой-либо способ их исключения?

Комментарии:

1. Вы пробовали компилировать -nostdinc и связывать с -nostdlib ?

2. Да, я это сделал, и, как ни странно, код успешно компилируется и связывается, но размер становится настолько большим, что он не помещается во флэш-память устройства. Я полагаю, что компоновщик возвращается, используя что-то другое вместо libc_nano.

Ответ №1:

Попросите компоновщика сгенерировать перекрестную ссылку: -Wl,--cref

—cref

Выведите таблицу перекрестных ссылок. Если создается файл компоновщика, таблица перекрестных ссылок печатается в файле карты. В противном случае он печатается на стандартном выводе. Формат таблицы намеренно прост, чтобы при необходимости ее можно было легко обработать скриптом. Символы распечатываются, сортируются по имени. Для каждого символа приводится список имен файлов. Если символ определен, первый указанный файл является местоположением определения. Остальные файлы содержат ссылки на символ.

Найдите строку, начинающуюся с одного из символов печати, и строки под ней.

 grep -A5 _printf *.map
  

Там вы найдете библиотечную функцию, которая использует printf внутри.

Комментарии:

1. Таблица перекрестных ссылок сотворила волшебство. В моем коде где-то использовался assert, который ссылается на printf и друзей. После удаления assert размер моего кода уменьшился более чем на 4K!