Как применить-fvisibility опцию к символам в статических библиотеках?

У меня есть общий проект библиотеки, который разрабатывается из 4 статических библиотек (.a) и один объект (.o) файл. Я пытаюсь добавить -fvisibility=hidden опция ограничить символы в выводе к только тем, которые я отмечаю в источнике с __ атрибут __.

Я добавил -fvisibility=hidden опция к опциям компиляции для .so проект (который покрывает .o файл) и для .a проекты.

Символы в объектном файле удалены как ожидалось из финала .so. Однако символы от .a проекты - все все еще в финале .so файл. Добавление -fvisibility=hidden опция к .so команда ссылки не имеет никакого эффекта.

Что я делаю неправильно?

Моя цель здесь состоит в том, чтобы удалить из .so все символы кроме функций интерфейса к библиотеке.

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

43
задан jww 27 August 2018 в 12:05
поделиться

1 ответ

Вы возвращаете ссылку на ret , которая является переменной в стеке.

-121--1127678-

Проекты, зависящие друг от друга, не означают, что параллелизация невозможна. Системы сборки достаточно умны, чтобы понять и избежать критических депендаций. Иначе gcc не сможет использовать 4 ядра.

Поэтому (в дополнение к другим шагам), почему бы просто не попробовать включить многопроцессорную обработку в Visual Studio с помощью/MP (см. http://msdn.microsoft.com/en-us/library/bb385193.aspx ).

-121--1066995-

В основном, видимость обрабатывается во время связывания, и компоновщик, похоже, не навязывает ее статическим архивам. Соответствующий вопрос (хотя и не дубликат) был задан на SO здесь .

Что я советовал бы, чтобы вы, чтобы сделать заменили свое соединение стадии: gcc - разделил-o mylib.so foo.o libbar.a в два процесса стадий, куда вы возвращаете файлы объекта:

  • площадь x libbar.a (возможно в подходящий, пустой справочник)
  • gcc-fvisibility=hidden - разделил-o mylib.so foo.o tempdir / *.o
31
ответ дан 26 November 2019 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: