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!