Так что мне интересно, есть ли конкретный способ сказать компоновщику, чтобы он не отбрасывал вызов конкретной функции вместо изменения параметров ссылки для всей программы.
Ваша цель на самом деле состоит в том, чтобы заставить компоновщик не отбрасывать определение переменной без ссылки (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>
.