導航:首頁 > 源碼編譯 > gcc編譯成elf文件

gcc編譯成elf文件

發布時間:2023-07-11 23:58:58

1. /usr/bin/ld: cannot find crt1.o: No such file or directory就這一個錯誤,導致無法編譯出可執行文件。

GCC當前的體系結構是64位的,但是需要32位的支持文件,所以需要安裝GCC-multilib。

終端輸入命令如下:sudoaptinstallgcc-multilib。

程序編譯成可執行的exe文件的方法:

1.編寫一個簡單的代碼,如下圖所示,然後編輯一個簡單的output語句。

2. linux 怎麼編譯c的源程序的gcc,編譯命令是什麼

在Linux下面,如果要編譯一個C語言源程序,我們要使用gcc編譯器。

先將源文件編譯成目標文件:gcc - c hello.c

生成hello.o文件,再將目標文件編譯成可執行文件:gcc -o hello hello.o

如:

int main(int argc,char **argv)

{

printf("Hello Linux ");

}

(2)gcc編譯成elf文件擴展閱讀:

在使用GCC編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,這里只介紹其中最基本、最常用的參數。具體可參考GCC Manual。

GCC最基本的用法是∶gcc [options] [filenames]

其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。

網路_gcc

3. 怎麼用gcc編譯文件

在終端中輸入 gcc 文件名 -o 目標文件名x0dx0a然後 ./目標文件名 就行了,沒有目標文件名,自動存為 ax0dx0a執行 ./a 就行了。x0dx0ax0dx0a在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。x0dx0aGCC最基本的用法是∶gcc [options] [filenames]x0dx0a其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。x0dx0a-c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。x0dx0a-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。x0dx0a-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。x0dx0a-O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。x0dx0a-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。x0dx0a-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶x0dx0aA)#include x0dx0aB)#include 「myinc.h」x0dx0a其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目標文件的文件夾內搜索相應文件。 x0dx0ax0dx0aGCC執行過程示例x0dx0ax0dx0a示例代碼 a.c:x0dx0a#include x0dx0aint main()x0dx0a{x0dx0aprintf("hello\n");x0dx0a}x0dx0a預編譯過程:x0dx0a這個過程處理宏定義和include,並做語法檢查。x0dx0a可以看到預編譯後,代碼從5行擴展到了910行。x0dx0agcc -E a.c -o a.ix0dx0acat a.c | wc -lx0dx0a5x0dx0acat a.i | wc -lx0dx0a910x0dx0a編譯過程:x0dx0a這個階段,生成匯編代碼。x0dx0agcc -S a.i -o a.sx0dx0acat a.s | wc -lx0dx0a59x0dx0a匯編過程:x0dx0a這個階段,生成目標代碼。x0dx0a此過程生成ELF格式的目標代碼。x0dx0agcc -c a.s -o a.ox0dx0afile a.ox0dx0aa.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not strippedx0dx0a鏈接過程:x0dx0a鏈接過程。生成可執行代碼。鏈接分為兩種,一種是靜態鏈接,另外一種是動態鏈接。使用靜態鏈接的好處是,依賴的動態鏈接庫較少,對動態鏈接庫的版本不會很敏感,具有較好的兼容性;缺點是生成的程序比較大。使用動態鏈接的好處是,生成的程序比較小,佔用較少的內存。x0dx0agcc a.o -o ax0dx0a程序運行:x0dx0a./ax0dx0ahellox0dx0a編輯本段x0dx0aGCC編譯簡單例子x0dx0ax0dx0a編寫如下代碼:x0dx0a#include x0dx0aint main()x0dx0a{x0dx0aprintf("hello,world!\n");x0dx0a}x0dx0a執行情況如下:x0dx0agcc -E hello.c -o hello.ix0dx0agcc -S hello.i -o hello.sx0dx0agcc -c hello.s -o hello.ox0dx0agcc hello.c -o hellox0dx0a./hellox0dx0ahello,world!

4. elf是什麼格式,怎麼運行

Executable Linkable Format
就是可執行文件。
gcc 編出來的。
http://crquan.blogbus.com/logs/1651240.html

5. 高版本gcc編譯出的程序在低版本glibc機器上運行

比如我們用gcc 9.3.0編譯程序,但需要發布的機器gcc版本是4.8.5,怎麼辦?

你可能想到如下方法

將libc和libstdc++靜態編譯,編譯時帶上如下參數。

glibc並不推薦靜態鏈接,你依賴的其他庫可能依賴的了glibc,並且往往是動態鏈接的,可以通過 nm <bin> | grep GLIBC_ 確定你的程序是否依賴了glibc。

使用攜帶gcc9.3.0環境的容器發布程序,是可以的。但是在一些沒有容器且沒有sudo許可權的場合,依然不太友好。

這個方法雖然聽起來不是很優雅,但其實如果你對elf文件有一些了解,是不錯的方式。下面說下具體的方法。

當你有條件獲得程序源碼,並能夠重新編譯時,可以直接在編譯時指定相關參數來解決。
先說編譯時要增加的參數:

gcc參數

ld參數

這兩個參數分別設置的elf文件中的rpath和interpreter欄位。

rpath
全名 run-time search path ,是elf文件中一個欄位,它指定了可執行文件執行時搜索so文件的第一優先位置,一般編譯器默認將該欄位設為空。elf文件中還有一個類似的欄位runpath,其作用與rpath類似,但搜索優先順序稍低。搜索優先順序:

如果你需要使用相對路徑指定lib文件夾,可以使用 ORIGIN 變數,ld會將ORIGIN理解成可執行文件所在的路徑。

interpreter
動態庫載入器,程序啟動時,操作系統會先把控制權轉交給ld-linux-x86-64.so.2,該so負責載入所有程序依賴的so。。這個欄位在鏈接時會幫你自動設置,64bit程序一般為 /lib64/ld-linux-x86-64.so.2 。修改rpath或者LD_LIBRARY_PATH指向本地lib目錄,但通過ldd程序,發現/lib64/ld-linux-x86-64.so.2這個so仍然指向系統so。原因就是這個欄位是寫死在elf文件中的,並不受LD_LIBRARY_PATH影響。

編譯時帶上這兩個參數,下面只需要將你程序依賴的so打包一份,隨程序進行發布即可。

當你無法編譯程序時,也可以通過其他方式修改rpath和interpreter。這種情況需要使用到一個工具 patchelf ,通過 dnf install patchelf 即可安裝。你可以通過它修改elf文件的rpath和interpreter:

除了絕對路徑,一種比較常見的方式是在部署前,使用 pwd 獲取當前路徑,使用相對路徑指向本地lib。

閱讀全文

與gcc編譯成elf文件相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:736
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163