最新kali之clang

描述:

clang-Clang C,C ++和Objective-C編譯器。

clang是一個(gè)C、c++和Objective-C編譯器,它包含預(yù)處理、解析、優(yōu)化、代碼生成、匯編和鏈接。根據(jù)傳遞的高級(jí)模式設(shè)置,Clang會(huì)在完成完整鏈接之前停止。盡管Clang是高度集成的,但重要的是了解編譯的階段,了解如何調(diào)用它。這些階段是:

驅(qū)動(dòng):

clang可執(zhí)行文件實(shí)際上是一個(gè)小型驅(qū)動(dòng)程序,它控制其他工具(如編譯器、匯編器和鏈接器)的整體執(zhí)行。通常您不需要與驅(qū)動(dòng)程序交互,但是您可以透明地使用它來運(yùn)行其他工具。

預(yù)處理:

此階段處理輸入源文件的標(biāo)記化,宏擴(kuò)展,#include擴(kuò)展以及其他預(yù)處理程序指令的處理。該階段的輸出通常稱為“ .i”(對(duì)于C),“.ii”(對(duì)于C ++),“.mi”(對(duì)于Objective-C)或“ .mii”(對(duì)于Objective-C ++)文件 。

解析和語義分析:

此階段解析輸入文件,將預(yù)處理器令牌轉(zhuǎn)換為解析樹。一旦采用了語法分析樹的形式,它就會(huì)應(yīng)用語義分析來計(jì)算表達(dá)式的類型,并確定代碼是否格式正確。該階段負(fù)責(zé)生成大多數(shù)編譯器警告以及解析錯(cuò)誤。該階段的輸出是“抽象語法樹”(AST)。

代碼生成和優(yōu)化:

此階段將AST轉(zhuǎn)換為低級(jí)中間代碼(稱為“ LLVM IR”),最終轉(zhuǎn)換為機(jī)器代碼。此階段負(fù)責(zé)優(yōu)化生成的代碼并處理特定于目標(biāo)的代碼生成。該階段的輸出通常稱為“ .s”文件或“ assembly”文件。

Clang還支持使用集成匯編器,在該匯編器中,代碼生成器直接生成目標(biāo)文件。這避免了生成“ .s”文件和調(diào)用目標(biāo)匯編程序的開銷。

匯編程序:

此階段運(yùn)行目標(biāo)匯編程序,以將編譯器的輸出轉(zhuǎn)換為目標(biāo)目標(biāo)文件。該階段的輸出通常稱為“ .o”文件或“ object”文件。

鏈接器:

此階段運(yùn)行目標(biāo)鏈接程序,以將多個(gè)目標(biāo)文件合并到可執(zhí)行文件或動(dòng)態(tài)庫(kù)中。此階段的輸出通常稱為“ a.out”,“。dylib”或“ .so”文件。

clang靜態(tài)分析器:

Clang靜態(tài)分析器是一種工具,可掃描源代碼以嘗試通過代碼分析來發(fā)現(xiàn)錯(cuò)誤。該工具使用了Clang的許多部分,并內(nèi)置在同一驅(qū)動(dòng)程序中。有關(guān)如何使用靜態(tài)分析器的更多詳細(xì)信息,請(qǐng)參見<https://clang-analyzer.llvm.org>。

選項(xiàng):

階段選擇選項(xiàng):

-E

運(yùn)行預(yù)處理器階段。

-fsyntax-only

運(yùn)行預(yù)處理器、解析器和類型檢查階段。

-S

運(yùn)行前面的階段以及LLVM生成和優(yōu)化階段以及特定于目標(biāo)的代碼生成,從而生成一個(gè)程序集文件。

-c

運(yùn)行上述所有程序,再加上匯編程序,生成一個(gè)目標(biāo)”.o”對(duì)象文件。

無階段選擇選項(xiàng):

如果沒有指定階段選擇選項(xiàng),則運(yùn)行上述所有階段,并運(yùn)行鏈接器將結(jié)果合并到可執(zhí)行庫(kù)或共享庫(kù)中。

語言選擇和模式選項(xiàng):

-x <language>

將后續(xù)的輸入文件視為具有類型語言。

-std=<standard>

指定要編譯的語言標(biāo)準(zhǔn)。

C語言支持的值有:c89, c90,iso9899:1990…

