Загрузчик программ и компоновщик времени выполнения одинаковы в Linux? Я имею в виду, что ld-linux.so
действует как загрузчик во время запуска программы, а также как динамический компоновщик, когда вызывается dlopen()
?
Загрузчик программ и компоновщик времени выполнения одинаковы?
Ответы (2)
Загрузчик программ и компоновщик времени выполнения одинаковы в Linux?
Да. Это справедливо и для любой другой платформы ELF.
dlopen
фактически содержится в libdl.so
, эта библиотека не выполняет настоящую работу; вместо этого он просто призывает ld-linux
сделать это. В частности, dl-runtime.c
, на который вы ссылаетесь, связан с ld-linux
, а не с libdl
.
- person Employed Russian; 12.12.2011
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 и т. д.