Загрузчик программ и компоновщик времени выполнения одинаковы?

Загрузчик программ и компоновщик времени выполнения одинаковы в Linux? Я имею в виду, что ld-linux.so действует как загрузчик во время запуска программы, а также как динамический компоновщик, когда вызывается dlopen()?


person Lunar Mushrooms    schedule 11.12.2011    source источник


Ответы (2)


Загрузчик программ и компоновщик времени выполнения одинаковы в Linux?

Да. Это справедливо и для любой другой платформы ELF.

person Employed Russian    schedule 11.12.2011
comment
Спасибо. Загрузчик программы и компоновщик времени выполнения могут отличаться для любых платформ, отличных от ELF? Есть примеры? - person Lunar Mushrooms; 11.12.2011
comment
В AIX загрузчик программ является частью ядра, а компоновщик среды выполнения находится в пользовательской библиотеке. publib.boulder.ibm.com/infocenter/aix/v6r1/ - person Employed Russian; 11.12.2011
comment
Не совсем так, смотрите мой ответ. Но они связаны. - person Basile Starynkevitch; 12.12.2011
comment
@BasileStarynkevitch Ваш ответ неверен. Хотя dlopen фактически содержится в libdl.so, эта библиотека не выполняет настоящую работу; вместо этого он просто призывает ld-linux сделать это. В частности, dl-runtime.c, на который вы ссылаетесь, связан с ld-linux, а не с libdl. - person Employed Russian; 12.12.2011
comment
Именно это я и сказал: dlopen внутри libdl — это просто обертка или клей для какого-то кода в ld-linux. Настоящая работа выполняется внутри ld-linux, а libdl — это просто связующий код. - person Basile Starynkevitch; 12.12.2011
comment
В Linux загрузка программы является частью ядра (execve), а загрузка выполняется ld-linux.so (man ld.so). См. stackoverflow.com/questions/26876247/ Я думаю, что этот ответ не совсем правильный и опускает довольно много подробностей о загрузке программы в Linux. Другой ответ о загрузчиках в Linux можно найти здесь: programmers.stackexchange.com/a/95740/92774 - person lanoxx; 31.01.2015

Я думаю, что есть очень связанные, но не совсем то же самое.

Библиотека /lib/libdl.so (или /lib/x86_64-linux-gnu/libdl.so.2 в моей системе) (содержащая dlopen и dlsym) представляет собой своего рода код-заглушку или связующий код или оболочку, использующую некоторую часть /lib/ld-linux.so.2 (или /lib64/ld-linux-x86-64.so.2), но она не содержит тех же символов, что вы можете проверить с помощью nm -D .

Определенно dlopen и динамический загрузчик делают очень похожие вещи: mmap - создание сегментов и интерпретация заказов на перемещение . См. эту ссылку и книга Левина о компоновщиках и загрузчиках

Посмотрите исходный код Gnu Libc, например dl -runtime.c и т. д.

person Basile Starynkevitch    schedule 11.12.2011