Список всех символов, используемых компоновщиком ld

У меня есть небольшая статическая библиотека, скомпилированная (linux) gcc 4.8.2 с -fvisibility=hidden, которая связана с общей библиотекой (у меня есть две версии: gcc с кодом C и ifort с кодом Fortran). Статическая библиотека состоит из некоторых внутренних функций с префиксом "ST_LIB_".

Я хочу быть уверен, что функции, объявленные в статической библиотеке, не могут использоваться никаким исполняемым файлом/библиотекой, связанной с общей библиотекой. Какая команда в Linux лучше всего проверяет, что функции с некоторым префиксом не могут использоваться какой-либо внешней библиотекой?

Я пытался:

nm --dynamic shared_lib | grep -i "ST_LIB_" | wc -l (выход 0)

readelf -d shared_lib | grep -i "ST_LIB_" | wc -l (выход 0)

nm -g shared_lib | grep -i "ST_LIB_" | wc -l (выводит 26 или 0 в зависимости от общей библиотеки)

readelf -s shared_lib | grep -i "ST_LIB_" | wc -l (выводит 26 или 0 в зависимости от общей библиотеки)

readelf -Ws shared_lib | grep -i "ST_LIB_" | grep -i "HIDDEN" | wc -l (выводит 26 или 0 в зависимости от общей библиотеки)


person Peter    schedule 11.03.2014    source источник
comment
Почему nm -g дает вам 26 результатов? -g (или --extern-only) должен давать вам только внешне видимые символы (именно то, что вы просите). Так что, вероятно, у вас есть 26 ST_LIB_* функций, которые не являются статическими.   -  person Shahbaz    schedule 11.03.2014
comment
статическая библиотека скомпилирована gcc, но у меня есть общая библиотека, скомпилированная gcc, и общая библиотека, скомпилированная ifort. Команда nm -g выводит 0 для связанной общей библиотеки gcc и 26 для связанной библиотеки ifort. Вот почему я прошу команду, которая действительно показывает, что читает компоновщик.   -  person Peter    schedule 11.03.2014
comment
Я не говорил о статической и общей библиотеке. Я говорил о ключевом слове static языка C. Если функция статическая, она должна быть внешне невидима для компоновщика. Если gcc правильно сообщает вам, что внешних видимых функций нет (с префиксом ST_LIB_), но компоновщик ifort делает эти функции видимыми извне, то, возможно, что-то не так с ifort или что-то не так с тем, как вы его называете.   -  person Shahbaz    schedule 11.03.2014
comment
функции в статической библиотеке не имеют префикса статического ключевого слова, тогда они вообще будут непригодны для использования в разделяемой библиотеке. Я хочу использовать функции ST_LIB_ в общей библиотеке, но я не хочу, чтобы общая библиотека раскрывала их в дальнейшем   -  person Peter    schedule 11.03.2014
comment
Понятно. Тогда, возможно, вы ищете это?   -  person Shahbaz    schedule 11.03.2014
comment
Я уже использую опцию fvisibility. Я просто хочу проверить, работает ли он так, как ожидалось (например, во время компиляции может использоваться неправильная версия gcc, и я хочу написать модульный тест, который проверяет символы в моей общей библиотеке).   -  person Peter    schedule 11.03.2014


Ответы (1)


nm --dynamic должен быть вариантом, который вы ищете, поскольку он отображает символы, с которыми вы можете связать (из общей библиотеки). readelf --dyn-syms должен отображать ту же информацию (разные выходные данные).

При использовании nm проверьте наличие символов с атрибутом "T". Со страницы руководства:

The symbol type.  At least the following types are used; others are, as well, depending 
on the object file format.  If lowercase, the symbol is usually local; if uppercase, the
symbol is global (external).  There are however a few lowercase symbols that are shown
for special global symbols ("u", "v" and "w").
[...]
"T"
"t" The symbol is in the text (code) section.

Если вы хотите быть на 100% уверены, вы всегда можете написать тестовую программу, которая связывается с вашей общей библиотекой и пытается использовать один из символов ST_LIB_.

person Unknown    schedule 14.03.2014