LINUX.ORG.RU

Как оставить в выходном файле неиспользуемую явно функцию?

 , ,


1

3

Если линкеру задать опции --gc-sections, а компилятору -ffunction-sections, из выходного файла будут выкинуты функции, к которым нет явного обращения. Размер выходного файла заметно уменьшится, это хорошо. А плохо то, что в прошивке присутствует одна функция, не используемая явно, но сильно нужная, которую линкер радостно и выкидывает.

Вопрос: как объяснить линкеру, что выкидывать можно всё, кроме вот этой вот функции? Линкер и компилятор — из набора GCC.

Ответ на: комментарий от anonymous

На неё нет, и не может быть ссылок из основной программы. Например, это функция bootloader-а, которая трёт и переписывает флеш. Как мне её «использовать»? Перетирать прошивку при каждом включении?

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от someoneelsenotme

Не, отчего-то не катит. Та функция помещена в отдельную явно именованную секцию, и обвешана атрибутами __attribute__((used, section(".bl"))). Но линкер упорно выбрасывает её.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

Так это. оно только для статик-функций:

9.49 __attribute__((used)) function attribute
This function attribute informs the compiler that a static function is to be retained in the object file, even if it is unreferenced.

Functions marked with __attribute__((used)) are tagged in the object file to avoid removal by linker unused section removal.
Note
Static variables can also be marked as used, by using __attribute__((used)).
Example
static int lose_this(int);
static int keep_this(int) __attribute__((used));     // retained in object file
static int keep_this_too(int) __attribute__((used)); // retained in object file
someoneelsenotme
()

У тебя два варианта:
1) подредактировать ld скрипт чтобы в нем была отдельная секция для твоей функции и сделать на нее KEEP
2) Передать параметр при линковке с именем твоей функции:

-u symbol
Pretend the symbol symbol is undefined, to force linking of
library modules to define it. You can use -u multiple times
with different symbols to force loading of additional
library modules.

pftBest ★★★★
()
Последнее исправление: pftBest (всего исправлений: 1)
Ответ на: комментарий от pftBest

-u symbol

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

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

Если это «функция bootloader-а» то на ней не должно быть никаких декораций. И раз ее будет вызывать железо или другой бинарь, то он должен как-то ее найти, значит у нее уже и так должна быть секция в ld скрипте чтобы зафиксировать ее адрес, все что тебе нужно сделать это повесить на нее KEEP().

pftBest ★★★★
()
Ответ на: комментарий от pftBest

И раз ее будет вызывать железо или другой бинарь, то он должен как-то ее найти

Она лежит по фиксированному адресу, но LD-скрипт трогать низзя. В AVR-ках размер памяти под bootloader, тем более, может выбираться из нескольких значений, в скриптах линкера ничего про него нет.

one_more_hokum ★★★
() автор топика
Последнее исправление: one_more_hokum (всего исправлений: 1)
Ответ на: комментарий от one_more_hokum

Ок, понял, интересно а как потом прошивка найдет этот «фиксированный адрес» если размер бутлодера может меняться?

pftBest ★★★★
()
Последнее исправление: pftBest (всего исправлений: 2)
Ответ на: комментарий от someoneelsenotme

Так это. оно только для статик-функций

Для шестого GCC:

used

This attribute, attached to a function, means that code must be emitted for the function even if it appears that the function is not referenced. This is useful, for example, when the function is referenced only in inline assembly. When applied to a member function of a C++ class template, the attribute also means that the function is instantiated if the class itself is instantiated.

Слова static не нашёл.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от pftBest

как потом прошивка найдет этот «фиксированный адрес» если размер бутлодера может меняться?

Так он меняется только в одну сторону, начинается всегда по фиксированному адресу.

one_more_hokum ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.