LLVM中的Compiler-RT相當(dāng)于GCC中的libgcc,為目標(biāo)平臺(tái)提供其硬件不支持的低級(jí)功能的優(yōu)化實(shí)現(xiàn)佛吓。
Compiler-RT(RT指運(yùn)行時(shí))項(xiàng)目用于為硬件不支持的低級(jí)功能提供特定于目標(biāo)的支持宵晚。例如,32位目標(biāo)通常缺少支持64位除法的指令维雇。Compiler-RT通過提供特定于目標(biāo)并經(jīng)過優(yōu)化的功能來解決這個(gè)問題淤刃,該功能在使用32位指令的同時(shí)實(shí)現(xiàn)了64位除法。它提供相同的功能吱型,因此是LLVM項(xiàng)目中l(wèi)ibgcc的替代品逸贾。
——《LLVM編譯器實(shí)戰(zhàn)教程》P17
在源碼的lib目錄下可以看到它的21個(gè)組件:
- asan
- BlockRuntime
- builtins
- cfi
- dfsan
- esan
- fuzzer
- hwasan
- interception
- lsan
- msan
- profile
- safestack
- sancov
- sanitizer_common
- scudo
- stats
- tsan
- ubsan
- ubsan_minimal
- xray
官網(wǎng)的compiler-rt介紹頁只提及了其中部分,包括builttins津滞、sanitizer runtimes耕陷、profile和BlocksRuntime。下面先介紹該四部分据沈,再補(bǔ)充其余組件哟沫。
四則運(yùn)算、位運(yùn)算锌介、類型轉(zhuǎn)換嗜诀、大小比較等基礎(chǔ)功能猾警,比如編譯32位target時(shí)將double轉(zhuǎn)換為64位無符號(hào)整型的__fixunsdfdi
函數(shù)。這些功能的實(shí)現(xiàn)或多或少有所優(yōu)化隆敢,有些使用跨平臺(tái)的C代碼发皿,有些直接使用匯編,后一種深度優(yōu)化執(zhí)行起來甚至比libgcc更高效拂蝎。
Google推出的動(dòng)態(tài)分析工具集穴墅,在LLVM項(xiàng)目中維護(hù),GCC也擇優(yōu)使用了一部分温自。
包括:
asan
AddressSanitizer玄货,檢測內(nèi)存錯(cuò)誤,包括訪存越界悼泌、釋放后使用松捉、重復(fù)釋放、內(nèi)存泄漏等馆里。dfsan
DataFlowSanitizer隘世,動(dòng)態(tài)數(shù)據(jù)流分析。esan
EfficiencySanitizer鸠踪,通過規(guī)避冗余計(jì)算丙者、緩存碎片等手段提高程序運(yùn)行效率。hwasan
Hardware-assisted AddressSanitizer营密,需要硬件支持的AddressSanitizer蔓钟,比如將64位中的8位用作確保內(nèi)存安全的標(biāo)志位。lsan
LeakSanitizer卵贱,運(yùn)行時(shí)內(nèi)存泄漏檢測滥沫,可以獨(dú)立使用,也可以和AddressSanitizer結(jié)合使用键俱。msan
MemorySanitizer兰绣,檢測未初始化的變量使用,通常會(huì)把程序拖慢3倍编振。sanitizer_common
common Sanitiz runtime缀辩,為AddressSanitizer和ThreadSanitizer所共用。tsan
ThreadSanitizer踪央,數(shù)據(jù)競爭檢測臀玄,通常會(huì)把程序拖慢5~15倍,內(nèi)存開支增至5~10倍畅蹂。ubsan
UndefinedBehaviorSanitizer健无,檢測未定義行為,包括使用空指針液斜、有符號(hào)整型溢出累贤、浮點(diǎn)型類型轉(zhuǎn)換造成的溢出等叠穆。ubsan_minimal
minimal UBSan runtime,UndefinedBehaviorSanitizer的基礎(chǔ)(簡化)版本臼膏。
用于Profile Guided Optimization(配置文件引導(dǎo)優(yōu)化)硼被,簡稱PGO∩酰可以在AST層面(-fprofile-instr-generate
)或IR層面(-fprofile-generate
)定制更好的優(yōu)化嚷硫,比如告知編譯器某個(gè)函數(shù)用得比較多,可以幫助它更好地處理內(nèi)聯(lián)始鱼。
BlocksRuntime
針對(duì)蘋果平臺(tái)Blocks運(yùn)行時(shí)仔掸。
下面為介紹頁未提到的其他組件:
控制流完整性(control flow integrity),在檢測到未定義行為時(shí)abort程序风响,放置控制流被惡意篡改和破壞嘉汰,在release版本中使用丹禀,通過-fsanitize=cfi
參數(shù)指定状勤。
SafeStack,在保持運(yùn)行性能的前提下双泪,保護(hù)程序免受棧緩沖溢出攻擊持搜。
SanitizerCoverage,以形象化或報(bào)告的形式提供代碼覆蓋率信息焙矛。
LibFuzzer葫盼,以覆蓋率為導(dǎo)向的模糊測試引擎。
interception
替換或封裝系統(tǒng)函數(shù)村斟,供AddressSanitizer使用贫导。
Scudo Hardened Allocator,一種基于Sanitizer內(nèi)存分配器(位于sanitizer_common)的用戶模式的分配器蟆盹,旨在保持運(yùn)行性能的前提下孩灯,提高內(nèi)存安全。單詞scudo來自西班牙語和葡萄牙語中的escudo(盾牌)逾滥。
SanitizerStats峰档,收集Sanitizer運(yùn)行的統(tǒng)計(jì)數(shù)據(jù)(statistics),目前只支持cfi寨昙,啟用-fsanitize=cfi*
參數(shù)的同時(shí)啟用-fsanitize-stats
參數(shù)讥巡。
XRay,函數(shù)調(diào)用跟蹤舔哪。
? XRay: A Function Call Tracing System
學(xué)習(xí)資料
- "compiler-rt" runtime libraries
- Clang 7 documentation
- Clang 7 documentation: Clang Compiler User’s Manual
2020年7月17日 無錫