macOS系統中預設的C/C++編譯器是clang/clang++,命令行使用gcc/g++或者clang/clang++來執行命令時,都是調用clang/clang++編譯器,想使用gcc/g++編譯器的話,我們可以自己安裝。 查看一下gcc和clang 1. 安裝Homebrew,官網鏈接,複製 ...
macOS系統中預設的C/C++編譯器是clang/clang++,命令行使用gcc/g++或者clang/clang++來執行命令時,都是調用clang/clang++編譯器,想使用gcc/g++編譯器的話,我們可以自己安裝。
查看一下gcc和clang
1. 安裝Homebrew,官網鏈接,複製粘貼到Terminal運行腳本,如下
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2. 安裝gcc編譯器集
查看安裝的版本,由於macOS中的gcc名字被占用,所以需要使用gcc-13來調用新安裝的gcc編譯器集,如前面可以看到安裝的大版本號是13,如果想使用gcc來調用gcc編譯器而不是clang,可以修改預設編譯器(這裡不修改)。
3. 安裝gdb
macOS的debugger是lldb,得自己安裝gdb,並且安裝後要仔細的設置一下(比較麻煩),否則會報錯:
WARNING: Debugger executable '/usr/local/bin/gdb' is not signed. As a result, debugger may not work properly.
ERROR: Unable to start debugging. Unexpected GDB output from command "-exec-run". Unable to find Mach task port for process-id 5602: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
安裝完成後,可以查看一下安裝位置,
接下來是關鍵部分,重要!重要!
3.1 在System keychain中創建證書
開始使用新構建的gdb之前,要授權,就像前面圖中劃線部分,gdb requires special privileges to access Mach ports. 這裡參考GDB Wiki
GDB Wiki中有的步驟使用了自動腳本,這裡僅使用手動方式,系統是macOS Ventura Version 13.2.1,
(1) 雙擊打開 Keychain Access Application,位置在 /Applications/Utilities/Keychain Access.app
(2)打開菜單項 Keychain Access --> Certificate Assistant --> Create a Certificate... ,點擊Create a Certificate...
(3)給證書選個名字,此處是 gdb_codesign,可以用其他名字; 設置 Identity Type 為 Self Signed Root ; 設置 Certificate Type 為 Code Signing ; 勾選 Let me override defaults,然後Continue,
接下來預設即可(中間截圖省略),點擊幾次Continue,直到為證書指定位置(Specify a Location For The Certificate),設置 Keychain 為 System ,然後 Create,輸入密碼
創建成功會顯示如下,然後退出 Keychain Access Application 來刷新一下證書存儲。(如果不能在System keychain中存儲證書,可以選擇在 login 中創建證書,接著導出,然後將證書導入到System keychain中)
(4)控制
在命令行Terminal中輸入下麵的命令,gdb_codesign 要改成自己的證書名稱,確保 keychain 是 System keychain
security find-certificate -c gdb_codesign |grep System.keychain
再確保證書沒有過期,命令行輸入,同樣 gdb_codesign 要改成自己的證書名稱,
security find-certificate -p -c gdb_codesign | openssl x509 -checkend 0
3.2 信任證書 (Trust the certificate for code signing)
還是選擇手動操作,再次打開 Keychain Access Application
(1)點擊 System --> My Certificates --> 雙擊 gdb_codesign,找到 Trust 一項並展開,設置 Code Signing 為 Always Trust ,再一次退出Keychain Access Application 來刷新一下證書存儲。
(2)控制
在命令行Terminal輸入以下命令,會顯示 gdb_codesign 這個證書的 trust settings信息,包括Code Signing
security dump-trust-settings -d
3.3 簽名(Sign and entitle the gdb binary)
(1)在home工作路徑下創建一個文件,命令行中輸入 touch gdb-entitlement.xml ,文件包含以下內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
<key>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>
(2)命令行中輸入以下命令,gdb_codesign 改成自己的證書名字,必要時在命令前加上 sudo,如果需要頻繁地構建 gdb,可以加上 --enable-codesign=gdb_codesign (gdb_codesign改成自己的)
codesign --entitlements gdb-entitlement.xml -fs gdb_codesign $(which gdb)
(3)控制
在命令行中輸入以下命令
codesign -vv $(which gdb)
codesign -d --entitlements :- $(which gdb)
3.4 刷新一下系統的證書和code-signing 數據 (Refresh the system's certificates and code-signing data)
最可靠的方式就是重啟系統。
註:實測有效,系統版本是 macOS Ventura Version 13.2.1
Enjoy it!