12琳要、iOS強(qiáng)化 --- 常用的編譯命令總結(jié)

前幾篇文章我們探討了靜態(tài)鏈接動(dòng)態(tài)鏈接秤茅、靜態(tài)庫(kù)稚补、動(dòng)態(tài)庫(kù)等,這里我們?cè)賮?lái)回顧一下我們用到的一些編譯命令框喳。

生成目標(biāo)文件:

目標(biāo)文件包含了機(jī)器指令代碼课幕、數(shù)據(jù)、鏈接時(shí)需要的信息五垮,符號(hào)表乍惊、調(diào)試信息,字符串表放仗。

  • 1润绎、不指定target,默認(rèn)是Mach-O 64-bit object x86_64:
clang -x c -g -c a.c -o a.o
指令 注釋
-x 指定編譯文件語(yǔ)言類(lèi)型
-g 生成調(diào)試信息
-c 生成目標(biāo)文件诞挨,只運(yùn)行preprocess, compile, assemble莉撇,不鏈接
-o 輸出文件
-I<directory> 在指定目錄中尋找頭文件
-L<directory> 指定庫(kù)文件路徑(.a/.dylib庫(kù)文件)
-l<library_name> 指定鏈接的庫(kù)文件名稱(.a/.dylib庫(kù)文件)
-F<directory> 在指定目錄尋找framework文件
-framework <framework_name> 在指定鏈接的framework名稱,生成相應(yīng)的LLVM文件格式亭姥,來(lái)進(jìn)行鏈接時(shí)間優(yōu)化稼钩。當(dāng)我們配合-S使用是,生成匯編語(yǔ)言文件达罗。否則生成bitcode格式的目標(biāo)文件
-flto=<value> 設(shè)置LTO的模式:full or thin
-flto 設(shè)置LTO的模式:full
-flto=full 默認(rèn)值坝撑,單片(monolithic)LTO通過(guò)將所有初入合并到單個(gè)模塊中來(lái)實(shí)現(xiàn)此目的
-flto=thin 使用ThinLTO代替-emit-llvm
-install_name 指定動(dòng)態(tài)庫(kù)初次安裝時(shí)的默認(rèn)路徑,向LC_ID_DYLIB添加安裝路徑粮揉,該路徑作為dyld定位該庫(kù)巡李。

clang -o是將.c源文件編譯生吃一個(gè)可執(zhí)行的二進(jìn)制代碼(-o選項(xiàng)其實(shí)是指定輸出文件的文件名;如果不加-c選項(xiàng)扶认,clang默認(rèn)會(huì)編譯鏈接生成可執(zhí)行文件侨拦,文件名稱由-o選項(xiàng)指定)。
clang -c是使用LLVM匯編器將源文件轉(zhuǎn)化為目標(biāo)文件辐宾。

  • 2狱从、指定生成Mach-O 64-bit x86-64目標(biāo)文件格式:
clang -x c -target x86_64-apple-macos10.15 -g -c a.c -o a.o
  • 3膨蛮、如果指定target不帶Apple系統(tǒng)版本(包括macOS, ipadOS, iOS, 真機(jī)和模擬器);例如x86_64季研,那么生成的目標(biāo)問(wèn)價(jià)是LinuxELF 64-bit:
clang -x c -target x86_64 -g -c a.c -o a.o
  • 4敞葛、編譯.m
clang -x objective-c -target x86_64-apple-macos10.15 -fobjc-arc -fmodules -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -c test.m -o test.o
clang -x c -g -target arm64-apple-ios13.5 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.6.sdk -c a.c -o a.o
  • 5、編譯.mm
    Mac上編譯:
clang -x objective-c++ -target x86_64-apple-macos10.15 -std=c++11 -stdlib=libc++ -fobjc-arc -fmodules -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -c te st.mm -o test.o

在模擬器上編譯:

clang -x objective-c -target x86_64-apple-ios13.5-simulator -fobjc-arc -fmodules -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.6.sdk -c test.m -o test.o

在模擬器上鏈接其他三方庫(kù):

clang -x objective-c -target x86_64-apple-ios13.5-simulator -fobjc-arc -fmodules -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.6.sdk -I/Users/ws/Desktop/課程/Library/代碼庫(kù)/AFNetworking.framework/Headers -F/Users/ws/Desktop/課程/Library/代碼庫(kù) -c test.m -o test.o

clang -target x86_64-apple-ios13.5-simulator -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/i PhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.6.sdk -F/Users/ws/Desktop/課程/Library/代碼庫(kù) -fobjc- arc -framework AFNetworking -v test.o -o test

clang -target x86_64-apple-ios13.5-simulator -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/i PhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.6.sdk -L/Users/ws/Desktop/課程/Library/代碼庫(kù) -fobjc- arc -lAFNetworking -dead-strip test.o -o test

編譯成arm64真機(jī):

clang -target arm64-apple-ios13.5 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.6.sdk -L/Users/ws/Desktop/課程/Library/代碼庫(kù) -fobjc-arc -lAFNetworking test.o -o test

