2014-11-13 4 views
0

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

Я, кажется, смутно помню, что в языке сценария компоновщика была такая директива, но, видимо, это был не GNU LD (возможно, это ложная память).

Мне нужно, чтобы некоторая часть сторонней библиотеки случайно не связывалась с приложением. Если он ссылается, он добавляет некоторые статические инициализаторы, которые наносят хаос во время выполнения (это встроенный проект, поэтому среда немного причудлива). Я не могу изменить соответствующую стороннюю библиотеку. Я хотел бы обнаружить ошибку во время сборки. Я предполагаю, что могу написать сценарий пост-сборки, который анализирует файл карты и выдает ошибку, если он находит оскорбительные части, но упомянутая выше память [false?] Подсказывает мне, что это невозможно сделать, используя только компоновщик.

Я использую toolchain GNU GCC.

ответ

0

Хорошо, выходя на обед помог мне найти это (довольно очевидное) решение:

/* stubs.c */ 

void ERROR_DO_NOT_REFERENCE_THIS_SYMBOL(void); 

void Offending3rdPartyFunction(void) 
{ 
    ERROR_DO_NOT_REFERENCE_THIS_SYMBOL(); 
} 

Здесь символ ERROR_DO_NOT_REFERENCE_THIS_SYMBOL никогда не определен. В проект добавляется дополнительный исходный файл с заглушками, подобными показанному выше для каждой функции, на которую нельзя ссылаться. Если код ссылается на одну из этих функций, заглушка будет иметь приоритет над предоставленным библиотекой символом, и связь не будет выполнена:

test.cpp:(.text._TestFunc+0x4): undefined reference to `ERROR_DO_NOT_REFERENCE_THIS_SYMBOL()' 
collect2.exe: error: ld returned 1 exit status