參考資料:
https://blog.csdn.net/czg13548930186/article/details/78331692
一個C/C++文件要經過預處理(preprocessing)、編譯(compilation)、匯編(assembly)、和連接(linking)才能變成可執行文件。
以 hello.c為例,演示編譯命令:
gcc -E -o hello.i hello.c
gcc -S -o hello.s hello.i
gcc -c -o hello.o hello.s
gcc -o hello hello.o
gcc -c -o hello.o hello.c
不作最后一步鏈接,得到hello.o二進制OBJ文件
gcc -v -o hello hello.o //查看詳細的鏈接過程
- crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系統標准啟動文件,對於一般應用程序,這些啟動是必需的。
- -lc:鏈接libc庫文件,其中libc庫文件中就實現了printf等函數。
動態鏈接:
默認使用動態鏈接:gcc -o hello_shared hello.o
靜態鏈接:
gcc -static -o hello_static hello.o
-nostartfiles
不鏈接系統標准啟動文件,而標准庫文件仍然正常使用:
gcc -v -nostartfiles -o hello hello.o
-nostdlib(最常用)
不鏈接系統標准啟動文件和標准庫文件:
gcc -v -nostdlib -o hello hello.o
- 會提示因為沒有鏈接系統標准啟動文件和標准庫文件,而鏈接失敗。
- 這個-nostdlib選項常用於裸機/bootloader、linux內核等程序,因為它們不需要啟動文件、標准庫文件。