qemu-linux-user ELF vs XCOFF 2

最后更新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里对地址进行验证时搞定。继续验证。

你可能感兴趣的:(aix,xcuse,QEMU,linux,xcuse)