2015-03-29 4 views
3

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

Вопрос в следующем: действительно ли так? Два линкера? Один статический и один динамический?

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

ответ

4

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

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

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

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

+0

От: ** man ld.so ** Программы ld.so и ld-linux.so * найти и загрузить общие библиотеки , необходимые программе, подготовить программу к запуску и запустить ее. Разница между этими 2 заключается в том, что ld.so работает с старым форматом a.out и ld-linux.so с новым двоичным форматом ELF. Итак, мы используем ld-linux.so, когда мы щелкаем по нашему двоичному файлу, чтобы выполнить его, тогда какой «ld» мы используем при компиляции определенного модуля? Не могли бы вы дать мне путь к этому "ld"? – Oleg

+0

@Oleg Если вы запустите 'which ld', он скажет вам. –