1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        如何持續(xù)的自我提升

        共 4104字,需瀏覽 9分鐘

         ·

        2021-01-07 11:39

          最近經(jīng)常遇到有些朋友問題我如何學(xué)習(xí)編譯器等各類底層的知識。

          這些問題的背后是很多程序員對自我提升的強烈需求。

          今天,筆者會通過分享“2020年最后一天的學(xué)習(xí)完整記錄”的方式解答這個問題。

          注意:本文是分享自我提升技巧,所以遇到不懂的技術(shù)名詞,可以直接跳過。

          一、初識

          初識是一個被灌輸知識的過程。

          當(dāng)我們看博客或者書籍時,都會遇到一些新知識。這就是初識。

          今天,筆者從 百度App Objective-C/Swift 組件化混編之路(二)- 工程化 時,就被灌輸了一個”新知識“:module 會供鏈接器使用

          下面截取部分原文:

          1.2 Module 化 1.2.1 基本概念

          • module:是一個編譯單元,或構(gòu)建產(chǎn)物,對一個軟件庫的結(jié)構(gòu)化替代封裝,供鏈接器使用(更多介紹請查閱 Clang-Module:https://clang.llvm.org/docs/Modules.html#introduction)

          二、思考

          思考 是一個主動消化知識的過程。

          思考 的方式有很多:

          • 新知識是否和已有的知識發(fā)生了沖突?
          • 新知識可以和哪些知識串聯(lián)起來?
          • ....

          當(dāng)我看到上面的”新知識“時,就會想:

          • ”module 是如何被鏈接器使用呢?“
          • ”我也看過很多相關(guān)資料,為什么之前看到的資料都沒有提到鏈接器呢?“

          三、探索

          探索 是一個手動進行研究的過程。

          探索 過程非常依賴我們的思考能力和記憶能力。

          下面是筆者對 module 的一些思考:

          • 我具備多少與 module 相關(guān)的知識
          • 可以通過哪些搜索引擎技巧更快的搜索到與 module 相關(guān)的知識
          • 我們是否有方案驗證 module 與 鏈接器 的關(guān)系
          • ...

          每一次思考都需要我們把記憶能力充分調(diào)用:

          • 回憶與 module 相關(guān)的知識
          • 回憶搜索引擎技巧
          • 回憶如何通過 Xcode 創(chuàng)建工程、動態(tài)庫
          • 回憶 APP 構(gòu)建的每一步的命令
          • ...

          通過上面的初步思考,我決定通過創(chuàng)建 Demo 的方式對 module 會供鏈接器使用 進行驗證。

          準(zhǔn)備 Demo工程

          image-15402758

          Demo 工程會有一個名為 Host 的 APP,同時該 App 會依賴名為 ?FrameW 的動態(tài)庫和其它系統(tǒng)庫。

          項目的整體架構(gòu)如下圖:

          構(gòu)建

          通過 xcodebuild 命令,可以對 Host 進行構(gòu)建。

          如下,紅框部分是 Xcode 執(zhí)行 鏈接 Host 時,所調(diào)用的命令:

          image-20521724

          通過仔細(xì)分析上面的完整 命令 信息,我們沒有發(fā)現(xiàn)與 module 明顯相關(guān)的參數(shù),所以,我們可以大膽猜測:?module 與鏈接器沒有關(guān)系

          調(diào)試模式

          考慮到編譯器可能通過其它方式進行了信息傳遞,所以,我們通過給上述命令添加參數(shù) -v 的方式進行調(diào)試。

          image-20917926

          很遺憾,新增參數(shù) -v 后,仍然沒有得到有效的信息。但是,我們得到了一個新的知識 ?clang 會調(diào)用 ld 命令執(zhí)行鏈接任務(wù)。

          調(diào)試鏈接過程

          接著,我們再次嘗試對 ld 命令添加參數(shù) -v -t 的方式進行調(diào)試。

          這次的信息量十足:

          • 鏈接依賴的 .o 路徑被完整的打印出來了
          • 鏈接依賴的 FrameW 路徑被打印出來了
          • 鏈接依賴的系統(tǒng)庫路徑被打印出來了
          image-21201007

          module 文件探究

          現(xiàn)在局面很清晰了,ldFrameW 的交互是通過上面日志中的 FrameW.framework/FrameW 文件完成的。如果我們能夠證明 FrameW.framework/FrameW ?文件與 module 沒有關(guān)系,就可以證明 ? ”module 與鏈接器沒有關(guān)系“。

          下面,我們將依次分析 ?module 文件與 FrameW.framework/FrameW ?文件,并將兩者對比。

          如果對某些細(xì)節(jié)比較好奇,可以在公眾號底部留言,我們后續(xù)再分享 module 內(nèi)幕相關(guān)的知識。

          module 文件特征

          首先,我們進行編譯任務(wù)時,會發(fā)現(xiàn)有一個名為 -fmodules-cache-path 的參數(shù),該參數(shù)的值是一個路徑ModuleCache

          ?-fmodules-cache-path=/var/folders/4j/jqzrrjzn0nvgm4pyxrqddxnmm530jm/C/org.llvm.clang.xxxx/ModuleCache
          • 通過 cd 命令切到該文件夾
          • 通過 find 命令配合 grep 找到 FrameW-xxx.pcm
          • 通過 file 命令,得知該文件是 Mach-O 文件
          • 通過 otool -l grep sort,我們發(fā)現(xiàn)該文件最大的一個 section 體積是 0x000000000000d318
          • 通過 0x000000000000d318 配合 otool -lgrep -B 3 ,我們知道它屬于 ?__CLANG __clangast 部分
          • 通過 segedit 命令將該部分導(dǎo)出到單獨文件
          • 通過 file ,我們了解到該文件屬于 data
          • 通過 xxdhead 命令,我們可以得到 magic numberCPCH
          image-24230541
          • 通過 CPCHllvm 源碼,我們可以判斷這是 ?AST/PCH file magic number
          image-30138062

          另外,結(jié)合 llvm 源碼的 llvm::Error GlobalModuleIndexBuilder::loadModuleFile 內(nèi)部邏輯,我們可以確認(rèn)這個就是 動態(tài)庫module 進行編譯后的產(chǎn)物

          image-30220599

          通常上面的思考,我們可以得到以下結(jié)論:module 通常會被編譯為單獨的 mach-o 文件,該文件主要負(fù)責(zé)在 section:__CLANG __clangast 存儲編譯后的 ast 文件。

          動態(tài)庫的特征

          ld 鏈接的動態(tài)庫 FrameW.framework/FrameWMach-O 64-bit dynamically linked shared library arm64 文件

          通過上面兩種文件的特征,我們可以證明 module 與鏈接器沒有關(guān)系。

          考慮到很多情況,我們沒法找到各種命令行工具進行分析,所以,下面介紹一份搜索引擎版本的探索流程

          • 通過搜索引擎查找 “Xcode 教程”

          • 通過 Xcode 教程了解構(gòu)建的完整步驟,并觀察其中的鏈接環(huán)節(jié)

          • 通過 Xcode 的鏈接環(huán)節(jié),我們可以發(fā)現(xiàn)真正執(zhí)行鏈接的二進制文件是 ld

          • 通過搜索引擎查找“如何通過二進制文件找到對應(yīng)的源碼”

          • 嘗試編譯鏈接器(遇到問題,可以通過網(wǎng)絡(luò)引擎搜索解決)

          • 運行鏈接器,并分析鏈接器的源碼執(zhí)行路徑

          注意:

          1. Xcode 的構(gòu)建流程,筆者在上次分享的 llvm 編譯器高級用法:第三方庫插樁 有過簡單介紹,后面會有更加詳細(xì)的文章分享動態(tài)庫、靜態(tài)庫、APP 的構(gòu)建流程。

          2. 通過二進制文件獲取源碼,筆者在上次分享的 iOS 崩潰排查技巧:如何獲取系統(tǒng)庫源碼,后面會有一篇升級版本的獲取系統(tǒng)庫源碼的方案。

          四、總結(jié)和超越

          總結(jié) 是對整個學(xué)習(xí)成果的強化過程。

          通過 ”初識“-”思考“-”探索” 三部曲,我們會學(xué)到很多知識。

          不幸的是,人類的大腦很容易遺忘知識。所以,我們需要一些技巧將記憶強化。

          總結(jié) 的方法有很多種,其中最高效的方案就是 費曼技巧。

          費曼技巧 是一種「以教為學(xué)」的學(xué)習(xí)方式,通過直白淺顯的語言把復(fù)雜深奧的問題和知識傳授給 小孩子 的方式進行學(xué)習(xí)。

          但是,費曼技巧 需要一個傾聽者才會有很好的學(xué)習(xí)效果。所以,我個人更加推薦將 學(xué)習(xí)筆記公開。

          當(dāng)我們選擇將筆記發(fā)到公眾號或者個人博客時,就會強迫自己將整篇文章的知識理順,避免錯誤、遺漏。同時,也會有更多的同行幫我們 指出問題。

          請記住,只有當(dāng)我們把相關(guān)的知識點完整串聯(lián)和記憶后,我們才能真正 超越自己,才能真正的 自我提升

          本文總結(jié)

          本文通過一次完整的學(xué)習(xí)經(jīng)歷分享了 “如何自我學(xué)習(xí)/提升”的問題。

          整體的思路如下:

          • 初識:被灌輸知識的過程。
          • 思考:主動消化知識的過程。
          • 探索:手動進行研究的過程
          • 總結(jié)和超越:完成自我提升的過程

          后記

          除了本文分享的知識外, 百度App Objective-C/Swift 組件化混編之路(二)- 工程化 還有很多的知識或者疑惑點值得研究,下面簡單的列舉幾個,歡迎讀者進行補充。

          • .tbd 是文本類型,為什么原作者會認(rèn)為 dynamic_library 的擴展名是 .tbd

            • dynamic_library:動態(tài)庫,Xcode 7 之前擴展名為 .dylib, Xcode 7 后是 .tbd ;目前官方環(huán)境并不允許為 iOS 平臺添加這種類型。
          • swiftmodule 的依賴會傳遞嗎?有沒有優(yōu)雅的方式解決?

            4.7 小知識:swiftmodule 的傳遞依賴性

            已知:有組件 A 依賴組件 B,組件 B 依賴組件 C 在 Objective-C 中,B 對外暴露的頭文件中引用了 C 的公開頭文件,我們叫組件 B 傳遞依賴 C,結(jié)果就是編譯組件 A 時必須同時能找到組件 B 和組件 C 的頭文件,否則編譯失敗。

            然而 Swift 并沒有公開頭文件一說,只要組件 B import C,導(dǎo)致 swiftmodule 中也明確標(biāo)記了 import C,當(dāng)組件 A import B 時,也同時 import C ,如果組件 A 找不到組件 C 的 module,那組件 A 將編譯失敗。

          • 下面解決報錯的方案是依據(jù)什么原理?在不依賴 Xcode 的情況下,我們該如何解決?

            6.3 App 鏈接一個 Swift 二進制時報錯?

            當(dāng)一個組件或產(chǎn)物需要鏈接其他 Swift 的產(chǎn)物時,比如 App、單測、動態(tài)庫等,需要告訴 Xcode 開啟 Swift 鏈接功能,開啟方法就是添加一個 Swift 文件,否則報錯。






          點個在看少個 bug??

          瀏覽 35
          1點贊
          評論
          1收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          1點贊
          評論
          1收藏
          分享

          手機掃一掃分享

          分享
          舉報
          1. <strong id="7actg"></strong>
          2. <table id="7actg"></table>

          3. <address id="7actg"></address>
            <address id="7actg"></address>
            1. <object id="7actg"><tt id="7actg"></tt></object>
              日韩性做爰免费A片AA片| 国产91综合一区在线观看| 国产三级国产三级国产普通话| 国产真人一级a爱做片| 日本一级黄色电影网| 福利视频免费观看| 97婷婷五月天| 中文字幕视频免费| 亚洲精品中文字幕成人片| 三级片中文| 2018天天干天天操| 毛片网站在线| a网站在线观看| 久久成人毛片| 色哟哟AV| 亚洲第一中文字幕网| 天天干天天做| 奶头和荫蒂添的好舒服囗交漫画| 欧美视频手机在线| 国产精品高清网站| 久久肏逼| 男女啪啪免费视频| 免费在线看a| 91麻豆成人| 亚洲国产精品成人综合色五月| 国产免费激情视频| 91在线视频免费播放| AV高清无码在线| 最新黄色av| 成人AV中文解说水果派| 国产一级二级三级| 91麻豆福利在线| 丁香激情综合| 亚洲五月丁香婷婷| av在线免费观看网址| 亚洲精品一二三区| 玖玖在线| 午夜福利电影无码| 中文字幕亚洲专区| 日韩无码视频网| 欧美色就是色| 日本熟女视频| mm131亚洲国产精品久久| 91亚洲在线观看| 亚洲视频在线观看网站| 搡女人视频国产一级午夜片| 日韩毛片在线| 亚洲无码一区二区三| 91精品国久久久久久无码一区二区三区| 欧美A级视频在线观看| 特黄特色免费视频| 亚洲黄在线观看| 老熟女-ThePorn| 天天做| 天天操天天射天天爽| 亚洲AV成人无码一区二区三区 | 99在线精品视频免费观看软件| 一区二区三区久久久| 久久午夜成人电影| 亚洲国产成人在线视频| 亚洲va在线| 人成在线免费视频| 国产熟女一区二区视频网站| 99久久亚洲精品日本无码| 极品美鮑20p| 亚洲AV在线免费观看| 亚洲人在线观看| 麻豆视屏| 日韩久久中文字幕| 婷婷久久综| 人人操人人爱人人拍| 人妻少妇综合| 成人亚洲A片V一区二区三区蜜月 | 毛片黄色视频| 成人精品三级AV在线看| 可以看的三级网站| 国产激情视频网站| 亚洲有码在线播放| H版视频| 蜜臀久久99精品| 激情五月天网址| 视频一区乳奴| 中文字幕人妻丝袜二区电影| 欧美日韩视频在线播放| 一区二区三区在线播放| 欧美老妇另类BBwBBw| 不卡的av在线| 亚洲中文视频| 中文字幕精品视频在线| 免费黄片网站在线观看| 国产非洲欧美在线| 美女做爱视频网站| AV2014天堂网| 岛国av免费| 韩国精品一区| 国产精品无码毛片| 开心五月激情网| 日韩A片无码ⅩXXXX| 俺也去电影| 国产精品揄拍100视频| 午夜国产码网站码| 日本一区二区三区视频在线观看| 翔田千里50岁无码| 国产小视频在线| 国产一区二区三区四区在线观看| 国产色视频在线| 青青草99热| 亚洲另类天堂| 国产伦子伦一级A片在线| 黄色成人在线视频| 亚洲天堂av在线免费观看| 91超碰在线播放| 123操逼| 国产又爽又黄免费观看| 亲子乱一区二区三区视频| A片久久| 国产五月婷婷| 日韩大黄| 蜜桃91精品入口| 国产免费视频69| 波多野结衣一二三区| 9999久久久久| 男人的天堂网页| 日韩精品人妻一区二区| 韩国gogogo高清在线完整版| 午夜精品18视频国产17c | AV怡红院| 在线你懂的| 色噜噜人妻丝袜无码影院| 日韩综合在线| 真人BBwBBWBBw另类视频| 日本Sm/调教/捆绑/紧缚| 超碰97在线精品国产| 久热超碰| 狠狠躁日日躁夜夜躁A片男男视频| 黄色精品视频| 91碰| 99在线视频观看| 精品国产重口乱子伦| 国产大奶一区二区| 午夜69成人做爱视频网站| 中出欧美亚洲| 狠狠色婷婷777| 人人爽亚洲AV人人爽AV人人片 | 尤物视频在线观看| 免看一级a毛片一片成人不卡| av资源在线| 超碰在线精品| 亚洲色在线视频| 另类老太婆性BBWBBw| 久久成人久久| 激情综合婷婷| 中文字幕人妻丝袜二区电影| 黄色视频网站在线| 日韩美女免费视频| 成人免费Av| 日韩a级毛片| 亚洲精品18在线观看| 51成人网| 成人五区| 胖老板办公室沙发无套爆秘书| 五月天AV在线| 久久六月天| 农村乱子伦毛片国产乱| 尻屄视频免费| www黄片| 精品无码一区二区三区的天堂| 日本黄在线播放| 在线免费观看AV片| 欧美性生交18XXXXX无码| 亚洲一级二级| 操逼视频欧美| 男人的天堂色琪琪| 成人无码中文字幕| 日韩成人黄片| 亚洲三级精品| 日皮免费视频| 北条麻妃波多波多野结衣| 日本不卡一区二区三区四区| 无码人妻精品一区二区三千菊电影| 国产av日韩av| 久久三级片| 欧美狂操| 日韩精品极品视频在线观看免费| 日韩一级黄色电影| 欧美日韩国产精品成人| 91精品国产综合久久久久久久| 中文字幕在线免费| 三级黄色毛片| 亚洲无码av电影| 2019中文字幕在线免费观看| 中文字幕日韩av| 三级毛片视频| 欧美黄片免费视频| 成人在线视频播放| 影音先锋国产AV| igao在线观看| 婷婷丁香六月| 国产aⅴ激情无码久久久无码 | 黄色带亚州| 日本无码电影| 欧美内射网站| 97av视频| 91视频观看| 久久综合伊人| 黑人一区二区三区四区| 日本免费高清视频在线观看一区| 午夜无码人妻AV大片| a片在线观看视频| 亚洲aaa在线| 伊人亚洲| 激情av在线| 精品成人在线视频| 日本少妇激情视频| 国产精品秘久久久久久免费播放| 色香蕉在线| 无码不卡av| 97人妻一区二区精品免费视频| 亚洲综合区| 国产一卡二卡三卡| 黄色A片电影| 精品一区二区三区四区五区| 狠狠狠久久久| 欧美成人网站在线观看| 免费乱伦视频| 亚洲成人在线无码| 蜜桃影院| 成人黄色毛片视频| 日韩免费在线| 17c.白丝喷水自慰| 国产a片免费看| 免费无码婬片AAAA片在线蜜芽 | 日韩啪啪啪网站| 先锋AV资源站| 夜夜网站| 欧美一级在线观看| 黄色电影A片| 日韩一级无码特黄AAA片| 爱爱免费看片| 无码人妻一区二区三一区免费n狂飙 | 波多野结衣高清无码视频| 婷婷五月天成人| 在线免费观看成人网站| 日韩电影免费在线观看| 淫荡少妇美红久久久久久久久久 | 国产中文在线观看| 中文一区在线| 无码一页| 在线观看黄色小电影| 欧美成人网站视频| 日韩成人在线视频| 欧美成人久久| AV三级片在线观看| h片在线看| 亚洲日韩欧美在线观看| 操逼爽| 久久精彩免费视频| 日本黄色视频。| 亚洲AV无码成人精品区东京热| 男女嫩草视频| 天天日夜夜爽| 久色| 69视频网| 九九综合久久| 玖玖大香蕉| 亚洲高清无码在线免费观看| 自拍视频网| 97AV在线| 日韩一区二区三区无码| 粉嫩99精品99久久久久久特污 | www.天天射视频| 免费AV网站| 国产成人久久777777黄蓉| 亚洲成人在线免费观看| 操屄视频在线观看| 天天操免费视频| 黄a在线观看| 国产无码播放| 超碰2025| 西西人体444rt高清大胆模特| 日韩无码字幕| wwwsesese| 成人无码久久| 少妇推油呻吟白浆啪啪成人片| AV黄色在线| 爱爱免费看片| 狠狠色五月亚洲91| 高清无码免费不卡| 亚洲欧美国产高清vA在线播放| 日本黄色免费在线观看| 午夜ww| 亚洲AV成人一区二区三区不卡 | 国产精品乱子伦视频一区二区| 无码窝在线观看| 少妇白洁视频| 黄色A片免费看| 一二三区视频| 国产精品偷拍| 欧美日韩99| a在线免费观看|