我在 Arch Linux 下成功执行了 ./hello.exe(后续)

143 阅读2分钟

日新计划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 文件:

image-20230628214117352.png

image-20230628214142400-1687959703402-1.png

  ??难道……真的是个“打开方式”?!

  然后我写了另一个程序:

image-20230628214441692.png

using System;

while(true){
		Console.WriteLine("Hello Momroe");
}

  借助了一下 KDE 的资源监视器:

  真就打开方式呗?!

  不过可惜的是,我没有找到它是如何配置这种“打开方式”的……