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

### 安装 QEMU 用户模式和系统模式组件 为了在 Ubuntu 上安装 QEMU 的用户模式 (`qemu-user`) 和系统模式 (`qemu-system`) 组件,可以按照以下方式操作: #### 使用 `apt-get` 安装 QEMU 用户模式 通过执行以下命令来安装 QEMU 用户模式支持的包: ```bash sudo apt-get update sudo apt-get install qemu-user ``` 这会安装多个目标架构的支持工具,例如 `qemu-arm`, `qemu-mips` 等[^2]。 #### 使用 `apt-get` 安装 QEMU 系统模式 对于 QEMU 系统模式的支持,则需要安装 `qemu-system` 包及其子包。可以通过如下命令完成安装: ```bash sudo apt-get update sudo apt-get install qemu-system ``` 此命令将会安装一系列针对不同体系结构的仿真器,比如 `qemu-system-x86_64`, `qemu-system-arm`, `qemu-system-mips` 等。 需要注意的是,在某些情况下可能还需要额外配置二进制格式支持以便更好地兼容其他平台的应用程序。尽管现代版本中通常不再需要手动安装 `qemu-binfmt`,但仍可创建相应目录作为备用措施: ```bash sudo mkdir -p /etc/qemu-binfmt ``` 如果希望从源码编译最新版 QEMU 而不是依赖于官方仓库中的预构建版本,也可以参考下载链接并解压源代码档案文件后再继续后续步骤[^3]: ```bash wget https://download.qemu.org/qemu-7.2.0.tar.xz tar xvJf qemu-7.2.0.tar.xz cd qemu-7.2.0/ ``` 当尝试运行嵌入式固件时可能会遇到缺少必要库的情况;此时应确保所有依赖项均已正确加载到环境中或者调整路径使得 QEMU 可以定位这些资源[^4]。 最后提醒一下关于启动虚拟机实例的具体参数设置,请参照实际需求指定合适的选项以及镜像文件位置等信息[^5]。 ```bash qemu-system-mips \ -kernel vmlinux-3.2.0-4-4kc-malta \ -hda debian_wheezy_mips_standard.qcow2 \ -append "root=/dev/sda1 console=ttyS0" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ensighine

如需特定专题,踢我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值