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