解析elf文件結構html
ex:gcc -c main.c 輸出main.o文件,.o文件不可執行
ex:gcc -o main main.o 將main.o連接爲可執行文件,輸出main
-g 若是想用調試器執行一個可執行文件, 在用gcc編譯時必須加上-g選項,加上-g選項之後,gcc在編譯時會作如下額外的操做:linux
注意上面的說明中紅框標註的內容,若是-l:filename
格式指定一個文件名,鏈接程序直接去找這個文件名了,不會再像使用-lname
時將name擴展成lib<name>.a
格式的文件名.
因此使用-l:libpng.a
這樣的形式來指定鏈接庫,就指定了靜態鏈接png
庫。
固然若是庫的位置不在gcc默認搜索路徑中,要用-L
參數另外指定搜索庫的路徑,不然鏈接程序不知道該從哪裏找到filename
。
gcc -shared -fPIC -o test.so test.c LD_PRELOAD=./test.so /usr/bin/target
https://www.jianshu.com/p/3a2...
gcc 4.8以上支持addressSanitizer,其能檢測的錯誤類型
用-fsanitize=address選項編譯和連接你的程序;
用-fno-omit-frame-pointer編譯,以在錯誤消息中添加更好的堆棧跟蹤。
增長-O1以得到更好的性能(最基礎的優化,分爲1,2,3級)shell
簡單源碼示例:數組
#include <stdlib.h> char leaktest(){ char* x =(char*)malloc(10*sizeof(char*)); return x[5]; } int main(){ leaktest(); return 0; }
編譯:gcc -fsanitize=address -fno-omit-frame-pointer -O1 -g leaktest.c -o leaktest
架構
一、 默認狀況下,make 會以第一條規則做爲其「終極目標」。
二、make在執行命令時會檢測依賴文件的時間戳:
若依賴文件不存在或者依賴文件的時間戳比目標文件新,則執行依賴文件對應的命令。
若依賴文件的時間戳比目標文件老,則忽略依賴文件對應的命令。
三、make
目標文件的依賴文件是按照從左到右的順序生成的
一、makefile文件基本書寫規則函數
TARGET... : PREREQUISITES...
COMMAND
TARGET:規則目標,能夠爲文件名或動做名
PREREQUISITES:規則依賴
COMMAND:命令行,必須以[TAB]開始,由shell執行工具
ex:post
1 #this is a makefile example 2 3 main:main.o 4 gcc -o main main.o 5 6 main.o:main.c 7 gcc -c main.c
使用:性能
二、變量使用優化
${變量名}
$(變量名)
$單字符變量名
,Makefile有三個很是有用的變量。分別是$@
(目標文件),$^
(全部的依賴文件),$<
(第一個依賴文件)
參考: https://www.cnblogs.com/baidu...
ex:
# 變量定義 objects = program.o foo.o utils.o program : $(objects) #在依賴中引用變量 gcc -o program ${objects} #在命令中引用變量 $(objects) : defs.h #在目標中引用變量
三、變量的分類和賦值
根據變量定義時所使用的賦值操做符的不一樣,能夠將變量分紅兩種類型(或者說是兩種風格):
遞歸展開式變量
和直接展開式變量
;
使用賦值操做符=
、+=
和?=
定義的變量都是 遞歸展開式變量,使用賦值操做符:=
定義的變量爲 直接展開式變量 。兩種變量類型的的最根本區別在於:變量值的求值時機,遞歸式變量的求值時機在於變量被引用時,直接展開式的求值時機在於變量被定義時。
四、makefile選項
五、make參數
一、make -j4 用4核同時編譯,默認1核,能夠不用加這個...
二、make -n/--just-print/--dry-run/--recon 只檢查Makefile的命令,輸出組合後的結果,不執行
你或許聽過好幾種 Make 工具,例如 GNU Make ,QT 的 qmake ,微軟的 MS nmake,BSD Make(pmake),Makepp,等等。這些 Make 工具遵循着不一樣的規範和標準,所執行的 Makefile 格式也千差萬別。這樣就帶來了一個嚴峻的問題:若是軟件想跨平臺,必需要保證可以在不一樣平臺編譯。而若是使用上面的 Make 工具,就得爲每一種標準寫一次 Makefile ,這將是一件讓人抓狂的工做。
CMake就是針對上面問題所設計的工具:它首先容許開發者編寫一種平臺無關的 CMakeList.txt 文件來定製整個編譯流程,而後再根據目標用戶的平臺進一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。從而作到「Write once, run everywhere」。顯然,CMake 是一個比上述幾種 make 更高級的編譯配置工具。一些使用 CMake 做爲項目架構系統的知名開源項目有 VTK、ITK、KDE、OpenCV、OSG 等 [[1]](https://www.hahack.com/codes/...。
在 linux 平臺下使用 CMake 生成 Makefile 並編譯的流程以下:
cmake PATH
或者 ccmake PATH
生成 Makefile ,ccmake
和 cmake
的區別在於前者提供了一個交互式的界面。。其中, PATH
是 CMakeLists.txt 所在的目錄。make
命令進行編譯。mkdir bld
cd bld
cmake .. (CMakeLists.txt在上一級目錄)
make
clang使用libfuzzer進行fuzz所需參數
-fsanitize-coverage=trace-pc-guard(編譯器在每條邊界插入代碼,每條邊界的guard都不一樣。), trace-cmp(編譯器將在比較指令和switch語句周圍插入額外的工具),trace-gep(LLVM GEP指令(捕獲數組索引)),trace-div(編譯器將檢測整型除法指令(以捕獲除法的正確參數))