Почему скрытые символы все еще добавляются в DSO - PullRequest
0 голосов
/ 22 мая 2018
user@pc ~/hiddensymbols
% cat main.cpp 
__attribute__((visibility ("hidden"))) int f_b1(void){
return 21 ;
}

__attribute__((visibility ("hidden"))) int f_b3(void){
return f_b1() ;
}                                                                                                                                    user@pc ~/hiddensymbols
 % g++ -shared main.cpp
user@pc ~/hiddensymbols
 % nm -C ./a.out       
.............
000000000000055a t f_b1()
0000000000000565 t f_b3()

Интересно, какой смысл оставлять эти два символа в DSO?Я понимаю, что динамический компоновщик не может их использовать, но тогда почему они добавляются в какую-то скрытую таблицу символов?Какова была цель этого?

1 Ответ

0 голосов
/ 22 мая 2018

Когда компоновщик выдает объектный файл, он записывает имя и адрес каждого символа, независимо от его видимости (в разделе .symtab, который можно вывести с помощью readelf --symbols <elf-file>).Он используется для отладки для отображения имен символов, даже если отладочная информация недоступна.Во время обычного выполнения этот раздел не загружается / не отображается в адресном пространстве.

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

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