Есть ли в Linux эквивалент файла .def для управления именами экспортируемых функций в общей библиотеке? - PullRequest
14 голосов
/ 15 мая 2010

Я создаю общую библиотеку в Ubuntu 9.10. Я хочу экспортировать только часть своих функций из библиотеки. На платформе Windows это можно сделать с помощью файла определения модуля (.def), который будет содержать список внешних и внутренних имен функций, экспортируемых из библиотеки.

У меня есть следующие вопросы:

  1. Как я могу ограничить экспортируемые функции совместно используемой библиотеки теми, которые мне нужны (т. Е. Эквивалент файла .def)

  2. Используя в качестве примера файлы .def, вы можете присвоить функции внешнее имя, отличное от ее внутреннего имени (полезно для предотвращения конфликтов имен, а также для повторного оформления искаженных имен и т. Д.)

  3. В Windows я могу использовать команду EXPORT (IIRC), чтобы проверить список экспортируемых функций и адресов, каков эквивалентный способ сделать это в Linux?

Ответы [ 4 ]

11 голосов
/ 15 мая 2010

Самый распространенный способ сделать видимыми только определенные символы в общем объекте в Linux - это передать -fvisibility=hidden в gcc, а затем украсить символы, которые вы хотите видеть, с помощью __attribute__((visibility("default"))).

Если вы ищете решение для экспорта в виде файла, вам может понадобиться опция компоновщика --retain-symbols-file=FILENAME, которая может сделать то, что вы ищете.

Я не знаю простого способа экспорта функции с именем, отличным от ее имени, но, вероятно, это возможно с помощью редактора эльфов. Редактировать: Я думаю, что вы можете использовать скрипт компоновщика (посмотрите страницу руководства для ld), чтобы присвоить значения символам в шаге ссылки, что дает альтернативное имя для данной функции. Обратите внимание, я никогда не пробовал это.

Для просмотра видимых символов в общем объекте вы можете использовать команду readelf. readelf -Ds если я правильно помню.

8 голосов
/ 15 мая 2010

Как я могу ограничить экспортируемые функции совместно используемой библиотеки теми, которые мне нужны (то есть эквивалент файла .def)

Возможно, вы ищете Карты экспорта GNU или Управление версиями символов

g++ -shared spaceship.cpp -o libspaceship.so.1 -Wl,-soname=libspaceship.so.1 -Wl, --version-script=spaceship.expmap

4 голосов
/ 16 мая 2010

gcc также поддерживает синтаксис VC __declspec (dllexport). Смотрите это .

2 голосов
/ 30 марта 2011

Другой вариант - использовать команду strip следующим образом:

strip --keep-symbol=symbol_to_export1 --keep-symbol=symbol_to_export2 ... \
     libtotrip.so -o libout.so
...