Есть ли в OS X два компоновщика? Одна статическая и одна динамическая?

Проблема в том, что я обнаружил, что в Mac OS X есть dyld (как я понял, динамический компоновщик), а также простой компоновщик ld (как я понял статический).

Возникает вопрос: так ли это на самом деле? Два линкера? Одна статическая и одна динамическая?

Почему они решили завести двоих? В Linux есть только один компоновщик (ld), который выполняет как статическое, так и динамическое связывание.


person denis631    schedule 29.03.2015    source источник


Ответы (1)


Вы неправильно поняли значение слова «связывание». Или, подумав о другом, вы не осознали, что это имеет два значения.

Если это поможет, думайте о dyld как о динамическом загрузчике, а не о «компоновщике». dyld - это программа, которая загружает динамические библиотеки, на которые ссылается исполняемый файл, в адресное пространство процесса. Он по-прежнему включает связывание, потому что требует разрешения ссылок на символы.

Вы никогда не вызываете dyld как часть процедуры сборки. Вы всегда используете ld или, что более типично, вы просите компилятор связать вашу программу, и он вызывает ld от вашего имени. dyld используется только во время выполнения.

Вы ошибаетесь, когда утверждаете, что в Linux нет этого различия. В Linux есть динамический загрузчик ld.so, который отличается из статического компоновщика ld.

person Ken Thomases    schedule 29.03.2015
comment
Из: man ld.so Программы ld.so и ld-linux.so * находят и загружают общие библиотеки, необходимые программе, подготавливают программу к запуску, а затем запускают ее. Разница между этими двумя состоит в том, что ld.so работает со старым форматом a.out, а ld-linux.so - с новым двоичным форматом ELF. Итак, мы используем ld-linux.so, когда мы нажимаем на наш двоичный файл, чтобы запустить его, то какой тип ld мы используем при компиляции определенного модуля? не могли бы вы указать мне путь к этому лд? - person Oleg; 30.03.2015
comment
@Oleg Если вы запустите which ld, он вам скажет. - person Mike Kinghan; 30.03.2015