好。我交叉编译了qemu for android,当我使用用户模式运行程序时,它显示有一个不受支持的ioctl调用。例如,我跑了:
dir
它给了我
./qemu-aarch64 /system/bin/wificond
所以我认为我可能想要做的是手动添加ioctl调用。但问题是我只知道cmd号,我怎么能弄清楚应该添加什么?谢谢!
答案 0 :(得分:1)
你需要做的第一件事是找出它是哪个ioctl。遗憾的是,这有点尴尬。一种方法是使用本机strace对二进制进行strace,并希望它为您打印ioctl符号。或者你可以查看内核头文件。通常使用include / uapi / asm-generic / ioctl.h中的_IOC宏定义ioctl,它们从一组字段构造它们,因此您必须通过guesswork-and-grep尝试从中找出正确的一个。数。这里0xc0046209的“类型”为0x62,即ASCII“b”和数字0x09,即
#define BINDER_VERSION _IOWR('b', 9, struct binder_version)
(实际上我们可能已经从错误消息中猜到了无法打开活页夹驱动程序)。
所以你需要做的是在Android绑定器API ioctls的QEMU仿真中实现。希望你的主机系统也是Android,因为非Android主机内核不会有绑定器设备。
添加额外ioctl的难度很大程度上取决于它们的参数,因为参数需要从guest虚拟机的数据布局转换为主机。如果ioctl参数是简单类型,那么主要是在linux-user / ioctls.h中提供IOCTL()行并在linux-user / syscall_defs.h中定义TARGET_IOCTLNAME - 例如上游QEMU commit d6d6d6fe17fa,它添加了RND * ioctls。当参数是由基本类型组成的结构时,事情就不复杂了 - 例如commit 21992cb6794a5f8。在最坏的情况下,您需要提供一个自定义函数来转换参数,如提交2b74f621f1c780中的TIOCGPTPEER所示。