Я компилирую статическую библиотеку C++, используя g++
через Cmake. Я хочу удалить символы, относящиеся к внутренней реализации, чтобы они не отображались в nm
. (См. здесь и здесь для того же с общими библиотеками.)
В этом ответе рассказывается, как сделать это на iOS, и я пытаюсь понять, что происходит под капотом, чтобы я мог воспроизвести на Linux. Они вызывают ld
с помощью:
-r
/--relocatable
для создания перемещаемых выходных данных --- т. е. для создания выходного файла, который, в свою очередь, может служить входными данными для ld.-x
/--discard-all
: удалить все локальные символы.
AFAICS -r
склеивает все модули в один модуль, а затем -x
удаляет символы, используемые только внутри этого модуля. Это правильно?
Непонятно, как компоновщик «узнает», какие символы будут экспортированы извне? Полагается ли это на __attribute__((visibility("hidden/default")))
, как в случае .so
?
Редактировать: явно я запутался... Я думал, что cmake вызвал ld
, чтобы связать .o
s с .a
. Погуглил + уточнил выше.
Вопрос остается в силе: как изменить процесс сборки, чтобы исключить большинство символов?
ld
. Статическая библиотека — это просто архив объектных файлов, созданный архиваторомar
. Линкер не играет никакой роли. Пожалуйста, переопишите вашу проблему правильно. - person Mike Kinghan   schedule 18.03.2018