Estou tentando forçar o processo de inicialização de um sistema Linux embarcado para exec()
meu próprio programa de inicialização (systemd) para que eu possa testar um sistema de arquivos externo antes de gravá-lo no flash do sistema (e arriscar bloquear o dispositivo). Com o GDB, posso executar o comando gdb --pid=1
, então nesse tipo de shell call execl("/lib/systemd/systemd", "systemd", 0)
(que funciona exatamente como eu preciso), mas não tenho espaço suficiente para colocar o GDB na flash do sistema.
Eu queria saber exatamente quais ptrace()
chamadas o GDB usa com seu call
comando para que eu possa implementar isso em meu próprio programa C simples.
Tentei usar strace
para descobrir quais ptrace()
chamadas o GDB usava, mas o arquivo resultante tinha 172.031 linhas. Eu também tentei olhar através de seu código-fonte, mas havia muitos arquivos para encontrar o que eu estava procurando.
O dispositivo está executando o kernel Linux versão 3.10.0, a configuração está disponÃvel aqui: https://pastebin.com/rk0Zux62
Aqui está um programa C que deve fazer isso. Observe alguns problemas conhecidos:
CONFIG_ARM_THUMB
entre muitas outras coisas)Compile-o com
-fno-strict-aliasing
, depois execute-o como./a.out 1 /lib/systemd/systemd systemd
.Eu desenvolvi e testei isso via qemu-system-arm com o kernel 3.2.0-4 e a área de usuário wheezy de https://people.debian.org/~aurel32/qemu/armel/