Есть ли эквивалент файла .def для Linux для управления именами экспортируемых функций в общей библиотеке?
Я создаю общую библиотеку на Ubuntu 9.10. Я хочу экспортировать только часть моих функций из библиотеки. На платформе Windows это будет сделано с использованием файла определения модуля (.def
), который будет содержать список внешних и внутренних имен функций, экспортируемых из библиотеки.
У меня есть следующие вопросы:
-
Как ограничить экспортированные функции разделяемой библиотеки теми, которые я хочу (например, эквивалент файла .def).
-
Используя файлы .def в качестве примера, вы можете дать функции внешнему имени, которое отличается от его внутреннего имени (полезно для предотвращения конфликтов имен, а также для исправления поврежденных имен и т.д.)
-
В окнах я могу использовать команду EXPORT (IIRC), чтобы проверить список экспортируемых функций и адресов, что эквивалентно для этого в Linux?
Ответы
Ответ 1
Самый распространенный способ только сделать определенные символы, видимые в общему объекте в Linux, - передать -fvisibility=hidden
в gcc, а затем украсить символы, которые вы хотите видеть с помощью __attribute__((visibility("default")))
.
Если вы ищете файл экспорта, например решение, вы можете захотеть взглянуть на вариант компоновщика --retain-symbols-file=FILENAME
, который может делать то, что вы ищете.
Я не знаю простого способа экспортировать функцию с другим именем из имени своей функции, но, вероятно, это возможно с помощью редактора эльфа. Изменить: Я думаю, вы можете использовать компоновщик script (посмотрите man-страницу для ld), чтобы назначить значения символам на шаге ссылки, следовательно, дать альтернативное имя данной функции. Заметьте, я никогда не пробовал это.
Чтобы просмотреть видимые символы в общем объекте, вы можете использовать команду readelf
. readelf -Ds
, если я правильно помню.
Ответ 2
Как я могу ограничить экспортированные функции разделяемой библиотеки теми, которые мне нужны (т.е. эквивалент файла .def)
Возможно, вы ищете Карты экспорта GNU или Symbol Versioning
g++ -shared spaceship.cpp -o libspaceship.so.1
-Wl,-soname=libspaceship.so.1 -Wl,
--version-script=spaceship.expmap
Ответ 3
gcc также поддерживает синтаксис VC __declspec (dllexport). См. this.
Ответ 4
Другой вариант - использовать команду strip следующим образом:
strip --keep-symbol=symbol_to_export1 --keep-symbol=symbol_to_export2 ... \
libtotrip.so -o libout.so