Как правило, компоновщики включают все из объектных файлов, явно переданных в командной строке, но извлекают только те объектные файлы из статической библиотеки, которая содержит символы, необходимые для разрешения внешних ссылок из уже связанных объектных файлов.
Однако компоновщик может принять решение об отмене функций, которые никогда не вызываются, или данных, на которые никогда не ссылаются.Точные детали будут зависеть от переключателей компилятора и компоновщика.
В коде C ++, если исходный файл явно скомпилирован и связан с вашим приложением, я бы ожидал, что объекты со статической продолжительностью хранения, имеющие конструкторы и/ или деструкторы будут включены, и их конструкторы / деструкторы будут запущены в соответствующее время.Следовательно, любой код, вызываемый из этих конструкторов или деструкторов, должен быть в конечном исполняемом файле.Однако, если код не вызывается откуда-либо, вы не можете написать программу, которая скажет, включен ли код, без использования таких вещей, как dlsym
, поэтому компоновщик вполне может не включить его в конечный исполняемый файл.
Я бы также ожидал, что любые символы, определенные с глобальной видимостью, которые могут быть найдены с помощью dlsym
(в отличие от «скрытых» символов, которые видны только в в исполняемом файле), будут присутствовать вфинальный исполняемый файл.Однако это скорее ожидание, чем то, что я подтвердил, протестировав или прочитав документы.