clang -target arm64-apple-ios13.5 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.pla tform/Developer/SDKs/iPhoneOS13.6.sdk -F/Users/ws/Desktop/課程/Library/代碼庫(kù) -fobjc-arc -framework AFNetworking test.o -o test

生成dSYM文件:

clang -x c -g1 a.c -o a.o

-g1: 將調(diào)試信息寫(xiě)入`DWARF`格式文件

查看調(diào)試信息

swarfdump取出并驗(yàn)證DWARF格式調(diào)試信息:

dwarfdump a.o
dwarfdump a.dSYM
dwarfdump --lookup 0x100000f20 --arch=x86_64 a.dSYM

--lookup 查看地址的調(diào)試信息与涡。將顯示出所在目錄惹谐,文件,函數(shù)等信息驼卖。

查看文件內(nèi)容

otool用來(lái)查看Mach-O文件內(nèi)部結(jié)構(gòu):

otool -l liba.dylib
otool -h libTest.a

-l : 顯示解析后的 mach header 和 load command
-h : 顯示未解析的 mach header
-L : 打印所有鏈接的動(dòng)態(tài)庫(kù)路徑
-D : 打印當(dāng)前動(dòng)態(tài)庫(kù)的`install_name`

objdump用來(lái)查看文件內(nèi)部結(jié)構(gòu)氨肌,包括ELFMach-O:

objdump --macho -h a.o
objdump --macho -x a.o
objdump --macho -s -d a.o
objdump --macho --syms a.o

--macho : 指定 Mach-O 類(lèi)型
-h : 打印各個(gè)段的基本信息
-x : 打印各個(gè)段更詳細(xì)的信息
-d : 將所有包含指定的段反匯編
-s: 將所有段的內(nèi)容以16進(jìn)制的方式打印出來(lái)
--lazy-bind : 打印 lazy binding info
--syms 打印符號(hào)表

靜態(tài)庫(kù)的壓縮和解壓縮
ar壓縮目標(biāo)文件,并對(duì)其進(jìn)行編號(hào)和索引酌畜,形成靜態(tài)庫(kù)怎囚。同時(shí)也可以解壓縮靜態(tài)庫(kù),查看有哪些目標(biāo)文件:

ar -rc a.a a.o

-r : 添加 或 替換文件
-c : 不輸出任何信息
-t : 列出包含的目標(biāo)文件

創(chuàng)建靜態(tài)庫(kù)

創(chuàng)建庫(kù)命令:libtool檩奠∽耍可以創(chuàng)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù):

libtool -static -arch_only x86_64 a.o -o a.a

libtool -static -arch_only arm64 -D syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.6.sdk test.o -o libTest.a

創(chuàng)建動(dòng)態(tài)庫(kù)

clang -dynamiclib -target arm64-apple-ios13.5 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.6.sdk a.o -o a.dylib

查看符號(hào)表

nm命令:

nm -pa a.o

-a : 顯示符號(hào)表的所有內(nèi)容
-g : 顯示全局符號(hào)
-p : 不排序附帽。顯示符號(hào)表本來(lái)的順序
-r : 逆轉(zhuǎn)順序
-u : 顯示未定義符號(hào)

生成dSYM文件

dsymutil可以被理解為是調(diào)試信息鏈接器埠戳。它按照上面的步驟執(zhí)行:

  • 讀取debug map
  • .o 文件中加載 DWARF
  • 重新定位所有地址
  • 最后將全部的 DWARF 打包成 dSYM Bundle
    有了dSYM后,我們就擁有了最標(biāo)準(zhǔn)的 DWARF 的文件蕉扮,任何可以dwarf讀取的工具(可以處理Mach-O二進(jìn)制文件)都可以處理該標(biāo)準(zhǔn)DWARF整胃。

dsymutil 操作 DWARF 格式的 debug symbol≡樱可以將可執(zhí)行文件 debug symbol 生成 DWARF格式的文件:

dsymutil -f a -o a.dSYM

-f : .dwarf格式文件
-o <filename> : 輸出.dSYM格式文件

移出符號(hào)
strip用來(lái)移出和修改符號(hào)表:

strip -S a.o

-S : 刪除調(diào)試符號(hào)
-X : 移除本地符號(hào)屁使,‘L’開(kāi)頭的
-x : 移除全部的本地符號(hào),只保留全局符號(hào)

鏈接器

ld

-all_load : 加載靜態(tài)庫(kù)包含的所有文件
-Objc : 加載靜態(tài)庫(kù)包含的所有的 Objective-C 和 Category
-force_load <path_to_archive> : 加載靜態(tài)庫(kù)中指定的文件

鏈接動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)

ld -dylib -arch x86_64 -macosx_version_min 10.13 a.dylib -o a

ld -static -arch x86_64 -e _main a.a -o a

