我正在尝试将嵌入式 Linux 系统的 init 进程强制执行到exec()
我自己的 init 程序(systemd),以便我可以在将外部文件系统写入系统的闪存之前对其进行测试(并冒着使设备变砖的风险)。使用 GDB,我可以运行 command gdb --pid=1
,然后在那个 shell 类型中运行call execl("/lib/systemd/systemd", "systemd", 0)
(它完全按照我的需要工作),但是我没有足够的空间将 GDB 放在系统的闪存上。
我想知道ptrace()
GDB 的call
命令到底使用了什么调用,以便我可以在自己的简单 C 程序中实现它。
我试图strace
找出ptrace()
GDB 使用了什么调用,但生成的文件有 172,031 行长。我也尝试过查看它的源代码,但是文件太多,无法找到我要查找的内容。
该设备运行 Linux 内核版本 3.10.0,配置可在此处获得:https ://pastebin.com/rk0Zux62
这是一个应该执行此操作的 C 程序。注意几个已知问题:
CONFIG_ARM_THUMB
许多其他东西中的硬代码)编译它
-fno-strict-aliasing
,然后运行它./a.out 1 /lib/systemd/systemd systemd
。我通过 qemu-system-arm 使用 3.2.0-4 内核和来自https://people.debian.org/~aurel32/qemu/armel/的 wheezy 用户区开发和测试了它