gcc編譯c程式的主要過程是:預處理---編譯---彙編---連線,其中:(以名為hello.c的原始檔為例)
預處理:對各種預處理指令(#開頭,如#include,#define)進行處理,以及刪除注釋和多餘空白字元。生成被修改的源程式hello.i
e是通知gcc對hello.c進行預編譯;o是對命令輸出結果進行匯入操作
gcc -e hello.c -o hello.i
編譯:對**進行語法語義分析和錯誤判斷,生成彙編**檔案hello.s
s是通知gcc對目標檔案hello.i進行編譯
gcc -s hello.i -o hello.s
彙編:將彙編**轉化為計算機可識別的二進位制檔案,生成可重定位目標程式(二進位制)hello.o
c是通知gcc對目標檔案hello.s進行指令轉換操作
gcc -c hello.s -o hello.o
gcc hello.o -o hello
hello檔案即最後可以直接執行的可執行檔案,通過./hello執行,通過objdump -d hello可以將可執行檔案轉化為組合語言
或者可以直接通過執行gcc hello.c就可以直接生成二進位制目標檔案a.out,通過./a.out也可以執行結果
或者通過gcc hello.c -o hello,這樣可以給生成的檔案取名為hello
20190616補
今天在編譯gcc時遇到了問題,更新此帖記錄。
gcc -c hello.c -o hello.o
想要./hello.o輸出的時候報錯permission denied,這個問題可以通過在命令前加bash或chmod更改許可權解決:
ly@ubuntu:~/desktop$ ./hello.obash: ./hello.o: permission denied
ly@ubuntu:~/desktop$ bash ./hello.o
./hello.o: ./hello.o: cannot execute binary file
ly@ubuntu:~/desktop$ chmod 777 hello.o
ly@ubuntu:~/desktop$ ./hello.o
bash: ./hello.o: cannot execute binary file: exec format error
ly@ubuntu:~/desktop$ gcc hello.c -o helloly@ubuntu:~/desktop$ ./hello
hello
ly@ubuntu:~/desktop$ gcc hello.c
ly@ubuntu:~/desktop$ ./a.out
hello
之前整理的三種方式都可以生成可執行檔案。
ly@ubuntu:~/desktop$ file ./a.out./a.out: elf 64-bit lsb executable, x86-64, version 1 (sysv), dynamically linked, interpreter /lib64/l, for gnu/linux 2.6.32, buildid[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped
ly@ubuntu:~/desktop$ file ./hello.o
./hello.o: elf 64-bit lsb relocatable, x86-64, version 1
(sysv), not stripped
ly@ubuntu:~/desktop$ file ./hello
./hello: elf 64-bit lsb executable, x86-64, version 1 (sysv), dynamically linked, interpreter /lib64/l, for gnu/linux 2.6.32, buildid[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped
gcc 編譯多個原始檔
一.常用編譯命令選項 假設源程式檔名為test.c。3.選項 e 用法 gcc e test.c o test.i 作用 將test.c預處理輸出test.i檔案。4.選項 s 用法 gcc s test.i 作用 將預處理輸出檔案test.i彙編成test.s檔案。5.選項 c 用法 gcc c ...
gcc 編譯多個原始檔
一.常用編譯命令選項 假設源程式檔名為test.c。1.無選項編譯鏈結 用法 gcc test.c 作用 將test.c預處理 彙編 編譯並鏈結形成可執行檔案。這裡未指定輸出檔案,預設輸出為a.out。2.選項 o 用法 gcc test.c o test 作用 將test.c預處理 彙編 編譯並鏈...
gcc 編譯多個原始檔
一.常用編譯命令選項 假設源程式檔名為test.c。3.選項 e 用法 gcc e test.c o test.i 作用 將test.c預處理輸出test.i檔案。4.選項 s 用法 gcc s test.i 作用 將預處理輸出檔案test.i彙編成test.s檔案。5.選項 c 用法 gcc c ...