二进制文件和操作系统有联系吗?

2023-01-19 22:41:45 +08:00
 Gav1nw
二进制文件和处理器架构有关,和操作系统呢?排除调用到特定操作系统运行库的情况,一个二进制文件可以同时在特定架构如 arm x86 等 的所有操作系统运行吗?
4268 次点击
所在节点    程序员
38 条回复
JingKeWu
2023-01-19 22:43:48 +08:00
应该不能 操作系统可运行程序 都是特定数据结构的二进制,不同操作系统 数据结构不一样
SAGAN
2023-01-19 22:46:58 +08:00
koast
2023-01-19 22:47:28 +08:00
这和系统的装载器有关系,它会根据文件头把对应位置的东西摆成特定的内存布局,修复外部连接的符号之类的,再跳转到入口执行。一般来说不可以,毕竟不同系统的 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 不是同一个二进制文件。
adoal
2023-01-19 23:01:37 +08:00
如果多花点心思精心去构造,可以得到一个在同架构 CPU 的好几个操作系统里都能跑的可执行文件。

但是这是一种极端情况。构造出来的程序只能做简单的 PoC ,对于实际使用价值的程序来说,几乎不可能做到,因为一个实际使用价值的程序至少要依赖系统的动态链接库去干实际的活。
loken2020
2023-01-19 23:11:59 +08:00
不行,二进制可执行文件里面都是机器码,不同 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 格式,不同操作系统解析程序的方式不一样
misaka19000
2023-01-19 23:40:27 +08:00
jim9606
2023-01-19 23:40:53 +08:00
一般是不能,无法避免与操作系统打交道的。
裸机程序倒是可以,参考裸机 hello world

https://zhuanlan.zhihu.com/p/420610342

好像还有一种混合二进制,将 bsd 和 linux 的代码段混合在一个 ELF 里面,但做不到任意 OS ,至少 Windows 这种不使用 ELF 格式的就不好搞。
AzadCypress
2023-01-19 23:45:59 +08:00
linux 可执行文件文件是 elf 格式 windows 是 pe 格式
详细的可以看 [程序员的自我修养:链接、装载与库]这本书
levelworm
2023-01-20 00:01:59 +08:00
如果设计的比较精巧,那么某种情况下,同一个二进制文件的确可以在多个架构下运行。参加这篇文章:
https://www.robertxiao.ca/hacking/defcon2018-assembly-polyglot/
CEBBCAT
2023-01-20 00:14:27 +08:00
发帖前 Google 了吗?
Tink
2023-01-20 01:06:07 +08:00
二楼发的那个有点意思啊
dcsuibian
2023-01-20 04:56:07 +08:00
Maven 本身就是用 Java 写的,和.class 程序或可执行.jar 没啥区别,所以要先装 Java 且设定好 JAVA_HOME

虽然.class 是跨平台的,但它是要运行在 Java 虚拟机上的,而提供 Java 虚拟机的 JDK/JRE 程序不是跨平台的

所以你在下载 JDK/JRE 的时候要指定操作系统、架构,下载 Maven 、ZooKeepr 、JMeter 等的时候不会区分什么系统
fzdwx
2023-01-20 08:04:28 +08:00
可以了解下指令集?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/909970

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX