Существует ли .def файл, эквивалентный на Linux для управления экспортируемыми именами функций в общей библиотеке?

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

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

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

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

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

14
задан Jonathan Leffler 16 May 2010 в 00:37
поделиться

3 ответа

Наиболее распространенный способ сделать видимыми только определенные символы в совместно используемом объекте в Linux - передать -fvisibility = hidden в gcc, а затем украсить символы, которые вы хотите видеть, с помощью __attribute __ ((видимость ("по умолчанию"))) .

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

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

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

11
ответ дан 1 December 2019 в 11:59
поделиться

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

Возможно, вы ищете GNU Export Maps или Symbol Versioning

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

8
ответ дан 1 December 2019 в 11:59
поделиться

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

4
ответ дан 1 December 2019 в 11:59
поделиться