这和系统的装载器有关系,它会根据文件头把对应位置的东西摆成特定的内存布局,修复外部连接的符号之类的,再跳转到入口执行。一般来说不可以,毕竟不同系统的 API 都不一样,但是再不用系统 API 的情况下,可以通过特殊方式修改 PE 文件头让 windows 和 linux 的加载器都能识别,然后就能运行了,但是可以实现的功能很有限。
Gav1nw
2023-01-19 22:48:35 +08:00
比如 Java 常用的包管理器 maven macOS 和 windows 下只是启动文件不一样,但最终都指向同一个二进制文件
0o0O0o0O0o
2023-01-19 22:48:43 +08:00
1. 有关联 2. 有一些魔法 https://justine.lol/ape.html
msg7086
2023-01-19 22:53:49 +08:00
@Gav1nw #4 Windows 的 java.exe 和 macOS 的 java 不是同一个二进制文件。
不行,二进制可执行文件里面都是机器码,不同 CPU 架构的机器码是不一样的。x86 跟 arm 的不一样。
loken2020
2023-01-19 23:12:52 +08:00
操作系统本身也是一个可执行的二进制文件。操作系统也是由多条机器码(汇编指令)堆叠起来的。
wtsamuel
2023-01-19 23:20:04 +08:00
不一定,万一程序用了 win 或者 linux 内核函数
agagega
2023-01-19 23:26:28 +08:00
同一个指令集架构,不同操作系统之间的 ABI 可能完全不一样。
misaka19000
2023-01-19 23:39:10 +08:00
不可以哦
CPU 决定的是指令,不同 CPU 对应的程序的指令(也就是汇编语言或者机器语言机器码)是不一样 同时,不同的操作系统的系统调用( systemcall ,例如 int 0x80 中断)是不一样的;不同操作系统的程序封装格式也是不一样的,例如 Windows 程序的封装格式是 PE ,Linux 是 ELF 格式,不同操作系统解析程序的方式不一样