You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS 12编译运行proxychains-ng触发SIGKILL强制退出排查

问题:macOS 12 M1 Max环境编译proxychains-ng后启动即被SIGKILL终止

在搭载M1 Max芯片的macOS 12系统上,编译支持Apple Silicon --fat-binary-m1 特性的proxychains-ng(对应支持提交标记为support)后,生成的二进制文件会被操作系统立即强制终止。最初排查方向指向权限问题,但未发现权限异常,即使用lldb挂载调试也无法命中初始断点。

相关操作Shell执行结果如下:

$ git clone proxychains-ng源码仓库
$ cd proxychains-ng
$ CFLAGS="-g3 -O0" ./configure --fat-binary-m1 --sysconfdir=/opt/homebrew/etc/
...
$ make
$ ./proxychains4
fish: Job 1, './proxychains4' terminated by signal SIGKILL (Forced quit)
$ ./proxychains4 ping 1.1.1.1                                                                                           
fish: Job 1, './proxychains4 ping 1.1.1.1' terminated by signal SIGKILL (Forced quit)
$ lldb proxychains4 ping 1.1.1.1
(lldb) target create "proxychains4"
Current executable set to '~/src/proxychains-ng/proxychains4' (arm64e).
(lldb) settings set -- target.run-args  "ping" "1.1.1.1"
(lldb) b main
Breakpoint 1: where = proxychains4`main + 60 at main.c:69:8, address = 0x0000000100003578
(lldb) run
error: process exited with status -1 (no such process.)

已确认系统完整性保护(SIP)与Gatekeeper均处于关闭状态:

$ csrutil status                                                                                                      
System Integrity Protection status: disabled.
$ spctl --status
assessments disabled

使用ktrace、dtruss工具排查未获取到有效线索,无法定位进程被强制终止的触发原因。


触发原因

核心问题出在--fat-binary-m1编译参数的逻辑缺陷:该参数会强制将编译输出的二进制架构标记为arm64e,但普通用户态环境编译生成的arm64e可执行文件不携带Apple要求的合法代码签名与对应架构权限标记,macOS 12及以上版本的内核会在进程启动的最早期(加载器将控制权交给main函数之前)直接向进程发送SIGKILL终止信号。这也是lldb无法命中断点、跟踪工具抓不到用户态系统调用的根本原因——进程从未进入用户态执行逻辑就被内核销毁。

该问题与SIP、Gatekeeper开关状态无关,即使关闭两类系统防护,内核依然会对签名不合规的arm64e可执行文件执行强制终止逻辑。

解决方案
  • 常规编译场景:直接去掉--fat-binary-m1参数重新编译,默认配置会生成适配Apple Silicon的标准arm64架构二进制,不会触发内核的架构签名校验:
# 清理旧编译产物
$ make clean
# 重新配置编译参数,移除--fat-binary-m1
$ CFLAGS="-g3 -O0" ./configure --sysconfdir=/opt/homebrew/etc/
$ make
# 验证运行
$ ./proxychains4 -v
  • 需要同时支持x86_64/arm64的通用二进制场景:不要使用存在缺陷的--fat-binary-m1开关,手动在CFLAGS中指定双架构参数编译即可:
$ make clean
$ CFLAGS="-g3 -O0 -arch arm64 -arch x86_64" ./configure --sysconfdir=/opt/homebrew/etc/
$ make

编译完成后二进制可正常运行,不会再出现启动即被强制终止的问题。


内容的提问来源于stack exchange,提问作者ylluminate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 08:31:09