深入淺出 Xcode 命令列(加餐) - libxcselect.dylib
Xcode命令列 = Xcode Command Lines Tool
經過深入淺出 Xcode 命令列(1) - 初探的介紹,我們知道一台mac上可能會有多’組’xcode command line tool.
且在xcode-select的幫助下,我們能指定某個特定版本的Command Line Tools,然後整台電腦在不需要設定env變量的前提下,就知道該調那個SDK了…. 聽起來很符合直覺,卻有點太玄了…😰
–
讓我們稍微深追一下這問題
礙於我的知識有限,所以這篇寫做加餐,咱們點到為止😅
things we know
複習一下,當我們在終端敲命令(例如: xcodebuild)時,系統都會在 $PATH 這個環境變量裡給的路徑裡尋找你敲的指令的object file。
echo $PATH
所以輸入 git, 其實是執行了 /usr/bin/xcodebuild
which git
以上都是我們熟知的原理。
things we don’t know
我們現在已xcodebuild為例,來看看後面有關xcode command line tools的流程。
我對詳細的逆向函數還不是很熟悉,所以統整了一些參考文章,想要深入暸解的可以點擊文章底部鏈接。
看看/usr/bin/xcodebuild
下的指令是怎麼配合xcode-select , 找到 /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
?
首先我們就對 /usr/bin/xcodebuild 動手
列出 /usr/bin/xcodebuild 的 textsection
再打印 /usr/bin/xcodebuild 的 name list
結合這兩個信息,我們可以得出
- 調用了一個 _xcselect_invoke_xcrun 函數
- 這個函數對 /usr/bin/xcodebuild 來說是一個外部符號,來自另一個動態庫,交給動態鏈接去做了。
接著
打印 /usr/bin/xcodebuild依賴的庫
可以看到有 libxcselect.dylib, libSystem.B.dylib,
打印 libxcselect.dylib 的 name list 看看 _xcselect_invoke_xcrun這symbol 在不在這
bingo! 找到了
跟著 Swift-Swiftc 作者的追蹤,可以得到如下
1 | libxcselect.dylib |
而最後的 xcrun_main -> 指向的就是 指令 xcrun
xcrun
截至目前,我們能把上面的所有堆棧,抽象大概濃縮成一行函數,類似於
xcrun('xcodebuild')
而xcrun 就會引領我們到
/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
至於xcrun的用法,我們下回分曉。
撥雲見日
參考文章: