macOS下安装gcc、gdb (实测可行)

寻技术 macOS 2023年07月10日 177

 

 

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 TypeSelf Signed Root ; 设置 Certificate Type Code Signing ; 勾选 Let me override defaults,然后Continue,

接下来默认即可(中间截图省略),点击几次Continue,直到为证书指定位置(Specify a Location For The Certificate),设置 KeychainSystem ,然后 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!

关闭

用微信“扫一扫”