Скрыть символы «_init» и «_fini» в общей библиотеке - PullRequest
0 голосов
/ 02 июня 2018

Я создаю разделяемую библиотеку и заметил, что с помощью __attribute__((visibility("default"))) (вместе с -fvisibility=hidden) моя библиотека экспортирует также символы _init и _fini.Если я использую список exported_symbols (вместе с -Wl,--version-script=<file_list>), библиотека экспортирует только мои функции, что идеально.

Это способ использовать первое решение и экспортировать только мои функции без _initи _fini?спасибо

1 Ответ

0 голосов
/ 03 июня 2018

Прежде всего, проблема не ограничивается _init и _fini - набор инструментов GNU по умолчанию экспортирует другие бесполезные символы, например, _edata и т. Д. Эти символы действительно совершенно не нужны (динамический компоновщик получает указатели на ctors /dtors различными способами).

Недавно я сообщил о проблеме в списки gcc-help и Binutils .Ответ в списке Bintools состоял в том, что хотя эти символы действительно не используются в системах Linux, их удаление должно быть очень осторожным и потребовать большого количества тестирования, а прирост производительности будет незначительным.Я не получил ответа в gcc-help (возможно, имеет смысл повторно опубликовать в списке разработчиков gcc).

В качестве временного решения вы можете явно скрыть нежелательные символы с помощью скрипта версии:

$ cat myapp.version
{
  global: XML_*; _INTERNAL_*;
  local: *;
};
$ cat Makefile
...
LDFLAGS += -Wl,--version-script=myapp.version

Пример этого для проекта Expat можно найти здесь .Одна из проблем этого подхода (помимо добавления стандартного шаблона ко всем проектам вместо того, чтобы исправлять его один раз в Binutils / GCC) заключается в том, что с Autoconf трудно сделать это правильно.

Обратите внимание, что даже если вы используете скрипт версии, вы все же необходимо скомпилировать с -fvisibility=hidden (это позволяет компилятору выполнять более агрессивную оптимизацию скрытых символов, тогда как в случае сценария версии компилятор не знает, что в итоге скрыто).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...