为什么同一个程序不能在两种操作系统上分别运行?

最初试解:
你可以这样想一下, 为啥记事本不能打开 .map4 的文件?因为记事本只能打开 .txt 类型的文件。

由程序进行探索:
你可以看看下面这段函数:
在这里插入图片描述
然后进行编译,反汇编:
在这里插入图片描述在这里插入图片描述
虽然两个函数的起止地址都是从00000…开始的,那在主函数中 call sub 函数时,怎么知道调用函数的入口在哪呢? 如果我们直接执行这个 test.o 文件时,是会报错的。

第一个报错原因是因为没有权限:
在这里插入图片描述
当我使用 chmod 改变权限,使其有执行权限时,会报啥错呢?
在这里插入图片描述正如你所看到的,无法执行二进制文件。

我们从比编写代码到最后执行的步骤是:
源代码 --》 编译器 --》汇编码 --》 汇编器 --》 机器码

这里的 test.o 文件是目标文件,并不是可执行文件。
一般要经历两个大的方向才可成执行文件:
1 , 编译,汇编,链接----》可执行文件
2, 装载器,可执行文件—》load --> 内存
在这里插入图片描述
ELF : 框住函数即一切家属

在这里插入图片描述
ELF作用:
在这里插入图片描述
过程:
首先操作系统会扫描 ELF 格式的文件,取出每个文件内的符号表合并成全局符号表,然后查看 重定位与解析符号表调整源码中的程序入口。(就像上面代码中 sub , main 的地址都是从 0000… 开始的)然后将 代码段和数据段 加载如链接文件,装载器载入内存,CPU开始读取内存指令。

总结:
我想到这里你应该知道了,为啥同一个 CPU 不同的操作系统却不能执行同一个可执行文件,最本质的原因是 文件格式不同。 Linux 的文件是 ELF 而 windowns 的是 PE。但有些软件可以是 OS 兼容的,但从性能方面考虑并不是那么理想。

发布了51 篇原创文章 · 获赞 65 · 访问量 3246

猜你喜欢

转载自blog.csdn.net/weixin_44678969/article/details/103416319