Как chroot влияет на динамическое связывание?

Вот сценарий, который у меня есть:

Я создал среду debootstrap ubuntu maverick (64-разрядная). Я поместил его в / env / mav / в моей (64-разрядной) системе lucid ubuntu. Я могу chroot в / env / mav и могу отлично использовать автономную систему.

Я даже могу нормально использовать прозрачные программы вне chrooted-окружения. То есть / env / mav / bin / ls будет работать.

Однако я заметил, что если я изменю LD_LIBRARY_PATH на / env / mav / lib [1] [2]

, каждая отдельная программа (как lucid, так и maverick), которую я выполняю, немедленно выйдет из строя. (например, ls приводит к ошибке segfault). kern.log показывает:

segfault at 7fece284aa18 ip 00007fece284aa18 sp 00007fff32028158 error 15

Однако ясно, что если я chroot в / env / mav , каждая программа будет работать нормально. И разве не все библиотеки просто читаются из тюрьмы ( / env / mav ) / lib ? Так в чем же разница между chroot и изменением LD_LIBRARY_PATH в этом контексте?

Кроме того, если я:

mount -B /env /env/mav/env

, а затем chroot / env , а затем установите LD_LIBRARY_PATH равным / env / mav / lib , все по-прежнему работает нормально.

Я не понимаю, что здесь происходит внутри.Есть ли где-нибудь внутренние компоненты ld? Делает ли chroot что-то волшебное?

[1] Пример использования - запускать программы из среды maverick, правильно привязанной к динамически подключаемым библиотекам maverick за пределами тюрьмы maverick.

[2] Это всего лишь сокращенный пример. На самом деле включены все / usr / lib и т. Д. В том числе / lib окружения maverick «отравляет» все; нет проблем с использованием других каталогов библиотеки maverick.

6
задан user 4 December 2014 в 01:14
поделиться