-stdlib=<library>

指定要使用的c++標(biāo)準(zhǔn)庫(kù);支持的選項(xiàng)是libstdc++和libc++。如果未指定,將使用平臺(tái)默認(rèn)值。

-rtlib=<library>

指定要使用的編譯器運(yùn)行時(shí)庫(kù);支持的選項(xiàng)是libgcc和compiler-rt。如果未指定,將使用平臺(tái)默認(rèn)值。

-ansi

與-std = c89相同。

-ObjC,-ObjC++

將源輸入文件分別視為Objective-C和object - c++輸入。

-trigraghs

啟用trigraghs

-ffreestanding

指示該文件應(yīng)針對(duì)獨(dú)立環(huán)境而非托管環(huán)境進(jìn)行編譯。

-fno-builtin

禁用strlen()和malloc()等內(nèi)置函數(shù)的特殊處理和優(yōu)化。

-fmath-errno

指出應(yīng)該將數(shù)學(xué)函數(shù)視為更新errno。

-fpascal-strings

使用" \pfoo"啟用pascal風(fēng)格的字符串支持。

-fms-extensions

啟用對(duì)Microsoft擴(kuò)展的支持。

-fmsc-version=

設(shè)置_MSC_VER。在Windows上默認(rèn)為1300。否則不設(shè)置。

-fborland-extensions

啟用對(duì)Borland擴(kuò)展的支持。

-fwritable-strings

將所有字符串文字默認(rèn)設(shè)置為可寫。這將禁用字符串唯一化和其他優(yōu)化。

-flax-vector-conversions

允許使用松散的類型檢查規(guī)則進(jìn)行隱式矢量轉(zhuǎn)換。

-fblocks

啟用“阻止”語言功能。

-fobjc-abi-version=version

選擇要使用的Objective-CABI版本??捎冒姹緸?(舊式“脆弱” ABI),2(非脆弱ABI 1)和3(非脆弱ABI 2)。

-fobjc-nonfragile-abi-version=<version>

選擇默認(rèn)使用的Objective-C非脆弱ABI版本。只有當(dāng)非脆弱ABI被啟用時(shí),這個(gè)才會(huì)被用作Objective-C ABI(通過-fobjc-nonfragile-abi,或者因?yàn)樗瞧脚_(tái)默認(rèn)值)。? ? ? ?

-fobjc-nonfragile-abi,-fno-obj-nonfragile-abi

啟用Objective-C非脆弱ABI。在默認(rèn)ABI的平臺(tái)上,可以用-fno-objc-nonfragile-abi禁用它。

目標(biāo)選擇選項(xiàng):

Clang完全支持交叉編譯作為其設(shè)計(jì)的固有部分。根據(jù)您的Clang版本的配置方式,它可能支持許多交叉編譯器,或者僅支持本機(jī)目標(biāo)。?

-target <architecture>

指定要為其構(gòu)建的體系結(jié)構(gòu)。

--print-supported-cpus

打印出給定目標(biāo)支持的處理器列表(通過-target =<architecture>或-arch<architecture>指定)。如果沒有指定目標(biāo),將使用系統(tǒng)默認(rèn)目標(biāo)。

-mcpu=?,-mtune=?

–print-supported-cpus的別名

-march=<cpu>

指定Clang應(yīng)該為特定處理器家族成員和更高版本生成代碼。例如,如果指定-march = i486,則允許編譯器生成在i486和更高版本的處理器上有效的指令,但在較早版本的處理器上可能不存在。

代碼生成選項(xiàng):

-O0, -O1, -O2, -O3, -Ofast,-Os, -Oz, -Og, -O, -O4

指定使用哪個(gè)優(yōu)化級(jí)別:

-O0

意味著“無優(yōu)化”:這個(gè)級(jí)別編譯速度最快,生成的調(diào)試代碼最多。

-O1

在-O0和-O2之間。

-O2

中等水平的優(yōu)化,支持大多數(shù)優(yōu)化。

-O3

與-O2相似,不同之處在于它可以使優(yōu)化執(zhí)行的時(shí)間更長(zhǎng)或可能生成更大的代碼(以使程序運(yùn)行更快)。

-Ofast

啟用-O3中的所有優(yōu)化以及可能違反嚴(yán)格遵守語言標(biāo)準(zhǔn)的其他激進(jìn)優(yōu)化。

