这是说,在linux下,与Windows,有没有可执行文件和其他文件之间有明确的交界。
好吧,在Windows中,我编写了一个C ++程序,然后对其进行了预编译,编译,然后链接成一个独特的文件:可执行文件。变化是如此之大,以至于它们是不可逆的。
但是在Linux中,将执行一个包含代码的简单文本文件。那么编译和链接有什么作用?如果执行了代码,为什么要编译?在此过程中有什么好处,代码与Linux中最终的(所谓的)可执行文件之间的主要区别是什么?为什么程序的可移植性在Linux中受到限制,并且如果它们是代码,则需要很多(特定于版本的)依赖性要求?
tl; dr:区别在于可执行位。
答案在于UNIX权限模型。老实说,我忘记了Windows权限模型是什么,但是在UNIX(以及GNU / Linux)中,可以在文件上设置三个主要的权限位:读取,写入和执行。这些位可以在任何对象上设置。您想要设置可执行位的文件有两种主要类型:
第一种类型.exe
与Windows中的完全一样。唯一的区别是文件的执行能力由文件系统中的权限位而不是文件扩展名决定。二进制仍然具有与.exe
s相同的格式。在GNU / Linux上,此格式称为ELF。Linux内核具有特殊的逻辑,该逻辑告诉它如何读取ELF二进制文件的格式。当您执行二进制文件时,正是这种逻辑实际在运行代码。
使您感到困惑的部分是可执行文件的第二种类型:脚本。脚本是常规的文本文件,可由解释器(例如python
或)执行bash
。脚本以“ shebang”开头,如下所示:#!
。当“执行”脚本时,内核会识别出shebang并执行其后指定的任何二进制文件,并将您正在执行的脚本的路径作为参数。
例如,假设我有一个脚本,该脚本的path处设置了可执行位/home/alex/bin/test_script
。该脚本的第一行内容如下:
#!/bin/bash
当您执行此脚本时,内核将在开始时识别出shebang。然后它将加载/bin/bash
并/home/alex/bin/test_script
作为第一个参数传递。这等效于在命令行上执行以下操作:
/bin/bash /home/alex/bin/test_script
以这种方式,bash
被加载来解释或“执行”脚本。
顺便说一句,从源到二进制的更改并不是很大,以至于无法撤消。从二进制文件中检索源代码称为反编译。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句