Есть ли эквивалент файла .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