Я создаю общую библиотеку по Ubuntu 9.10. Я хочу экспортировать только подмножество своих функций из библиотеки. На платформе Windows это было бы сделано с помощью определения модуля (.def
) файл, который содержал бы список внешних и внутренних названий функций, экспортируемых из библиотеки.
У меня есть следующие вопросы:
Как я могу ограничить экспортируемые функции общей библиотеки тем, которых я хочу (т.е. .def эквивалентный файл)
Используя .def файлы как пример, можно дать функции внешнее имя, которое отличается от его внутреннего имени (полезный для, предотвращают коллизии имени и также ремонтирующий скорректированные имена и т.д.),
На окнах я могу использовать команду EXPORT (IIRC) для проверки списка экспортируемых функций и адресов, что эквивалентный путь состоит в том, чтобы сделать это на Linux?
Наиболее распространенный способ сделать видимыми только определенные символы в совместно используемом объекте в Linux - передать -fvisibility = hidden
в gcc, а затем украсить символы, которые вы хотите видеть, с помощью __attribute __ ((видимость ("по умолчанию")))
.
Если вы ищете решение, подобное файлу экспорта, вы можете посмотреть на параметр компоновщика - keep-symbols-file = FILENAME
, который может сделать то, что вы ищете.
Я не знаю простого способа экспорта функции с именем, отличным от имени функции, но, вероятно, это возможно с помощью редактора elf. Редактировать: Я думаю, вы можете использовать скрипт компоновщика (посмотрите справочную страницу для ld), чтобы назначать значения символам на этапе ссылки, тем самым давая альтернативное имя данной функции. Обратите внимание, я никогда не пробовал это.
Чтобы просмотреть видимые символы в общем объекте, вы можете использовать команду readelf
. readelf -Ds
, если я правильно помню.
Как я могу ограничить экспортируемые функции общей библиотеки теми, которые мне нужны (т.е. эквивалент .def файла)
Возможно, вы ищете GNU Export Maps или Symbol Versioning
g++ -shared spaceship.cpp -o libspaceship.so.1
-Wl,-soname=libspaceship.so.1 -Wl,
--version-script=spaceship.expmap
gcc также поддерживает синтаксис VC __declspec (dllexport). См. это .