
По некоторым причинам я пытаюсь модифицировать и протестировать свою собственную версию rtld (ld-elf.so.1). После каждого изменения, которое я вношу в этот компоновщик, мне нужно перезагрузить систему, поднять ее с CD/DVD, установить мою версию в /libexec/ и снова перезагрузить систему. Иногда она даже не запускает пользовательское пространство из-за ошибки сегментации. Я трачу много времени на такую процедуру.
Я хотел бы спросить, как мне запустить этот линкер из командной строки без переустановки моего rtld в /libexec и перезагрузки системы. Возможно ли запустить rtld аналогично Linux /lib/ld-linux.so.2?
Я пытался запустить ld-elf.so.1, но каждый раз получаю segmentation fault. Возможно, я пропустил какие-то параметры в командной строке rtld. Есть предложения, как запустить rtld из командной строки?
Может быть, мне следует изменить интерпретатор по умолчанию для моих исполняемых файлов?
Редактировать: В качестве файловой системы для моей rootfs я использую UFS.
решение1
Можно ли запустить rtld аналогично Linux
/lib/ld-linux.so.2
?
Да, запуск прекрасно /libexec/ld-elf.so.1 /path/to/your_binary
работает на FreeBSD, так же как и на Linux.
Может быть, мне следует изменить интерпретатор по умолчанию для моих исполняемых файлов?
Да, вы можете сделать это при компиляции двоичных файлов с помощью cc -Wl,-dynamic-linker=/path/to/your_interpreter
. -Wl,..
Это способ, которым gcc/clang передает аргументы напрямую компоновщику, вы можете посмотреть страницу ld(1)
руководства для объяснения его --dynamic-linker
и других флагов.
Я пытался бежать
ld-elf.so.1
, но каждый раз получал ошибку сегментации.
Динамический компоновщик/интерпретатор должен быть скомпилирован как позиционно-независимый ( -pie
) и не может сам зависеть от общих объектов или использовать другой интерпретатор.
решение2
Для своей rootfs я использую UFS.
Это позор, потому что ответ ZFS довольно прост. Возможно, вы увидите в этом причину для перехода.
До тех пор, пока все статические части операционной системы находятся в одном наборе данных, вы создаете ZFSклоннабора данных, смонтируйте его в каком-нибудь подкаталоге, измените там загрузчик (или что-то еще, что вы хотите изменить), а затем создайте джейл с этим подкаталогом в качестве корня. Это обеспечивает копию-при-записи вашей операционной системы, но с измененным загрузчиком,на местекак если бы он был установлен в качестве основного загрузчика (которыйэточто касается тюрьмы).
(TrueOS показал пример, имея большой набор данных для корня и /usr
эффективно отсекая точки для отдельных наборов данных, например /var/*
, /tmp
, и /usr/{obj,src,ports,jails,home}
.)
Такой подход устраняет длительный процесс, описанный в jail
руководстве и главе 14Справочник FreeBSD, для настройки дерева каталогов тюрьмы, включая создание полной копии операционной системы внутри корневого каталога тюрьмы. Клон ZFS — это быстрое копирование при записи, берущее в качестве источника настоящий корневой набор данных.