Xcode 打印加載的庫(kù)
Pre-main Timemain 函數(shù)執(zhí)行之前的加載時(shí)間奔则,包括 dylib 動(dòng)態(tài)庫(kù)加載蛮寂, Mach-O文件加載,Rebase/Binding易茬,Objective-C Runtime 加載等酬蹋。

Xcode 自身提供了一個(gè)在控制臺(tái)打印這些時(shí)間的方法:在 XcodeEdit Scheme -> Run -> Auguments 添加環(huán)境變量 DYLD_PRINT_STATISTICS 并把其值設(shè)為 1

DYLD_PRINT_LIBRARIES : 打印出所有被加載的庫(kù)抽莱。
DYLD_PRINT_LIBRARIES_POST_LAUNCH : 打印的是通過(guò)dlopen調(diào)用返回的庫(kù)范抓,包括動(dòng)態(tài)庫(kù)的依賴庫(kù),主要發(fā)生在main函數(shù)運(yùn)行之后食铐。


二進(jìn)制重排

  • 鏈接order.file
ld -o test test.o -lsystem -order_file test.order

ld -o test test.o -lsystem -lc++ -framework Foundation -order_file test.order

ld -map output.map -lsystem -o output a.o
  • 生成Link Map 文件
ld -map output.map -lsystem -lc++ -framework Foundation test.o -o output

-map map_file_path 生成map文件匕垫。
主要包括三大部分:

Object Files : 生成二進(jìn)制調(diào)用的 link 單元的路徑 和 文件編號(hào)
Sections : 記錄 Mach-O 每個(gè) Segment/section 的地址范圍
Symbols : 按順序記錄每個(gè)符號(hào)的地址范圍
  • install_name_tool
    更改動(dòng)態(tài)共享庫(kù)的安裝名稱,并操縱運(yùn)行路線
install_name_tool -add_rpath <directory> libs_File

install_name_tool -delete_rpath <directory> libs_File

install_name_tool -rpath <old> <new> libs_File
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虐呻,一起剝皮案震驚了整個(gè)濱河市象泵,隨后出現(xiàn)的幾起案子寞秃,更是在濱河造成了極大的恐慌,老刑警劉巖偶惠,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜕该,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡洲鸠,警方通過(guò)查閱死者的電腦和手機(jī)堂淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扒腕,“玉大人绢淀,你說(shuō)我怎么就攤上這事●” “怎么了皆的?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蹋盆。 經(jīng)常有香客問(wèn)我费薄,道長(zhǎng),這世上最難降的妖魔是什么栖雾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任楞抡,我火速辦了婚禮,結(jié)果婚禮上析藕,老公的妹妹穿的比我還像新娘召廷。我一直安慰自己,他們只是感情好账胧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布竞慢。 她就那樣靜靜地躺著,像睡著了一般治泥。 火紅的嫁衣襯著肌膚如雪筹煮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天居夹,我揣著相機(jī)與錄音败潦,去河邊找鬼。 笑死吮播,一個(gè)胖子當(dāng)著我的面吹牛变屁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播意狠,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼粟关,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闷板,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤澎灸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后遮晚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體性昭,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年县遣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糜颠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萧求,死狀恐怖其兴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夸政,我是刑警寧澤元旬,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站守问,受9級(jí)特大地震影響匀归,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耗帕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一穆端、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兴垦,春花似錦徙赢、人聲如沸字柠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窑业。三九已至钦幔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間常柄,已是汗流浹背鲤氢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留西潘,地道東北人卷玉。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喷市,于是被迫代替她去往敵國(guó)和親相种。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 生成目標(biāo)文件 目標(biāo)文件包含了機(jī)器指令代碼品姓、數(shù)據(jù)寝并、鏈接時(shí)需要的信息箫措、符號(hào)表、調(diào)試信息衬潦、字符串表斤蔓。 1.不指定targ...
    HotPotCat閱讀 329評(píng)論 0 1
  • Symbol Table:?來(lái)保存符號(hào)。 String Table:?來(lái)保存符號(hào)的名稱镀岛。 Indirect Sym...
    帥駝駝閱讀 1,745評(píng)論 4 8
  • 目錄 一弦牡、生成目標(biāo)文件: .o 二、查看調(diào)試信息 三漂羊、查看文件內(nèi)容 四喇伯、靜態(tài)庫(kù)的壓縮和解壓縮 五、創(chuàng)建靜態(tài)庫(kù) 六拨与、...
    differ_iOSER閱讀 1,276評(píng)論 0 14
  • 生成目標(biāo)文件 目標(biāo)文件包含了機(jī)器指令代碼稻据,數(shù)據(jù),連接時(shí)需要的信息买喧,符號(hào)表捻悯,調(diào)試信息,字符串表淤毛。1.不指定 targ...
    凱歌948閱讀 542評(píng)論 0 0
  • 安裝包組成: 談到 App 瘦身今缚,最直接的想法莫過(guò)于分析一個(gè)安裝包內(nèi)部結(jié)構(gòu),了解其每一部分的來(lái)源低淡。解壓一個(gè) ipa...
    孔雨露閱讀 3,298評(píng)論 1 7