当前位置: 首页 > Linux

[TIL]binary是怎么执行的

时间:2023-04-06 06:27:23 Linux

会比较乱,因为TIL的主要目的是整理自己的想法而不是分享。如果恰好能帮助到别人就更好了。如果你觉得你感兴趣的部分不清楚,你可以留言,我可以尝试进一步解释。要执行二进制文件,需要CPU和操作系统。CPUCPU可以为某种指令集(如x86、amd64)解释二进制指令有些CPU支持扩展指令集,即不包含在指令集规范中的附加指令。如果在编译二进制文件时启用了这些扩展,则可以在支持扩展指令集的CPU中使用这些功能。可以在运行时检查CPU是否支持某个扩展,因此如果不支持,编译器通常会提供降级分支。操作系统二进制文件可能会使用其他一些库。例如,使用windowsapi的二进制文件无法在linux上运行。在Unix兼容系统上,关键系统API已标准化为POSIX标准。如果一个二进制文件只使用POSIXapi,它可以在任何Unix系统上运行,例如MacOSX或Solaris和其他二进制格式。此外,二进制文件必须选择符合特定操作系统要求的二进制格式,才能被操作系统加载。实施。如Windows广泛使用的PortableExecutableformat(exe文件),Linux广泛使用的ELF格式(ExecutableandLinkableFormat)。最后,如果两个系统:具有相同的系统API,相同的系统库指令集使用相同的二进制文件为一个系统编写的二进制文件可以在另一个系统上运行。x86指令集的二进制可以运行在AMD64指令集中。二进制文件可以指定CPU使用何种模式运行自身。有一些二进制格式允许将多个程序放在同一个文件中。每个程序针对不同的指令集。Apple从PowerPC架构中使用它。转移到x86架构时,使用“胖二进制文件”。有些程序会被编译成中间形式,而不是最终在CPU上执行的二进制,比如java字节码,v8也有字节码优化。这种解决方案需要在不同的指令集上实现自己的虚拟机来运行中间代码,并将其转换为CPU可以运行的真实指令集。如何运行。编译时可以指定目标CPU,如果不指定,编译器通常使用当前CPU,只使用该CPU及其低版本支持的指令集。如果你想使用一个只有你的CPU支持的新指令,你需要告诉编译器,或者自己用汇编写。但是通过这种方式,如果在不支持修改后的指令的CPU上运行,您将获得一个二进制文件,该二进制文件将崩溃。指令集的由来原始的二进制文件是为特定的CPU编写的,无法执行。在另一个模型中,提出了一个指令集来解决这个问题。只要不同的CPU支持相同的指令集,相同的二进制文件就可以在这些不同的CPU上运行交叉编译,将一个系统中的二进制文件编译到另一个不同的系统中,比如在windows中编译可以在linux中运行的二进制文件,只要由于两个设备的CPU支持相同的指令集,相同的二进制文件可以在两个设备上运行吗?不,这还取决于操作系统的系统API是否兼容。例如,同样的硬件可以安装linux和windows系统,但是windows中的应用程序却无法在linux中运行。CPU支持的指令集是什么?指令,比如我们有一个CPU,它支持如下指令:写寄存器a读寄存器a写寄存器b读寄存器b将第一个数和第二个数相加,并将结果写入寄存器a。我们写了一段代码“1x3+2=?”就是target,编译后的二进制是:a寄存器写1,b寄存器写1,b寄存器加1,b寄存器加2,读寄存器a以上的指令都可以在这个CPU中执行,但是如果你这样写二进制写1注册a写3注册b乘法<<<<写3注册b添加读寄存器a这个二进制不能在这个CPU中执行,因为它不支持的指令被用来"乘"SystemAPI操作系统提供的API是什么常见的API有POSIX:UNIX,LINUX,MacOSX等Win32:Windows提供的Java虚拟机字节码的API也是一种SystemAPI,不是完全基准化。例如Win32包含了GUI相关的API,比如创建窗口,但是POSIX并没有假设有这样一个OSA,它的窗口必须有,而且只有一个标题,当二进制想创建自己的窗口时,你可以调用这个OS提供的一个APIcreate_window("Helloworld"),这样你就可以创建一个标题为Helloworld的窗口,然后假设另一个OSB,它的窗口必须有标题和副标题,它提供的API可能是`create_window("Helloworld","subtitle")如果之前的binary在这个OS中执行,明显少了参数,它们是不兼容的,所以虽然CPU可以执行二进制,但如果SystemAPI不兼容,程序仍然可能会崩溃。例如,为了在OSB中运行OSA的应用程序,wine等应用程序可能会在收到create_window("Helloworld")时将其翻译为create_window("Helloworld","__SPOOF__"),这样OSB得到了他想要的两个参数,但缺陷是所有通过兼容层运行的OSA应用程序都会有相同的副标题“__SUB_TITLE__”。这种系统API差异有时可以完美翻译,但有时也可能存在缺陷,如本例所示。什么是二进制格式将内容组织成二进制文件的规则假设一个二进制格式A,规则以N字节开头如下:我是格式A,我的目标架构是AMD64,我使用bigendian/littleendian,应该我从地址开始执行,等等等等,等等,等等,等等,等等,等等,等等,等等,等等,等等,等等,等等,等等,等等,等等,等等,等等,等等,呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜blahblahByte,获取各种信息创建内存空间,加载可执行指令到内存中,从指定地址开始执行指令。如前所述,POSIX没有与GUI相关的API。wine如何在linux中运行windowsgui应用程序?Wine使用GUI相关的APIsAPI被翻译成X11。想单独开一篇X11(QT、GTK、GNOME等小弟)的文章,也很有意思。参考https://www.geeksforgeeks.org...