2014-09-05 5 views
1

Рассмотрим программу, как:Принуждение ЛД разрешить слабые ссылки на время Л.Д.

#include <stdio.h> 
void foo() __attribute__((__weak__)); 
int main() 
{ 
    printf("%p\n", (void *)foo); 
    if (foo) foo(); 
} 

Если скомпилирован как обычный, не-PIE динамической связанный исполняемый файл, то несуществование foo решается на ld время, и даже если LD_PRELOAD используется для определения foo, он не будет виден. С другой стороны, если программа скомпилирована как PIE, на выходе выводятся слабые ссылки на динамические символы, а LD_PRELOAD может сделать символ foo видимым.

Есть ли способ заставить поведение, отличное от PIE (разрешить несуществование символа с слабой ссылкой в ​​ld time, а не во время выполнения) для исполняемых файлов PIE?

ответ

0

Функция с этим атрибутом имеет свое имя, которое выбрано как слабый символ вместо глобального имени. Это прежде всего для именования библиотечных процедур, которые могут быть переопределены кодом пользователя.

слабый символ Наличие двух или более глобальных символов с одинаковым именем не вызовет конфликта, если все, кроме одного, объявлены слабыми символами. Компилятор игнорирует определения слабых символов и использует определение нормального глобального символа для разрешения всех ссылок, но слабые символы будут использоваться, если обычный глобальный символ недоступен. Слабый символ может использоваться для обозначения функций и данных, которые могут быть переопределены кодом пользователя. Слабый символ также называют слабым псевдонимом или просто слабым.

Из Интернета!

 Смежные вопросы

  • Нет связанных вопросов^_^