-Os

比如-O2,通過額外的優(yōu)化來減少代碼大小。

-Oz

比如-Os(也就是-O2),但是進(jìn)一步減少了代碼大小。

-Og

像-O1。在將來的版本中,此選項(xiàng)可能會(huì)禁用不同的優(yōu)化,以提高可調(diào)試性。

-O

相當(dāng)于- O2。

-O4 and higher

目前相當(dāng)于-O3

-g,-gilne-tables-only,-gmodules

控制調(diào)試信息輸出。注意,Clang調(diào)試信息在-O0下工作得最好。當(dāng)指定多個(gè)以-g開頭的選項(xiàng)時(shí),最后一個(gè)將生效:

-g

生成調(diào)試信息

-gline-tables-only

只生成行表調(diào)試信息。這允許使用內(nèi)聯(lián)信息進(jìn)行符號(hào)化回溯,但不包括關(guān)于變量、變量位置或類型的任何信息。

-gmodules

生成包含對(duì)Clang模塊或預(yù)編譯頭中定義的類型的外部引用的調(diào)試信息,而不是將冗余的調(diào)試類型信息發(fā)送到每個(gè)目標(biāo)文件中。此選項(xiàng)透明地將Clang模塊格式切換為將Clang模塊與調(diào)試信息一起保存的目標(biāo)文件容器。當(dāng)編譯使用Clang模塊或預(yù)編譯頭文件的程序時(shí),此選項(xiàng)將生成具有更快的編譯時(shí)間和更小的目標(biāo)文件的完整調(diào)試信息。在構(gòu)建靜態(tài)庫(kù)以分發(fā)給其他計(jì)算機(jī)時(shí),不應(yīng)使用此選項(xiàng),因?yàn)檎{(diào)試信息將包含引用將庫(kù)中的目標(biāo)文件建立在機(jī)器上的模塊高速緩存中。

-fstandalone-debug-fno-standalone-debug

Clang支持許多優(yōu)化以減少二進(jìn)制文件中調(diào)試信息的大小。它們的工作原理是,調(diào)試類型信息可以分布在多個(gè)編譯單元上。例如,Clang不會(huì)為模塊不需要的類型發(fā)出類型定義,而可以用前置聲明代替。此外,Clang將僅在包含該類的vtable的模塊中為動(dòng)態(tài)C ++類發(fā)出類型信息。

-fstandalone-debug選項(xiàng)關(guān)閉這些優(yōu)化。當(dāng)使用不帶調(diào)試信息的第三方庫(kù)時(shí),這很有用。這是Darwin的默認(rèn)設(shè)置。請(qǐng)注意,對(duì)于程序完全未引用的類型,Clang永遠(yuǎn)不會(huì)發(fā)出類型信息。

-fexceptions

啟用展開信息的生成。這允許通過Clang編譯堆棧幀引發(fā)異常。在x86-64中默認(rèn)情況下處于啟用狀態(tài)。

-ftrapv

生成代碼以捕獲整數(shù)溢出錯(cuò)誤。C中未定義有符號(hào)整數(shù)溢出。使用此標(biāo)志,將生成額外的代碼來檢測(cè)此情況并在發(fā)生時(shí)中止。

-fvisibility

此標(biāo)志設(shè)置默認(rèn)可見性級(jí)別。

-fcommon,-fno-common

此標(biāo)志指定沒有初始化式的變量具有公共鏈接。它可以用-fno-common禁用。

-ftls-model=<model>

設(shè)置用于線程局部變量的默認(rèn)線程局部存儲(chǔ)(TLS)模型。有效值為:" global-dynamic ", " local-dynamic ", "initial-exec "和" local-exec "。默認(rèn)是“global-dynamic”??梢允褂胻ls_model屬性重寫默認(rèn)模型。如果可能的話,編譯器將嘗試選擇一個(gè)更有效的模型。

-flto,-flto=full,-flto=thin,-emit-llvm

生成LLVM格式的輸出文件,適用于鏈接時(shí)間優(yōu)化。與-S一起使用時(shí),將生成LLVM中間語言匯編文件,否則將生成LLVM位代碼格式的目標(biāo)文件(取決于階段選擇選項(xiàng),可以將其傳遞給鏈接器)。

-flto的默認(rèn)值為“ full”,其中LLVM位代碼適用于整體式鏈接時(shí)間優(yōu)化(LTO),其中鏈接程序?qū)⑺写祟惸K合并為單個(gè)組合模塊以進(jìn)行優(yōu)化。如果使用“ thin”,則會(huì)調(diào)用ThinLTO編譯。

