Teste do FreeBSD rtld

Teste do FreeBSD rtld

Por alguns motivos, estou tentando modificar e testar minha própria versão do rtld (ld-elf.so.1). Após cada alteração que fiz neste vinculador, preciso reiniciar o sistema, trazê-lo do CD/DVD, instalar minha versão em /libexec/ e reiniciar o sistema novamente. Às vezes, ele nem executa o espaço do usuário por causa de falha de segmentação. Estou perdendo muito tempo nesse procedimento.

Gostaria de perguntar como posso iniciar este vinculador a partir da linha de comando sem reinstalar meu rtld em/libexec e reinicializar o sistema. É possível executar o rtld de forma semelhante ao Linux /lib/ld-linux.so.2?

Tentei executar ld-elf.so.1, mas sempre recebo uma falha de segmentação. Provavelmente perdi alguns parâmetros na linha de comando do rtld. Alguma sugestão de como executar o rtld na linha de comando?

Talvez eu pudesse alterar o interpretador padrão dos meus executáveis?

Editar: como sistema de arquivos para meus rootfs eu uso UFS.

Responder1

É possível executar o rtld de forma semelhante ao Linux /lib/ld-linux.so.2?

Sim, a execução /libexec/ld-elf.so.1 /path/to/your_binaryfunciona bem no FreeBSD, assim como no Linux.

Talvez eu pudesse alterar o interpretador padrão dos meus executáveis?

Sim, você poderia fazer isso ao compilar binários, via cc -Wl,-dynamic-linker=/path/to/your_interpreter. É -Wl,..assim que o gcc/clang passa argumentos diretamente para o vinculador. Você pode dar uma olhada na ld(1)página de manual para obter uma explicação sobre seus --dynamic-linkere outros sinalizadores.

Tentei executar ld-elf.so.1, mas sempre recebo falha de segmentação.

O vinculador/interpretador dinâmico deve ser compilado como independente de posição ( -pie) e não pode depender de objetos compartilhados ou usar outro intérprete.

Responder2

Para meus rootfs eu uso UFS.

É uma pena, porque a resposta do ZFS é bastante simples. Talvez você veja isso como um motivo para mudar.

Contanto que todas as partes estáticas do sistema operacional estejam em um conjunto de dados, você cria um ZFSclonedo conjunto de dados, monte-o em algum subdiretório, modifique o carregador (ou o que você deseja modificar) lá e, em seguida, crie uma prisão com esse subdiretório como raiz. Isso fornece uma cópia copy-on-write do seu sistema operacional, mas com o carregador modificado,no localcomo seria se instalado como o carregador principal (queisso éno que diz respeito à prisão).

(TrueOS mostrou o caminho com isso, tendo um grande conjunto de dados para a raiz e /usrremovendo efetivamente pontos para conjuntos de dados separados, como /var/*, /tmp, e /usr/{obj,src,ports,jails,home}.)

O que esta abordagem elimina é o longo processo descrito na jailpágina do manual e no capítulo 14 doManual do FreeBSD, para configurar a árvore de diretórios do jail, envolvendo a construção de uma cópia inteira do sistema operacional dentro do diretório raiz do jail. Um clone do ZFS é uma cópia na gravação rápida, tomando o conjunto de dados raiz real como sua origem.

informação relacionada