Любой способ сказать компоновщику "уважать" __attribute __ ((__ used__)) - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь обойти тот факт, что компоновщик отбрасывает регистрацию в моем коде. Подробнее см. ответ .

Проблема, с которой я столкнулся в этом ответе, заключается в том, что опция --whole-archive кажется избыточным всего для одного вызова функции. Я хотел бы избежать огромного раздувания кода, которое, как я полагаю, вызывает его. Я нашел

атрибут (( используется ))

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

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

для уточнения это мой код:

bool dummy = (Register(), false); // Register is never called because linker dropped entire static library

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

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

Ваша цель на самом деле состоит в том, чтобы заставить компоновщик не отбрасывать определение переменной без ссылки (dummy), в которой инициализатор, есть вызов функции, который вы хотите, чтобы ваша программа выполняла.

__attribute__(used) является атрибутом функций, но не переменных, и его эффект состоит в том, чтобы заставить компилятор скомпилировать определение функции, даже если функция статична и не отображается в блоке перевода. В вашем случае:

bool dummy = (Register(), false);

компилятору не может показаться, что Register не имеет ссылки - он называется - поэтому __attribute__(used) будет быть избыточным, даже если определение Register() находится в той же единице перевода и является статическим. Но будь или не определение Register() составлено в этой единице перевода или какой-либо другой, этот вызов до Register() не будет связан или выполнен в программе, если это определение dummy не связано.

Я предполагаю, что вы не хотите писать собственный скрипт компоновщика или изменять исходный код так, чтобы на dummy ссылались .

В этом случае вам необходимо указать компоновщику постулат неопределенную ссылку на dummy, прохождение --undefined=dummy в его вариантах. Это заставит его искать библиотеки для определение dummy и связывать элементы архива (и / или совместно используемые библиотеки) точно так же, как если бы на самом деле это была неопределенная ссылка на dummy в первом связанном файле. Никакой избыточный код не будет связан, как это возможно с --whole-archive.

Вы можете передать --undefined=<symbol> компоновщику для столько значений <symbol>, сколько тебе нравится. Чтобы пропустить через gcc/g++, используйте -Wl,--undefined=<symbol>.

0 голосов
/ 25 апреля 2019

Поместите его в отдельный раздел и в скрипт компоновщика:

KEEP(sectionname)

редактировать

Эта строка кода может быть уменьшена до обнуления одного регистра или переменной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...