08 | ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
该思维导图由 AI 生成,仅供参考
编译、链接和装载:拆解程序执行
- 深入了解
- 翻译
- 解释
- 总结
本文深入分析了C语言程序在Linux和Windows下无法通用的原因。首先介绍了C语言代码编译、链接和装载的过程,以及生成可执行文件的方法。通过实例演示了编译、链接和装载的过程,揭示了程序在不同操作系统下无法通用的原因。文章指出,不同操作系统对可执行文件的格式和加载方式不同,导致同一程序无法在不同操作系统上执行。此外,还介绍了Linux下的ELF文件格式和Windows下的PE文件格式,以及通过兼容PE格式的装载器在Linux下运行Windows程序的可能性。最后,推荐了深入了解程序链接过程和ELF格式的阅读材料,并提出了课后思考的问题。整体而言,本文对程序在不同操作系统下无法通用的原因进行了深入浅出的解释,对读者快速了解程序跨平台运行问题具有重要参考价值。
《深入浅出计算机组成原理》,新⼈⾸单¥68
全部留言(64)
- 最新
- 精选
- 奕老师,我曾经在linux上使用过wine,有好多window软件不能很好兼容的运行,这是为什么呢?是不是除了执行文件格式之外,还有其他的因素影响软件的运行呢?
作者回复: 一步同学你好,当然,因为很多程序还依赖各种操作系统本身提供的动态链接库,系统调用等等。需要wine提供对应的实现,兼容格式只是万里长征第一步。
2019-05-13267 - 有米Java的跨平台运行是如何做到的呢?跟本节内容有关系吗?
作者回复: Java是通过实现不同平台上的虚拟机,然后即时翻译javac生成的中间代码来做到跨平台的。跨平台的工作被虚拟机开发人员来解决了
2019-05-1357 - 二星球老师好,就是没有操作系统,直接在硬件上运行的可执行程序,其格式应该不是pe或elf,应该是纯的机器指令吧,pe或elf格式的可执行程序是跟操作系统绑定的,经过翻译后成为纯机器指令,才能被执行,不知道这样理解对不。
作者回复: 可以这样理解。实际机器启动加电的时候是从BIOS去读取MBR,再加载操作系统等等。 PE和ELF是在操作系统加载之后的事情了。
2019-05-18431 - 二星球老师好,我有个问题,就是我可以用编程语言写一个不依赖操作系统的可执行程序,这个可执行程序不是pe格式,也不是elf的,那为什能执行呢,是不是因为这个可执行程序全是纯的cpu指令,没有其他要解析的东西?
作者回复: 如果不是pe格式也不是elf格式,就不能执行啊。能执行是因为实际执行的不是你的程序。比如你写了一段python代码,实际执行的是python解释器,而不是你的py代码
2019-05-13228 - 陆离高级语言都是先编译成汇编语言,再汇编成机器码执行的吗?
作者回复: 如果是编译型的语言都是这样的。 也有通过解释器,或者虚拟机,转换成实际的机器码指令执行的。
2019-05-2324 - Spring补充一下: ELF其实是一种文件格式的标准,ELF文件有三类:可重定向文件、可执行文件、共享目标文件。代码经过预处理、编译、汇编后形成可重定向文件,可重定向文件经过链接后生成可执行文件。 另外我想请教一下,机器码是在哪一步形成的?
作者回复: 简单地说,可以认为是在汇编之后变成了机器码放在了elf的代码段里。
2019-05-1322 - 有铭所以理论上,只要不涉及到windows和linux的系统api调用,理论上只要搞定了可执行文件格式这个问题,那么C程序就是二进制可移植的?
作者回复: 除了系统调用,还要考虑是否有动态链接库的依赖等等
2019-05-1316 - 被过去推开Java的类加载是由jvm完成,大致过程为装载-链接-初始化-运行,所以是jvm帮我们屏蔽了操作系统之间的差异。为了加快程序启动速度,一些类会延迟加载,所以jvm中有很多动态链接。
作者回复: 👍
2019-08-12214 - kdb_reboot这里(gcc -g -c add_lib.c link_example.c)需要extern int addd(int a, int b);
作者回复: 没错,不过其实你不加入对应的申明编译和运行也是能执行的,但是会有编译器的告警。
2019-05-268 - 曾经瘦过mark 后面去读一读 程序员的自我修养
作者回复: 👍这本书对于做系统开发的同学是必读书目之一。
2019-05-1337