Прежде всего, проблема не ограничивается _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
(это позволяет компилятору выполнять более агрессивную оптимизацию скрытых символов, тогда как в случае сценария версии компилятор не знает, что в итоге скрыто).