Ошибки компоновщика для неиспользуемой функциональности: когда они возникают? - PullRequest
2 голосов
/ 09 декабря 2011

Предположим, статическая библиотека libfoo зависит от другой статической библиотеки libbar для некоторых функций. Они и мое приложение написаны на D. Если мое приложение использует только libfoo напрямую и вызывает только функции из libfoo, которые не ссылаются на символы из libbar, иногда программа успешно связывается, не передавая libbar компоновщику, а в других случаях это не так.

То, что происходит, зависит от того, какой компилятор я использую для компиляции libfoo, libbar и моего приложения, даже если все компиляторы используют цепочку инструментов GCC для компоновки. Если я использую DMD, я никогда не получу ошибки компоновщика, если я не передам libbar компоновщику. Если я использую GDC, я иногда использую это по причинам, которые я не понимаю. Если я использую LDC, я всегда делаю.

Что определяет, не сработает ли компоновщик GCC, если символ, указанный в libfoo, не определен, но этот символ встречается в функции, на которую не ссылается объектный файл приложения?

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

, если компоновщик не пытается устранить мертвый (неиспользуемый) код в библиотеках, он просто предполагает, что все ссылочные символы используются , и пытается связать их в

, если он удаляет(например, с помощью простой метки и алгоритма очистки (обратите внимание, что вы не можете полностью решить, если какой-то код не используется, поскольку эту проблему можно свести к проблеме остановки)) он может устранить неиспользуемые библиотеки, если они никогдаused

это поведение определяется реализацией (и могут быть флаги компоновщика, которые можно установить, чтобы включить / отключить его

1 голос
/ 10 декабря 2011

Что определяет, завершится ли компоновщик GCC, когда символ, указанный в libfoo, не определен, но этот символ встречается в функции, на которую не ссылается объектный файл приложения?

Если компоновщикжалуется на неразрешенный символ, то есть символ является ссылкой откуда-то.

Обычно компоновщик скажет вам, с какого объекта пришла неразрешенная ссылка, но если нет, то -Wl,-y,unres_symbol следует.

Вы также можете прочитать это описание того, как все это работает.

...