Многие компиляторы делают, но это зависит от конкретной реализации.Сборки отладки часто включают в себя все функции, чтобы их можно было вызывать или исследовать из отладчика.Многие компиляторы встроенных систем, по причинам, которые я не совсем понимаю (*), будут включать все функции в объектный файл, если они есть, но будут полностью исключать любые объектные файлы, которые вообще не используются.
Обратите внимание, что в языках, которые поддерживают Reflection (например, Java, C #, vb.net и т. Д.), Возможно, учитывая имя функции, создать ссылку на нее во время выполнения, даже если в коде нет ссылок.Например, подпрограмма может принять строку из консоли, изменить ее каким-либо образом и сгенерировать вызов функции с этим именем.У компилятора или компоновщика не будет возможности узнать, какие имена могут быть сгенерированы, и, следовательно, нет способа узнать, какие функции можно безопасно исключить из кода.Однако в C или C ++ такой трудности не существует, поскольку в коде нет определенного способа создания ссылки на функцию, переменную или константу без явной ссылки, существующей в коде.Некоторые реализации могут упорядочить вещи так, чтобы последовательно объявленные константы или переменные были сохранены последовательно, и, таким образом, можно создать ссылку на объявленную позже, добавив смещение к ранее объявленному, но поведение таких приемов явноне гарантируется стандартами C или C ++.
(*) Я понимаю, что это облегчает компиляцию и компоновку, но на современных компьютерах не должно возникнуть никаких проблем с запуском более сложных алгоритмов компиляции и компоновки, чем это было бы практично в последние десятилетия,Если ничего другого, то метод двухпроходной предварительной компиляции / предварительной ссылки / компиляции / ссылки может на этапе предварительной компиляции / ссылки создать список используемых вещей, а затем на «реальной» фазе компиляции / ссылки пропуститьте, которые не.