最后更新2021/12/16
qemu(4.x)/linux-user/mmap.c 里target_mmap如果offset不是aligned有问题,前面检测后直接退出了,后面做了pread,但走不到这个地方。修改一下,看看效果如何。
如前所说,两种格式差别比较大,不知道谁更优秀,也许是ELF变种太多,年代跨越过久,支持架构跨越很多,导致不得不弄出很多section分别处理。目前我所了解到的xcoff只有那么几个标准的段,以后看复杂的大程序如何实现。
map过程有点乱,走了一天也没全走通,mmap.c里面的几个程序逻辑有点怪异。不管它了,能用就用,不能用就自己写,先把这部分走过去再说。还有一个大小端也挺讨厌的。明天继续。
ELF还有一个interpreter概念,大概类似xcoff的depency或者说libc?又不太像,但关系很密切,先bypass掉。
============================================
map问题不大,但ELF和XCOFF两者结构差别太大,qemu linux-user里大部分实现都配不上,map之后看来要彻底分道扬镳,等到tcg执行的时候再回归吧。
resolve和relocate在别的程序里已经实现,估计copy过来基本没问题,所要做的只是把对应的数据尽力保存在和elf info相关结构类似或者对等的位置。下面一个最重要课题是在什么地方触发返回host api。linux-user还没研究透,看起来是sc(system call)特定指令触发exception,中断tcg执行,然后返回host api。与之对应,jump to 特定地址是否可以呢?应当是可以的,至少我觉得应该没问题。那就可以直接把重定位定义到这个特殊地址,然后返回host。如果不可以,那就要在wrap call里面用特定指令显式地触发。具体哪一种方案,待研究。几天能出结论???
============================================
目前研究结果:
qemu linux-user可以使用sigact_table[sig - 1]触发signal对应的动作,
if (!sig) {
sa = NULL;
handler = TARGET_SIG_IGN;
} else {
sa = &sigact_table[sig - 1];
handler = sa->_sa_handler;
}
if (do_strace) {
print_taken_signal(sig, &k->info);
}
if (handler == TARGET_SIG_DFL) {
/* default handler : ignore some signal. The other are job control or fatal */
if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
...
}
...
}
也就是用exception是可以触发host动作的,但似乎这并非qemu linux-user触发host syscall的方案,一会儿再去看看tcg对sc指令的解码,不是exception,那就应该是tcg实现了。与之对应,可以考虑对ba(jump)tcg指令进行控制,只要jump的目标地址是特定的relocation wrap libc地址,那就trigger host对应的处理。也就是在qemu softmmp里对地址进行验证时搞定。继续验证。