編譯知識總結

0x01 gcc

gcc工具readelf

解析elf文件結構html

gcc參數

  • -c 編譯和彙編,但不連接
ex:gcc -c main.c 輸出main.o文件,.o文件不可執行
image.png
  • -o <file> 對.o進行連接
ex:gcc -o main main.o 將main.o連接爲可執行文件,輸出main
image.png
  • -g 若是想用調試器執行一個可執行文件, 在用gcc編譯時必須加上-g選項,加上-g選項之後,gcc在編譯時會作如下額外的操做:linux

    1. 建立符號表,符號表包含了程序中使用的變量名稱的列表。
    2. 關閉全部的優化機制,以便程序執行過程當中嚴格按照原來的C代碼進行
  • -w 關閉編譯時的警告,也就是編譯後不顯示任何warning,由於有時在編譯以後編譯器會顯示一些例如數據轉換之類的警告,這些警告是咱們平時能夠忽略的。
  • ar rcs libtest.a test.o 生成靜態連接庫文件
  • gcc -o test test.o -L. -ltest 連接靜態庫文件和.o文件生成可執行文件
    gcc -o test test.o -L/your/library/path -l:libmylib.a
注意上面的說明中紅框標註的內容,若是 -l:filename格式指定一個文件名,鏈接程序直接去找這個文件名了,不會再像使用 -lname時將name擴展成 lib<name>.a格式的文件名.
因此使用  -l:libpng.a這樣的形式來指定鏈接庫,就指定了靜態鏈接 png庫。
固然若是庫的位置不在gcc默認搜索路徑中,要用 -L參數另外指定搜索庫的路徑,不然鏈接程序不知道該從哪裏找到 filename
  • 編譯代碼到共享庫中,並使用操做系統的預加載功能。當執行/usr/bin下的被測應用時,若是系統庫和咱們建立的庫中有相同的函數,會使用咱們庫中的函數。
gcc -shared -fPIC -o test.so test.c 
LD_PRELOAD=./test.so /usr/bin/target
  • --cc=clang --extra-cflags='-O2 -g3 -fsanitize=address -fno-omit-frame-pointer -Wno-error' --extra-ldflags='-O2 -g3 -fsanitize=address -fno-omit-frame-pointer -Wno-error' --enable-debug --prefix=/home/cyber/VulnResearch/ffmpeg/clean/out_2

gcc之addressSanitizer

https://www.jianshu.com/p/3a2...
gcc 4.8以上支持addressSanitizer,其能檢測的錯誤類型
image.png
用-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架構

makefile

一、 默認狀況下,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

使用:性能

image.png

二、變量使用優化

${變量名}
$(變量名)
$單字符變量名,Makefile有三個很是有用的變量。分別是 $@(目標文件), $^(全部的依賴文件), $<(第一個依賴文件)
參考: https://www.cnblogs.com/baidu...

ex:

# 變量定義
objects = program.o foo.o utils.o

program : $(objects)          #在依賴中引用變量
    gcc -o program ${objects} #在命令中引用變量

$(objects) : defs.h           #在目標中引用變量

三、變量的分類和賦值
根據變量定義時所使用的賦值操做符的不一樣,能夠將變量分紅兩種類型(或者說是兩種風格):

遞歸展開式變量直接展開式變量

使用賦值操做符 =+=?=定義的變量都是 遞歸展開式變量,使用賦值操做符 :=定義的變量爲 直接展開式變量

兩種變量類型的的最根本區別在於:變量值的求值時機,遞歸式變量的求值時機在於變量被引用時,直接展開式的求值時機在於變量被定義時

四、makefile選項

  • CFLAGS: 指定頭文件(.h文件)的路徑,如:CFLAGS=-I /usr/include -I /path/include。一樣地,安裝一個包時會在安裝路徑下創建一個include目錄,當安裝過程當中出現問題時,試着把之前安裝的包的include目錄加入到該變量中來。
  • LDFLAGS:gcc 等編譯器會用到的一些優化參數,也能夠在裏面指定庫文件的位置。用法:LDFLAGS=-static -L /usr/lib -L /path/to/your/lib。每安裝一個包都幾乎必定的會在安裝目錄裏創建一個lib目錄。若是明明安裝了某個包,而安裝另外一個包時,它愣是說找不到,能夠抒那個包的lib路徑加入的LDFALGS中試一下。
  • LIBS:告訴連接器要連接哪些庫文件,如LIBS = -lpthread -liconv

五、make參數

一、make -j4 用4核同時編譯,默認1核,能夠不用加這個...
二、make -n/--just-print/--dry-run/--recon 只檢查Makefile的命令,輸出組合後的結果,不執行

cmake

你或許聽過好幾種 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 做爲項目架構系統的知名開源項目有 VTKITKKDEOpenCVOSG 等 [[1]](https://www.hahack.com/codes/...

在 linux 平臺下使用 CMake 生成 Makefile 並編譯的流程以下:

  1. 編寫 CMake 配置文件 CMakeLists.txt 。
  2. 執行命令 cmake PATH 或者 ccmake PATH 生成 Makefile ,ccmake 和 cmake 的區別在於前者提供了一個交互式的界面。。其中, PATH 是 CMakeLists.txt 所在的目錄。
  3. 使用 make 命令進行編譯。
mkdir bld
cd bld
cmake .. (CMakeLists.txt在上一級目錄)
make

0x02 clang

clang參數

clang使用libfuzzer進行fuzz所需參數
-fsanitize-coverage=trace-pc-guard(編譯器在每條邊界插入代碼,每條邊界的guard都不一樣。), trace-cmp(編譯器將在比較指令和switch語句周圍插入額外的工具),trace-gep(LLVM GEP指令(捕獲數組索引)),trace-div(編譯器將檢測整型除法指令(以捕獲除法的正確參數))

參考文檔:https://www.anquanke.com/post...

相關文章
相關標籤/搜索