可能是一个愚蠢的问题,但我无论如何都会尝试:
当你把一个shell脚本变成一个可执行文件时,它会使用shebang来知道你运行它时要使用哪个解释器。C代码/script/程序使用/有类似的东西吗?
在一个可执行的C程序的开头有什么神奇的数字吗?
是。
C程序可执行文件(以及所有编译的语言)以"神奇"字符0x7f
E
L
F
开头。Linux内核识别这一点的方式与识别shebang脚本的方式相同,只是它会触发ELF加载程序,而不是脚本解释器。
它实际上并不是shebang,但它是类似的。
shebang被shell*用来识别需要预先启动可执行程序的脚本,该脚本将作为参数给定。
例如,名为"myscript.pl"的脚本,具有可执行访问权限
#!/usr/bin/perl
# perl script
shell看到#!
并启动这样的过程:
/usr/bin/perl myscript.pl
编译后的C程序是直接可执行的,它们的"幻数"是而不是,可以说它是/曾经是C程序。幻数意味着它是一个适合操作系统的特定可执行文件,然后可执行的机器代码(从给定地址开始)将由/a处理器直接执行。
*历史上,炮弹负责探测射弹。现在内核直接执行(参见下面的注释)。
经过一番搜索,我想我理解了以下内容(尽管我不能100%确定):
一些编程语言,如bash、python、php和其他语言使用解释器,因此可能需要shebang。与编译器不同,解释器每次调用程序代码时都会将程序代码翻译成机器语言。
C不使用解释器,而只使用编译器——它只将代码转换为可执行文件/对象文件一次。
所以答案是-不-c代码不需要shebang。
术语"幻数"实际上比脚本更适用于编译后的程序。在shebang发明之前,就已经有了识别可执行文件的神奇数字。
幻数是任何固定偏移量的短字节序列(通常是文件的开头),旨在使程序能够快速决定文件的格式。有ELF幻数、PNG幻数、gzip幻数。。。
shebang是对幻数原理的模仿。
此外,在ELF中有一个叫做ELF解释器的东西,内核必须知道它,它类似于脚本解释器。如果ELF可执行文件有解释器,内核将在解释器的入口点而不是主可执行文件的入口点启动程序。每个动态链接的程序都使用此功能。动态链接器是ELF解释器。