Почему GCC --gc-секции и -ffunction-секции не работают?(cmake build) - PullRequest
0 голосов
/ 24 мая 2019

Интересно, почему флаг компилятора GCC -ffunction-секции и флаг компоновщика --gc-секции не устраняют ненужные соотв. код символов / функций без ссылок из моего окончательного исполняемого файла. Почему, черт возьми, это не работает, как ожидалось и описано в документе GCC?

Возможно, я просмотрел какую-то непреднамеренную ссылку!?
Проверено уже с использованием этого очень хорошего метода: GCC --gc-section и поиск символьных зависимостей с / DISCARD / в скрипте компоновщика. Нет успеха Нет ссылки на мои неиспользуемые функции.

Нет шансов автоматически устранить мертвый код! Почему ???

1 Ответ

1 голос
/ 24 мая 2019

Ответ довольно прост (в моем случае):

Я использую CMake для сборки своего проекта, и он вставляет флаг -rdynamic!
Насколько мне известно, сочетание параметров -rdynamic и --gc-sections нигде не упоминается в документации GCC. Должно быть следующее предупреждение:
-rdynamic делает --gc-sections бесполезные биты. на все символы ссылаются неявно.

См. Также: Что именно `-rdynamic` делает и когда именно это нужно?

Конечно, это влияет только на пользователей CMake ... (не зная):

CMP0065

Не добавляйте флаги для экспорта символов из исполняемых файлов без : prop_tgt: ENABLE_EXPORTS целевое свойство.

CMake 3.3 и ниже, по историческим причинам, всегда связанные исполняемые файлы на некоторых платформах с флагами типа -rdynamic для экспорта символов из исполняемые файлы для использования любыми плагинами, которые они могут загрузить через dlopen. CMake 3.4 и выше предпочитают делать это только для исполняемых файлов, которые явно помечены с помощью свойства: prop_tgt: ENABLE_EXPORTS target.

Поведение OLD этой политики - всегда использовать дополнительные флаги ссылки при связывании исполняемых файлов независимо от значения : prop_tgt: ENABLE_EXPORTS целевое свойство.

Поведение NEW этой политики заключается в использовании только дополнительной ссылки флаги при связывании исполняемых файлов, если: prop_tgt: ENABLE_EXPORTS Свойство target установлено в True.

Эта политика была введена в CMake версии 3.4. В отличие от большинства политики, версия CMake | выпуск | не предупреждает по умолчанию, когда это политика не установлена ​​и просто использует СТАРОЕ поведение. Смотрите документацию переменная: *: 1044 * переменная для управления предупреждением.

Чтобы избавиться от большинства ненужных -rdynamic CMakeLists.txt, просто добавьте cmake_policy(SET CMP0065 NEW)

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