Ответ 1
В широком смысле... компилятор генерирует код в "объектных записях", который содержит кучу кода сборки и вспомогательной информации. Компонент связывает эти записи объектов вместе, чтобы создать исполняемый файл.
Часто компилятор создает единую запись объекта для всего исходного файла. В этом случае компоновщик может решить только ссылку во всей записи объекта или нет. Поскольку в используемой записи объекта есть хотя бы одна функция, она должна связываться во всем этом.
В некоторых компиляторах вы можете указать, чтобы он генерировал отдельную запись объекта для каждой функции (объектный файл может иметь несколько записей объектов). В этом случае компоновщик может принять решение опустить некоторые записи объектов, если они никогда не вызываются.
Из документации Microsoft для /OPT:
/OPT: REF
LINK удаляет неупорядоченные упакованные функции по умолчанию. Объект содержит упакованные функции (COMDAT), если он был скомпилирован с параметром /Gy. Эта оптимизация называется транзитивным удалением COMDAT. Чтобы переопределить это значение по умолчанию и сохранить неподдерживаемые COMDAT в программе, укажите /OPT: NOREF. Вы можете использовать параметр /INCLUDE для переопределения удаления определенного символа.
Параметр /Gy
позволяет связывать на уровне функций.
Для справки эта функция также существует в gcc:
-ffunction сечения
-fdata-sectionsПоместите каждую функцию или элемент данных в свой раздел в выходной файл, если цель поддерживает произвольные разделы. Имя функции или имя элемента данных определяет имя разделов в выходном файле.
Используйте эти параметры в системах, где компоновщик может выполнять оптимизацию, чтобы улучшить локальность ссылки в пространстве команд. Большинство систем, использующих формат объекта ELF, и процессоры SPARC, работающие под управлением Solaris 2, имеют компоновщики с такими оптимизациями. AIX может иметь эти оптимизации в будущем.
Используйте эти параметры только тогда, когда есть значительные преимущества от этого. Когда вы укажете эти параметры, ассемблер и компоновщик создадут более крупные объекты и исполняемые файлы, а также будут медленнее. Вы не сможете использовать "gprof" во всех системах, если вы укажете эту опцию, и у вас могут возникнуть проблемы с отладкой, если вы укажете оба параметра и -g.
И опция компаньона в ld:
- gc-sections
Включить сбор мусора из неиспользуемых разделов ввода. Он игнорируется в отношении целей, которые не поддерживают этот параметр. Этот параметр несовместим с -r или -emit-relocs. Поведение по умолчанию (не выполнять эту сборку мусора) можно восстановить, указав в командной строке --no-gc-разделы.