
Хотя оба называются "линкером" и используются для связывания двоичных файлов, я не могу понять, чем они отличаются друг от друга. Может кто-нибудь рассказать мне об их различиях?
решение1
Не вдаваясь в технические подробности: оба являются «линкерами», т.е. инструментами, которые объединяют/загружают фрагмент скомпилированного кода с/в другой фрагмент скомпилированного кода.
ld
является статическим компоновщиком, а ld.so
является динамическим компоновщиком.
Буквы so
, как я полагаю, являются сокращением от "shared object", и вы обычно будете видеть его как суффикс имени файла общих библиотек, т. е. библиотек, которые могут быть динамически связаны с программами (одна библиотека "общая" для нескольких программ). Напротив, статическая библиотека часто имеет суффикс имени файла .a
, от "archive" (создается утилитой ar
).
Статический компоновщик связывает программу или библиотеку во время компиляции, обычно на последнем этапе процесса компиляции, создавая двоичный исполняемый файл или библиотеку. В случае двоичного исполняемого файла это может быть статический двоичный файл свсеБиблиотеки загружены в сам двоичный файл, или это может быть динамически связанный двоичный файл, в котором статически связаны только некоторые библиотеки.
Динамический компоновщик загружает библиотеки, которые были динамически скомпонованы во время компиляции, в адресное пространство процесса во время выполнения.
Ознакомьтесь с руководствами ld
по ld.so
вашей системе.