2016-08-03 74 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

兩個很好的答案,那實際上完成對方。我不得不選擇一個...... :-)非常感謝! –