深入淺出 Xcode 命令列(加餐) - libxcselect.dylib

Xcode命令列 = Xcode Command Lines Tool

經過深入淺出 Xcode 命令列(1) - 初探的介紹,我們知道一台mac上可能會有多’組’xcode command line tool.

多組xcode command line tool

且在xcode-select的幫助下,我們能指定某個特定版本的Command Line Tools,然後整台電腦在不需要設定env變量的前提下,就知道該調那個SDK了…. 聽起來很符合直覺,卻有點太玄了…😰

giphy -1-

讓我們稍微深追一下這問題

礙於我的知識有限,所以這篇寫做加餐,咱們點到為止😅

things we know

複習一下,當我們在終端敲命令(例如: xcodebuild)時,系統都會在 $PATH 這個環境變量裡給的路徑裡尋找你敲的指令的object file。

echo $PATH

所以輸入 git, 其實是執行了 /usr/bin/xcodebuild

which git

以上都是我們熟知的原理。

llibSelect1

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

結合這兩個信息,我們可以得出

  1. 調用了一個 _xcselect_invoke_xcrun 函數
  2. 這個函數對 /usr/bin/xcodebuild 來說是一個外部符號,來自另一個動態庫,交給動態鏈接去做了。

接著

打印 /usr/bin/xcodebuild依賴的庫

可以看到有 libxcselect.dylib, libSystem.B.dylib,

打印 libxcselect.dylib 的 name list 看看 _xcselect_invoke_xcrun這symbol 在不在這

bingo! 找到了

跟著 Swift-Swiftc 作者的追蹤,可以得到如下

1
2
3
4
5
6
7
libxcselect.dylib
->
_xcselect_invoke_xcrun
->
libxcrun.dylib
->
xcrun_main

而最後的 xcrun_main -> 指向的就是 指令 xcrun

xcrun

截至目前,我們能把上面的所有堆棧,抽象大概濃縮成一行函數,類似於

xcrun('xcodebuild')

而xcrun 就會引領我們到

/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild

至於xcrun的用法,我們下回分曉。

撥雲見日

llibSelect

giphy -2-

參考文章:

Comments

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×