Стандартное поведение gcc - все символы видимы. Однако, когда единицы перевода построены с опцией -fvisibility=hidden
, только функции / символы, отмеченные __attribute__ ((visibility ("default")))
, являются внешними в результирующем общем объекте.
Вы можете проверить, являются ли символы, которые вы ищете, внешними, вызвав:
# -D shows (global) dynamic symbols that can be used from the outside of XXX.so
nm -D XXX.so | grep MY_SYMBOL
скрытые / локальные символы показаны как nm
с типом символов в нижнем регистре, например t
вместо `T для секции кода:
nm XXX.so
00000000000005a7 t HIDDEN_SYMBOL
00000000000005f8 T VISIBLE_SYMBOL
Вы также можете использовать nm
с опцией -C
для разборки имен (если использовался C ++).
Подобно Windows-DLL, можно было бы пометить публичные функции определением, например DLL_PUBLIC
, определенным как:
#define DLL_PUBLIC __attribute__ ((visibility ("default")))
DLL_PUBLIC int my_public_function(){
...
}
, что примерно соответствует версии Windows / MSVC:
#ifdef BUILDING_DLL
#define DLL_PUBLIC __declspec(dllexport)
#else
#define DLL_PUBLIC __declspec(dllimport)
#endif
Больше информации о видимости можно найти в gcc wiki.
Когда модуль перевода скомпилирован с -fvisibility=hidden
, результирующие символы все еще имеют внешнюю связь (показана с символом верхнего регистра в виде nm
) и могут без проблем использоваться для внешней связи, если объектные файлы становятся частью статических библиотек. Связь становится локальной, только когда объектные файлы связаны в общей библиотеке.
Чтобы найти, какие символы в объектном файле скрыты, выполните:
>>> objdump -t XXXX.o | grep hidden
0000000000000000 g F .text 000000000000000b .hidden HIDDEN_SYMBOL1
000000000000000b g F .text 000000000000000b .hidden HIDDEN_SYMBOL2
Следующего должно быть достаточно:
[^ ]
Если вы хотите расширить это до чего угодно, кроме пробелов (разрывы строк, табуляции, пробелы, жесткие пробелы):
[^\s]
или
\S
\ s
соответствует любому символу пробела \ S
соответствует любому символу, не являющемуся пробелом [^]
соответствует чему угодно, кроме символа пробела. Выберите наиболее подходящий.