Статическая библиотека - это не что иное, как список объектных файлов, заархивированных вместе.
Как разрешаются неопределенные символы в статических библиотеках?
Они не разрешены, посколькунет неопределенных символов.Символ считается неопределенным только на этапе связывания, и при создании статической библиотеки связывание не происходит.
При связывании двоичного файла со статической библиотекой могут быть неопределенные символы.В этом случае статическая библиотека обрабатывается как часть вашей программы, и поэтому все ссылки на символы, используемые в этой статической библиотеке, должны быть доступны в объеме создаваемой вами программы.Например, если программа A
связывается со статической библиотекой B
, которая использует символ C
из другой библиотеки D
, то программа A
должна связываться с B
и D
.
может зависимый двоичный файл динамически загружать неопределенные символы
Да, может.Но вы не должны идти по этому пути, если вам действительно не нужно ленивое динамическое разрешение.
или символы должны быть разрешены другой статической библиотекой или объектным файлом во время компиляции
Объектные файлы, а также статические библиотеки не разрешают символы.Это компоновщик, который делает это.
Может ли компилятор разрешить ...
Компилятор не разрешает никаких зависимостей.Это работа линкера.Зависимости могут быть разрешены во время компоновки или во время выполнения динамическим компоновщиком.
зависимостей (приложения, зависящего от статической библиотеки), связываясь с динамической библиотекой, ...
Линкеры могут понимать, что используемая вами статическая библиотека зависит от символов в динамической библиотеке, с которой вы связываетесь.
и, если это так, будет кодировать текст статическипреобразован в получившийся двоичный файл или будет существовать динамическая ссылка?
Если вы создадите ссылку на совместно используемую библиотеку, ничего из этого не будет статически доступно в вашей программе.В этом смысл общих библиотек.Исключение составляет только LTO.Что касается статической библиотеки, с которой вы связываетесь, то ничего из этой статической библиотеки не будет доступно динамически, она компилируется, а те символы, которые не используются, удаляются.
Например, статическая библиотека Lиспользует malloc из libc6.so, и он будет использоваться приложением A. Будут ли L и A использовать malloc из libc6.so динамически?
Да, если только определение malloc()
не было доступно ввремя компиляции статической библиотеки и компилятора по какой-то причине просто встроило тело malloc()
в код статической библиотеки.Но с malloc()
этого не произойдет.Может быть с другими функциями.