2016-08-03 71 views
-2

可能是一个愚蠢的问题,但我会尽力尝试:C源代码/脚本/程序是否使用类似shebang的命令?

当您将shell脚本转换为可执行文件时,它使用shebang知道在运行时使用哪个解释器。 C代码/脚本/程序使用/有类似的东西吗?

在可执行的C程序的开头是否有任何幻数?

+0

这是一个纯文本文件,几乎总是以'.c'扩展名保存。 –

+0

@MohitJain我说的是可执行文件,而不是c脚本(或者c脚本中是否有一些隐藏的行吗?) –

+0

这不是脚本。有关ABI的详细信息,请阅读:[ABI](https://en.wikipedia.org/wiki/Application_binary_interface)和[ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) –

回答

1

是的。

C程序可执行文件(和所有编译语言)以“魔术”字符开头0x7fELF。 Linux内核可以像识别shebang脚本一样识别它,只不过它会触发ELF加载器,而不是脚本解释器。

这不是实际上 shebang,但它是类似的。

0

一些谷歌-ING之后,我想我明白以下(虽然我不是100%确定):

一些编程语言如bash,Python和PHP等语言使用的翻译 - 等等可能需要一个shebang。与编译器不同,解释器每次调用时都会将程序代码翻译为机器语言。

C不使用解释器,而只使用编译器 - 它只将代码翻译成可执行文件/对象文件一次。

所以答案是 - NO - c代码不需要shebang。

0

术语“幻数”实际上比脚本适用于编译后的程序。在shebang被发明之前,已经有魔术数字来识别可执行文件。

幻数是固定偏移量(通常是文件的开头)的任何短字节序列,用于使程序能够快速决定文件的格式。还有一个ELF幻数,一个PNG幻数,gzip幻数...

shebang是一种模仿的幻数原则。

此外,在ELF中,这是一种称为ELF解释器的东西,内核必须知道它,它类似于脚本解释器。如果一个ELF可执行文件有解释器,内核将在解释器的入口点而不是主要可执行文件的入口点启动程序。每个动态链接的程序都使用此功能。动态链接器是ELF解释器。

1

认领使用由*识别一个脚本,需要一个可执行程序,以事先开始,向其中脚本将被给定为参数。

E.g.脚本名为“myscript。PL”,具有可执行访问权限

#!/usr/bin/perl 
# perl script 

外壳看到#!并开始这样的过程:

/usr/bin/perl myscript.pl 

编译的C程序直接执行,而他们的‘幻数’是说它是/ C程序,幻数表示它是一个适合操作系统的特定可执行文件,并且可执行的机器代码(从给定地址开始)将由/ a处理器直接执行。

*历史上,壳是负责检测shebang。现在内核直接使用它(见下面的注释)。

+1

shebang line内核*会识别它。 Shell不需要自己解析它 –

+0

从历史上看,它是shell(https://en.wikipedia.org/wiki/Shebang_(Unix)#History),但现在它确实是内核。 –

+0

两个很好的答案,那实际上完成对方。我不得不选择一个...... :-)非常感谢! –