驅(qū)動(dòng)程序選項(xiàng):

-###

打印(但不要運(yùn)行)要為此編譯運(yùn)行的命令。

--help

顯示可用的選項(xiàng)。

--Qunused-arguments

不要為未使用的驅(qū)動(dòng)程序參數(shù)發(fā)出任何警告。

-Wa,<args>

將args中以逗號(hào)分隔的參數(shù)傳遞給匯編程序。

-Wl,<args>

將args中以逗號(hào)分隔的參數(shù)傳遞給鏈接器。

-Wp,<args>

將args中逗號(hào)分隔的參數(shù)傳遞給預(yù)處理器。

-Xanalyzer <arg>

將arg傳遞給靜態(tài)分析器。

-Xassembler <arg>

將arg傳遞給匯編程序。

-Xlinker <arg>

將參數(shù)傳遞給鏈接器。

-Xpreprocessor <arg>

將參數(shù)傳遞給預(yù)處理器。

-o <file>

將輸出寫入文件

-print-file-name=<file>

打印文件的完整庫(kù)路徑。

-print-libgcc-file-name

打印當(dāng)前使用的編譯器運(yùn)行時(shí)庫(kù)的庫(kù)路徑(“ libgcc.a”或“ libclang_rt.builtins.*.a”)。

-print-prog-name=<name>

打印名稱的完整程序路徑。

-print-search-dirs

打印用于查找?guī)旌统绦虻穆窂健?/p>

-save-temps

保存中間編譯結(jié)果。

-save-stats,-save-stats=cwd,-save-stats=obj

將內(nèi)部代碼生成(LLVM)統(tǒng)計(jì)數(shù)據(jù)保存到當(dāng)前目錄(-save-stats/ " -save-stats=cwd ")或輸出文件目錄(" -save-state=obj ")中的一個(gè)文件中。

-integrated-as,-no-integrated-as

分別用于啟用和禁用集成匯編程序的使用。默認(rèn)情況下,集成匯編程序是否打開取決于目標(biāo)。

-time

為單個(gè)命令計(jì)時(shí)。

-ftime-report

打印每個(gè)編譯階段的時(shí)序摘要

-v

顯示運(yùn)行和使用詳細(xì)輸出的命令。

診斷選項(xiàng):

-fshow-column,-fshow-source-location,-fcaret-diagnostics,-fdiagnostics-fixit-info,-fdiagnostics-parseable-fixits,-fdiagnostics-print-source-range-info,-fprint-source-range-info,-fdiagnostics-show-option,-fmessage-length

這些選項(xiàng)控制Clang如何打印診斷信息(錯(cuò)誤和警告)。有關(guān)更多信息,請(qǐng)參閱Clang用戶手冊(cè)。

預(yù)處理選項(xiàng):

-D<macroname>=<value>

將一個(gè)隱式#define添加到預(yù)定義緩沖區(qū)中,該緩沖區(qū)在對(duì)源文件進(jìn)行預(yù)處理之前會(huì)被讀取。

-U<macroname>

將一個(gè)隱式#undef添加到預(yù)定義緩沖區(qū)中,該緩沖區(qū)在對(duì)源文件進(jìn)行預(yù)處理之前會(huì)被讀取。

-include <filename>

將一個(gè)隱式#include添加到預(yù)定義緩沖區(qū)中,該緩沖區(qū)在對(duì)源文件進(jìn)行預(yù)處理之前已被讀取。

-I<directory>

將指定目錄添加到包含文件的搜索路徑。

-F<directory>

將指定的目錄添加到框架包含文件的搜索路徑中。

-nostdinc

不要在標(biāo)準(zhǔn)系統(tǒng)目錄或編譯器內(nèi)置目錄中搜索包含文件。

-nostdlibinc

不要在標(biāo)準(zhǔn)系統(tǒng)目錄中搜索包含文件,而要搜索編譯器內(nèi)置的包含目錄。

-nobuiltininc

不要在clang的內(nèi)置目錄中搜索包含文件。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容