日新计划6月更文 Day 28
这个故事还没结束,我们继续!
其实我不想继续这个故事了,因为我在 一个 Arch Linux 的 Docker 容器内没有成功,结果刚才在 Ubuntu 20.04 又成功了……
上文提到了“ELF”文件,ELF 文件按照功能分为“可重定位文件”、“可执行文件”、“共享目标文件”和“内核转储文件”:
- 可重定向文件:Relocatable File,常见的是使用 gcc 编译程序得到的未链接的
.o文件 - 可执行文件:Executable File,可被直接执行的 ELF 文件,定义了exec() 如何创建一个程序的进程映像
- 共享目标文件:Shared Object File,即 GNU/Linux 的动态库文件
.so
ELF 文件有两种理解方式——连接视图和执行视图。二者的格式如下:
| 链接视图 | 执行视图 |
|---|---|
| ELF 头部 | ELF 头部 |
| 程序头部表 | 程序头部表 |
| 节区*m(m>=n) | 段*n |
| 节区头部表 | 节区头部表(可选) |
我们可以使用 readelf 查看 ELF 文件的信息、如头部信息(readelf -h)、节区(Section)和段(Segment)的对应关系(readelf -l)等。
其实,PE 文件也不止有一种,比如可执行文件(.exe)、动态链接库文件(.dll)等,甚至为了兼容()DOS,保留了 DOS 可执行文件头。
但是……为什么在 Arch Linux 下可以直接运行一个 PE 文件这件事,我还是没找到答案,我想了各种方案——
- 用 ELF/Shell 脚本“包装”了一下这个文件?但用 hexyl 查看这就是个 PE 文件啊
- 让内核支持解析 PE 文件?这改动挺大的,不换内核或者上 dkms 什么的做不到
再结合 Docker 里的 Arch 做不到但 Ubuntu 做得到,这是越来越邪门……然后我在 Dolphin( KDE Plasma 的一个资源管理器)里“双击运行”了这个 PE 文件:
??难道……真的是个“打开方式”?!
然后我写了另一个程序:
using System;
while(true){
Console.WriteLine("Hello Momroe");
}
借助了一下 KDE 的资源监视器:
真就打开方式呗?!
不过可惜的是,我没有找到它是如何配置这种“打开方式”的……