Удаление символов из `.a`

Я компилирую статическую библиотеку C++, используя g++ через Cmake. Я хочу удалить символы, относящиеся к внутренней реализации, чтобы они не отображались в nm. (См. здесь и здесь для того же с общими библиотеками.)

В этом ответе рассказывается, как сделать это на iOS, и я пытаюсь понять, что происходит под капотом, чтобы я мог воспроизвести на Linux. Они вызывают ld с помощью:

  • -r/--relocatable для создания перемещаемых выходных данных --- т. е. для создания выходного файла, который, в свою очередь, может служить входными данными для ld.
  • -x/--discard-all: удалить все локальные символы.

AFAICS -r склеивает все модули в один модуль, а затем -x удаляет символы, используемые только внутри этого модуля. Это правильно?

Непонятно, как компоновщик «узнает», какие символы будут экспортированы извне? Полагается ли это на __attribute__((visibility("hidden/default"))), как в случае .so?

Редактировать: явно я запутался... Я думал, что cmake вызвал ld, чтобы связать .os с .a. Погуглил + уточнил выше.

Вопрос остается в силе: как изменить процесс сборки, чтобы исключить большинство символов?


person Mohan    schedule 18.03.2018    source источник
comment
Вы не можете создать статическую библиотеку с помощью ld. Статическая библиотека — это просто архив объектных файлов, созданный архиватором ar. Линкер не играет никакой роли. Пожалуйста, переопишите вашу проблему правильно.   -  person Mike Kinghan    schedule 18.03.2018
comment
Возможный дубликат скрытия имен символов в библиотеке   -  person Mike Kinghan    schedule 18.03.2018