最后更新2021/01/21
静心研究了小半年,终于把原型验证搞定了,可以在Power Linux上直接运行AIX程序。当然,目前只是实现了POC,还有大量的工程工作。源代码地址:
https://gitee.com/HarryHurryHungry/xcuse
实现了什么
- 32位AIX xcoff程序,既xcoff32模式的二进制目标码程序可以无需源代码移植、重编译,即可直接在标准Power Linux操作系统被执行,只要是Power CPU的服务器(包括虚拟机及其它ISA指令集CPU虚拟Power CPU)既可被执行;
- 被加载程序无需AIX操作系统,直接可以跑在Power Linux之上。Linux可以是目前任何主流Linux,目前实现基于Centos PPC64 7,下载自:https://mirrors.tuna.tsinghua.edu.cn/centos-altarch/7.9.2009/isos/ppc64/CentOS-7-ppc64-Everything-2009.iso
- 如果硬件CPU也是Power,则完全是Native执行,没有二进制转换、指令虚拟、指令解释等性能损失。实现理论与x86平台WINE相同。关于WINE的介绍请参考https://wiki.winehq.org/%E4%B8%BB%E9%A1%B5
- 如果硬件CPU非Power,可以使用指令模拟器,当然软件解释的性能就差了不少,但对于日常开发,性能足够。事实上本Demo程序就是在intel i7处理器的笔记本电脑开Power虚拟机完成的。
Demo程序的局限
目前尚在技术原型验证阶段,特别是Demo程序中只包含了非常少的库函数和功能支持,例如:
- 仅支持32bit xcoff程序(xcoff32格式);
- 仅支持与demo配合的演示程序所使用的printf,malloc等几个库函数;
- 不支持除libc.a之外的动态链接库;
Demo程序源代码(这个不是Demo,是Demo的demo,是测试用的AIX程序源代码)
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv, char **env)
{
int i;
printf("I got argc: %d\n", argc);
for (i=0; i< argc; i++) {
printf("arg %d: %s\n", i, argv[i]);
}
for(i=0; env[i]!=NULL; i++) {
printf(" env[%d]:%s\n", i, env[i]);
}
printf("call result: 55aa\n");
exit(0);
}
gcc -m32 main.c -o aixprintf32
程序执行输出:
[root@ppc64 xcoff]# ./ldxcoff32 ./aixprintf32 abcdef
XCOFF32 Loader for Power Linux
Limited version for POC only
Contact: ensighine@yahoo.com
************* output of program loaded *************
I got argc: 2
arg 0: ./aixprintf32
arg 1: abcdef
env[0]:XDG_SESSION_ID=2
env[1]:HOSTNAME=ppc64
env[2]:TERM=vt220
env[3]:SHELL=/bin/bash
env[4]:HISTSIZE=1000
env[5]:OLDPWD=/home/harry/xcoff/example
env[6]:USER=root
env[7]:LS_COLORS=
env[8]:MAIL=/var/spool/mail/root
env[9]:PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
env[10]:PWD=/home/harry/xcoff
env[11]:LANG=en_CA.UTF-8
env[12]:HISTCONTROL=ignoredups
env[13]:SHLVL=1
env[14]:HOME=/root
env[15]:LOGNAME=root
env[16]:LESSOPEN=||/usr/bin/lesspipe.sh %s
env[17]:XDG_RUNTIME_DIR=/run/user/0
env[18]:_=./ldxcoff32
call result: 55aa
- Demo代码下载地址:
https://gitee.com/HarryHurryHungry/xcuse
如果没有Power Linux环境,可以下载qemu和centos自己在x86服务器上创建虚拟机安装,具体过程请参考:https://blog.csdn.net/xxb249/article/details/79608909
常见问题
- ldxcoff32无法执行。你是否在Power Linux上执行此程序?特别是是否是大端PowerLinux?在比较生僻、比较旧的大端Power Linux上可能也会有执行问题,本人并未在其它版本进行过严格测试(毕竟只是demo),请先用本文中下载地址的centos试一试,如果还不行,可以直接联系我
- 试图加载64位xcoff程序。本demo是非常限制版本,不提供对64位xcoff支持,如果你遇到类似如下显示,是由于demo局限,你要加载的是64位的xcoff程序,请换其它32位程序测试
[root@ppc64 xcoff]# ./ldxcoff32 ./aixprintf64
XCOFF32 Loader for Power Linux
Limited version for POC only
Contact: ensighine@yahoo.com
step7.c/225/ldxcoff64: can not process xcoff64 member
step7.c/110/main: error, exit
- 被加载程序调用的库函数并未在ldxcoff32中有对应的仿真。需要将对应的仿真程序链接到ldxcoff32程序中。如果你确有此需求,请与本人联系。
[root@ppc64 example]# ../ldxcoff32 ./grep
XCOFF32 Loader for Power Linux
Limited version for POC only
Contact: ensighine@yahoo.com
resolve.c/103/resolve: can not resolve ___strcmp symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve ___memset symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve ___memmove symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve ___fill symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve ___strcpy symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve __lc_charmap symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve __lc_ctype symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve __flsbuf symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve __filbuf symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve regcomp symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve regerror symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/103/resolve: can not resolve regexec symbol from imp ifile: /usr/lib/libc.a shr.o
resolve.c/197/resolve: there are unresolved symbols: 12
step7.c/176/ldxcoff32: Resolve ./grep error: -12!
- 其它问题,大部分都是由于调用函数仿真或者相关联文件不存在导致。另外,不排除程序运行就core dump,可能是由于对应的函数仿真有问题,请把信息发送给我,我会陆续修改。
后续
如果你对本项目感兴趣,请直接留言或与本人联系。