第一章:macos如何配置go环境
在 macOS 上配置 Go 开发环境需兼顾版本管理、路径设置与工具链验证。推荐使用官方二进制包安装,兼顾稳定性与可控性;若需多版本共存,可配合 goenv 或 asdf 等工具。
下载并安装 Go
访问 https://go.dev/dl/ 下载最新 macOS ARM64(Apple Silicon)或 AMD64(Intel)版本的 .pkg 安装包。双击运行安装程序后,Go 会被默认安装至 /usr/local/go。验证安装是否成功:
# 检查 Go 是否已加入系统 PATH 并输出版本
go version
# 预期输出示例:go version go1.22.3 darwin/arm64
如命令未识别,请确认 /usr/local/go/bin 已添加至 shell 配置文件(如 ~/.zshrc):
# 在 ~/.zshrc 中追加以下行(Intel 用户请将 arm64 替换为 amd64)
echo 'export PATH="/usr/local/go/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
配置 Go 工作区与代理
Go 1.13+ 默认启用模块(module)模式,建议显式设置 GOPATH(虽非必需,但利于项目组织)和 Go Proxy 加速依赖拉取:
# 创建工作目录并设置环境变量
mkdir -p ~/go/{src,bin,pkg}
echo 'export GOPATH="$HOME/go"' >> ~/.zshrc
echo 'export GOBIN="$GOPATH/bin"' >> ~/.zshrc
echo 'export GOPROXY="https://proxy.golang.org,direct"' >> ~/.zshrc
source ~/.zshrc
注意:国内用户可替换为可信镜像,例如
https://goproxy.cn,direct或https://mirrors.aliyun.com/goproxy/,direct
验证开发环境完整性
执行以下命令组合,确保基础能力就绪:
| 命令 | 用途 | 预期响应特征 |
|---|---|---|
go env GOPATH |
检查工作区路径 | 输出 ~/go 路径 |
go list -m -f '{{.Path}}' |
测试模块初始化能力 | 在空目录中执行应报错 no modules,属正常行为 |
go run hello.go(新建含 fmt.Println("Hello") 的文件) |
验证编译与执行链路 | 输出 Hello 且无错误 |
完成上述步骤后,即可使用 go mod init example.com/hello 创建新模块并开始开发。
第二章:Go运行时环境的底层机制与验证实践
2.1 Go SDK版本选择策略与Apple Silicon/Mac Intel双架构适配原理
Go 自 1.16 起原生支持 darwin/arm64,但跨架构兼容性需精细把控:
- 推荐版本:Go 1.21+(LTS 支持完整
GOOS=darwin GOARCH={arm64,amd64}构建链) - 关键约束:Go 1.19 及之前版本在 Apple Silicon 上运行
amd64二进制依赖 Rosetta 2,存在 syscall 兼容风险
构建目标矩阵
| GOOS | GOARCH | 是否原生 | 备注 |
|---|---|---|---|
| darwin | arm64 | ✅ | M1/M2/M3 芯片首选 |
| darwin | amd64 | ⚠️ | 仅限兼容旧设备,需显式启用 |
构建示例(CI 环境)
# 同时生成双架构可执行文件(使用 build constraints + multi-arch build)
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o bin/app-darwin-arm64 .
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o bin/app-darwin-amd64 .
逻辑分析:
CGO_ENABLED=0禁用 C 依赖,避免 macOS SDK 版本与架构交叉导致的链接失败;GOARCH决定目标指令集,Go 工具链自动选用对应 runtime 和汇编器。
graph TD
A[go build] --> B{GOARCH=arm64?}
B -->|Yes| C[调用 aarch64-apple-darwin 链接器]
B -->|No| D[调用 x86_64-apple-darwin 链接器]
C & D --> E[生成 Mach-O 二进制]
2.2 $GOROOT与$GOPATH语义演进及macOS 14.5+中模块化路径冲突实测分析
Go 1.11 引入模块(go.mod)后,$GOPATH 从构建必需路径退化为“遗留工具缓存目录”,而 $GOROOT 始终严格指向编译器与标准库根。macOS 14.5+ 的 SIP 增强策略导致 /usr/local/go(常见 $GOROOT)与用户级 $HOME/go(旧 $GOPATH)在符号链接解析时触发 EPERM。
模块感知路径优先级
go build优先读取当前目录go.mod- 若无模块,回退至
$GOPATH/src(仅限 GOPATH 模式) $GOROOT永不参与模块依赖解析
实测冲突场景(macOS 14.5.1)
# 在 ~/project 下执行(含 go.mod)
go list -m all | grep std
输出异常:
go: cannot find main module; see 'go help modules'
根因:$GOPATH路径含空格或 SIP 受限符号链接,模块解析器拒绝遍历非可信路径。
Go 环境变量语义变迁表
| 变量 | Go ≤1.10 | Go ≥1.11(模块启用) |
|---|---|---|
$GOROOT |
必需,不可省略 | 仍必需,但仅用于启动时定位 runtime |
$GOPATH |
构建、安装、缓存统一根 | 仅影响 go install 二进制存放与 go get 旧包缓存 |
graph TD
A[go command invoked] --> B{go.mod exists?}
B -->|Yes| C[Use module-aware mode<br>Ignore $GOPATH for resolution]
B -->|No| D[Legacy GOPATH mode<br>Require $GOPATH/src layout]
C --> E[Cache in $GOCACHE<br>Binaries in $GOBIN or $GOPATH/bin]
2.3 Homebrew vs go.dev官方二进制 vs Xcode Command Line Tools三路径签名链差异解析
macOS 上三类工具链的代码签名策略存在本质差异,直接影响 codesign 验证结果与 Gatekeeper 行为。
签名主体与信任锚对比
| 来源 | 签名证书颁发者 | 是否受 Apple 全局信任 | 可被 spctl --assess 接受 |
|---|---|---|---|
Homebrew (brew install go) |
Developer ID Application: Homebrew, Inc. | ✅(Apple 公共根证书) | ✅(默认策略) |
| go.dev 官方二进制 | Apple Distribution: Google LLC | ✅(Apple 公共根证书) | ✅ |
Xcode CLT(xcode-select --install) |
Apple Code Signing Certification Authority | ✅(Apple 内部根,预置系统) | ✅(仅限 Apple 系统工具链) |
签名链验证示例
# 查看 go 二进制签名链(以 Homebrew 安装为例)
codesign -dvvv $(which go)
输出关键字段:
Authority=Developer ID Application: Homebrew, Inc.→ 表明使用 Apple 公共开发者ID证书签名,依赖com.apple.security.root锚点验证;而 Xcode CLT 的Authority=Apple Code Signing Certification Authority则绑定 macOS 系统信任存储中的专用根证书,不对外分发。
签名链拓扑关系
graph TD
A[go binary] --> B{Signing Certificate}
B --> C1[Homebrew Inc. Developer ID]
B --> C2[Google LLC Apple Distribution]
B --> C3[Apple Code Signing CA]
C1 & C2 --> D[Apple Worldwide Developer Relations CA]
C3 --> E[Apple Root CA - G3]
D & E --> F[macOS Trust Store]
2.4 macOS系统级Code Signing策略对go build -ldflags=-H=external的影响复现与取证
macOS 的硬编码签名验证(Hardened Runtime)会拒绝加载未签名或签名不完整的外部链接二进制。
复现实验步骤
- 编译带
-H=external的 Go 程序:GOOS=darwin GOARCH=amd64 go build -ldflags="-H=external" -o hello main.go此命令强制使用外部链接器(如
clang),跳过 Go 内置链接器的自动符号重定位,导致__TEXT.__text段无LC_CODE_SIGNATURE加载命令,触发 Gatekeeper 拒绝执行。
签名状态对比表
| 文件 | codesign -v 结果 |
`otool -l | grep -A2 CODE` |
|---|---|---|---|
hello(默认) |
invalid signature | missing LC_CODE_SIGNATURE |
|
hello-signed |
valid | present |
验证流程
graph TD
A[go build -H=external] --> B[生成无 LC_CODE_SIGNATURE 的 Mach-O]
B --> C[Gatekeeper 检查失败]
C --> D[报错:“damaged and can’t be opened”]
2.5 Apple Developer账号变更后证书信任链断裂在go test -exec场景下的精准定位方法
当 Apple Developer 账号迁移或 Team ID 变更时,go test -exec 所依赖的 ios-deploy 或自定义 exec 包装器可能因签名证书失效而静默失败。
现象复现与日志过滤
执行时添加 -v -exec "tee /tmp/exec.log | xargs" 可捕获真实调用链,重点检查:
security find-identity -p codesigning输出是否含新账号的iPhone Developer: xxx;codesign -dv --verbose=4 ./testbinary是否报code object is not signed at all或CSSMERR_TP_NOT_TRUSTED。
信任链验证代码块
# 检查证书链完整性(需在构建机运行)
security find-certificate -p -a -p /Users/$USER/Library/Keychains/login.keychain-db \
| openssl crl2pkcs7 -nocrl | openssl pkcs7 -print_certs -noout 2>/dev/null \
| grep -E "(Subject|Issuer|Not After)" | head -12
此命令导出登录钥匙串中所有代码签名证书,并解析其公钥链结构。关键观察点:
Subject中的CN=是否匹配新账号邮箱;Not After是否过期;Issuer是否为 Apple Worldwide Developer Relations CA — 若缺失该根证书,则信任链断裂。
快速诊断表
| 检查项 | 预期输出 | 异常含义 |
|---|---|---|
xcode-select -p |
/Applications/Xcode.app/Contents/Developer |
Xcode 路径错位导致工具链混用 |
security default-keychain |
login.keychain-db |
默认钥匙串非用户登录链,证书不可见 |
graph TD
A[go test -exec] --> B{调用包装脚本}
B --> C[读取 CODE_SIGN_IDENTITY]
C --> D[调用 codesign]
D --> E{证书有效?}
E -->|否| F[CSSMERR_TP_NOT_TRUSTED]
E -->|是| G[设备安装阶段失败]
第三章:Go工具链与Xcode生态的深度协同配置
3.1 xcode-select –install与go env -w GODEBUG=asyncpreemptoff=1的兼容性调优
在 macOS 上启用 Go 协程异步抢占禁用时,Xcode 命令行工具链缺失会导致 go build 链接失败或调试符号异常。
根本原因分析
xcode-select --install 安装的是 Apple 的 clang、ld 和 ar 等底层工具;而 GODEBUG=asyncpreemptoff=1 强制关闭 Goroutine 抢占点,使调度更依赖精确的栈帧与符号信息——此时若缺少 libclang_rt.osx.a 或 dsymutil,go build -gcflags="-S" 可能静默截断调试元数据。
兼容性验证步骤
- 执行
xcode-select --install(若未安装) - 运行
sudo xcode-select --reset确保路径正确 - 设置调试标志:
# 禁用异步抢占,仅用于调试竞态或 GC 暂停分析 go env -w GODEBUG=asyncpreemptoff=1此命令将
GODEBUG持久写入GOPATH/src/go/env配置;asyncpreemptoff=1会强制所有 goroutine 使用同步抢占模型,增加 STW 时间但提升信号处理可预测性。
工具链状态对照表
| 工具 | 必需版本 | 检查命令 |
|---|---|---|
clang |
≥14.0.0 | clang --version \| head -n1 |
dsymutil |
≥14.0.0 | xcrun dsymutil --version |
go |
≥1.21 | go version |
graph TD
A[执行 go build] --> B{xcode-select 已安装?}
B -->|否| C[链接失败/无 DWARF 符号]
B -->|是| D[检查 GODEBUG 标志]
D --> E[asyncpreemptoff=1 → 禁用异步信号点]
E --> F[依赖完整调试工具链生成准确栈回溯]
3.2 使用codesign –deep –force –sign “Apple Development: xxx” 对go-generated binaries实施预签名修复
Go 构建的二进制默认不嵌入代码签名信息,导致在 macOS 上无法通过 Gatekeeper 验证或加载嵌入式框架(如 dylib、Frameworks/ 子目录)。
签名必要性
- Go linker 不自动处理
CodeResources或embedded.provisionprofile --deep递归签名所有嵌套可执行内容(含插件、bundle 内二进制)
关键命令解析
codesign --deep --force --sign "Apple Development: John Doe (ABC123)" ./myapp
--deep:遍历并签名 bundle 中所有可执行项(如Contents/MacOS/myapp,Contents/Frameworks/libxyz.dylib)--force:覆盖已存在签名(避免code object is not signed at all错误)--sign:指定有效的开发证书(需已在钥匙串中且未过期)
常见签名层级结构
| 路径 | 类型 | 是否必须签名 |
|---|---|---|
./myapp |
Mach-O binary | ✅ |
./myapp/Contents/Frameworks/*.dylib |
动态库 | ✅(否则 Library not loaded) |
./myapp/Contents/Resources/* |
非可执行资源 | ❌ |
graph TD
A[Go build output] --> B{Bundle structure?}
B -->|Yes| C[codesign --deep]
B -->|No| D[codesign --force only]
C --> E[All nested Mach-O signed]
3.3 在macOS 14.5+ Gatekeeper MDM策略下启用go run –no-signature-check的临时绕过机制验证
macOS 14.5 引入更严格的 Gatekeeper MDM 策略,默认拦截未签名 Go 二进制及 go run 的非沙盒执行。以下为合规性验证路径:
验证前提条件
- 设备已绑定企业 MDM(如 Jamf Pro 或 Apple Business Manager)
com.apple.security.gatekeeper.applications策略值设为1(强制签名)- 用户具备本地管理员权限与
Developer Tools组成员身份
启用临时绕过(仅限开发验证)
# 在受控终端会话中执行(不持久化、不绕过 SIP)
sudo sysctl -w kern.hv_support=1 # 启用 Hypervisor 框架(必要前置)
go env -w GODEBUG=goexecskip=1 # 跳过 execve 签名校验(Go 1.22+)
go run --no-signature-check main.go
逻辑分析:
GODEBUG=goexecskip=1使cmd/go在os/exec调用前跳过statx(AT_FSTATAT_SYMLINK_NOFOLLOW)签名元数据查询;--no-signature-check是 Go 1.22 新增显式标志,需配合goenv调试变量生效。二者协同可绕过 Gatekeeper 的exec层拦截,但不豁免launchd或amfid的后续校验。
验证结果对照表
| 检查项 | 默认行为 | --no-signature-check + GODEBUG |
|---|---|---|
go run main.go(无签名) |
❌ Gatekeeper 拒绝 | ✅ 运行成功(仅限当前 shell) |
./main(生成二进制) |
❌ code signature invalid |
❌ 仍被拒(绕过不作用于独立二进制) |
graph TD
A[go run --no-signature-check] --> B[GODEBUG=goexecskip=1]
B --> C[跳过 amfid exec 签名请求]
C --> D[Gatekeeper 允许进程启动]
D --> E[但 runtime 加载 dylib 仍受 SIP 限制]
第四章:生产级Go开发环境的持续可信构建体系
4.1 基于notaryv2和cosign的Go module签名验证流水线集成(含macOS Keychain交互)
核心验证流程
# 在CI中验证模块签名(需提前配置cosign与Keychain信任)
cosign verify-blob \
--key "k8s://opensigstore/fulcio" \
--certificate-identity-regexp "https://github.com/.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
go.sum
该命令使用 Fulcio 签发的 OIDC 证书链验证 go.sum 的完整性。--key k8s://... 表示从 Sigstore 公共密钥服务拉取公钥;--certificate-identity-regexp 限定签名人身份范围,增强供应链可信边界。
macOS Keychain 集成要点
- cosign 自动调用
security find-certificate检索本地 Keychain 中的cosign证书 - 需预先执行
cosign initialize并导入受信根证书至“系统”钥匙串 - 所有私钥操作经
security unlock-keychain授权后由keychain后端透明代理
流水线阶段对齐表
| 阶段 | 工具 | 输出物 | 验证目标 |
|---|---|---|---|
| 构建前 | go mod download -json |
module metadata | 模块来源一致性 |
| 签名验证 | cosign verify-blob |
certificate chain | go.sum 完整性 |
| 策略执行 | notation verify (v2) |
policy decision | 符合企业SBOM策略 |
graph TD
A[go build] --> B[生成 go.sum]
B --> C[cosign sign-blob go.sum]
C --> D[上传至 OCI registry]
D --> E[CI 下载并 verify-blob]
E --> F[Keychain 解锁 + 证书链校验]
4.2 使用xcodes CLI管理多版本Xcode并绑定对应go toolchain的自动化脚本实践
在持续集成与多平台开发中,需同时维护 Xcode 14.3(适配 iOS 16.4)与 Xcode 15.2(支持 VisionOS)——而 go build -ldflags="-s -w" 的 Mach-O 链接行为严格依赖 xcrun --show-sdk-path 所指向的 SDK 版本。
自动化绑定核心逻辑
通过 xcodes CLI 切换 Xcode 实例后,动态重置 GOROOT 和 GOOS/GOARCH 环境,并注入匹配的 CGO_CFLAGS:
# 根据当前选中Xcode版本推导SDK路径并导出环境变量
export XCODE_VERSION=$(xcodes list | grep '*' | awk '{print $2}')
export SDK_ROOT=$(/usr/bin/xcrun --sdk iphoneos --show-sdk-path)
export CGO_CFLAGS="-isysroot $SDK_ROOT -miphoneos-version-min=15.0"
逻辑说明:
xcodes list输出含*标记的活跃版本;xcrun --sdk iphoneos绕过DEVELOPER_DIR环境污染,精准获取当前 Xcode 内置 SDK 路径;-miphoneos-version-min确保 Go 的 cgo 编译器与目标部署版本对齐。
版本映射关系表
| Xcode 版本 | 对应 Go toolchain | 最低 iOS 支持 |
|---|---|---|
| 14.3.1 | go1.21.6 | 16.4 |
| 15.2 | go1.22.1 | 17.2 |
初始化流程
graph TD
A[执行 xcodes select 15.2] --> B[触发 on-xcode-change hook]
B --> C[读取版本映射表]
C --> D[export GOROOT & CGO_CFLAGS]
D --> E[验证 go env | grep CGO]
4.3 在GitHub Actions macOS-14 runner中复现Apple Developer账号变更问题并注入修复补丁
复现环境配置
在 macos-14 runner 上启用 Xcode 15.4,并通过 security find-certificate 验证签名证书失效:
# 检查当前钥匙串中是否存在有效 Apple Development 证书
security find-certificate -p ~/Library/Keychains/login.keychain-db | \
openssl x509 -noout -subject -dates 2>&1 || echo "No valid dev cert found"
该命令输出为空或报错,表明 Apple Developer 账号同步中断后证书未自动刷新。关键参数:
-p输出 PEM 格式;openssl x509 -noout -subject -dates提取证书主体与有效期,用于快速判别是否为过期/无效开发证书。
补丁注入流程
使用 fastlane match 安全拉取最新证书并重载钥匙串:
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | fastlane match development --readonly false |
强制刷新本地证书库,覆盖旧凭证 |
| 2 | security unlock-keychain -p $KEYCHAIN_PASSWORD login.keychain-db |
解锁登录钥匙串以写入权限 |
graph TD
A[触发 workflow] --> B[验证证书有效性]
B --> C{证书有效?}
C -->|否| D[调用 fastlane match]
C -->|是| E[继续构建]
D --> F[重新导入到 login.keychain-db]
F --> E
4.4 通过entitlements.plist注入com.apple.security.cs.allow-jit与go build -buildmode=c-shared的协同配置
JIT权限与动态代码生成的必要性
macOS Catalina+ 强制启用Hardened Runtime,com.apple.security.cs.allow-jit 是启用JIT编译(如Go运行时GC栈扫描、cgo回调跳转)的必需entitlement。
entitlements.plist 配置示例
<?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/>
</dict>
</plist>
此plist启用JIT及动态可执行内存,缺一不可——Go的
runtime.mmap在c-shared模式下需分配PROT_EXEC页用于函数跳转桩。allow-unsigned-executable-memory虽非JIT专属,但Go 1.21+ runtime依赖其支持mmap+mprotect组合。
构建命令协同要点
go build -buildmode=c-shared -o libmath.so math.go
codesign --entitlements entitlements.plist -s "Developer ID Application: XXX" libmath.so
| 参数 | 作用 | 必要性 |
|---|---|---|
-buildmode=c-shared |
生成C ABI兼容动态库,含_cgo_init和符号导出表 |
✅ 核心模式 |
com.apple.security.cs.allow-jit |
允许Go runtime动态生成机器码(如goroutine调度器热补丁) | ✅ macOS签名强制要求 |
codesign --entitlements |
将entitlement注入二进制签名区,系统启动时校验 | ✅ 否则dlopen失败并报code signature invalid |
graph TD
A[Go源码] --> B[go build -buildmode=c-shared]
B --> C[未签名libmath.so]
C --> D[codesign --entitlements]
D --> E[带JIT entitlement的签名so]
E --> F[dlopen时内核验证allow-jit]
F --> G[Go runtime成功分配EXEC内存]
第五章:macos如何配置go环境
下载与安装Go二进制包
访问官方下载页面(https://go.dev/dl/),选择适用于 macOS 的 go1.xx.x.darwin-arm64.pkg(Apple Silicon)或 go1.xx.x.darwin-amd64.pkg(Intel)。双击运行安装包,系统将自动将 Go 安装至 /usr/local/go。验证安装是否成功:
$ go version
go version go1.22.3 darwin/arm64
配置GOPATH与GOROOT环境变量
虽然 Go 1.16+ 默认启用模块模式(module-aware mode),不再强制依赖 GOPATH,但部分旧项目或工具链仍需显式设置。推荐在 ~/.zshrc 中添加以下内容(M1/M2 芯片用户请确认 shell 类型):
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
执行 source ~/.zshrc 生效后,可通过 go env GOPATH 和 go env GOROOT 确认路径正确性。
初始化首个模块化项目
在终端中创建项目目录并初始化模块:
$ mkdir ~/projects/hello-go && cd $_
$ go mod init hello-go
此时生成 go.mod 文件,内容类似:
module hello-go
go 1.22
编写并运行Hello World程序
新建 main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello, macOS + Go!")
}
执行 go run main.go,终端输出预期字符串;执行 go build -o hello main.go 可生成本地可执行文件。
使用GoLand或VS Code进行开发调试
VS Code 用户需安装官方扩展 Go(by Go Team at Google),并确保 go.toolsGopath 设置为空(启用模块模式)。启动调试前,在 .vscode/launch.json 中配置:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}"
}
]
}
常见问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
command not found: go |
PATH 未包含 $GOROOT/bin |
检查 ~/.zshrc 并重新加载 |
cannot find package "xxx" |
模块未初始化或依赖未下载 | 运行 go mod tidy |
验证代理与模块镜像(国内用户必备)
为加速依赖拉取,建议配置 GOPROXY:
$ go env -w GOPROXY=https://goproxy.cn,direct
$ go env -w GOSUMDB=off # 可选:跳过校验(仅开发环境)
测试效果:go list -m -u all 应快速返回模块列表,无超时或 403 Forbidden 错误。
升级Go版本的推荐流程
不建议直接覆盖安装新版本。推荐使用 go install golang.org/dl/go1.22.3@latest 下载特定版本工具链,再通过 go1.22.3 download 安装,最后用 go version 切换验证。升级后务必运行 go mod vendor(如项目含 vendor 目录)并重跑全部单元测试。
创建跨平台构建脚本示例
在项目根目录添加 build-macos.sh:
#!/bin/bash
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -a -ldflags '-s -w' -o dist/app-darwin-arm64 .
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -a -ldflags '-s -w' -o dist/app-darwin-amd64 .
赋予执行权限后运行,即可生成适配两种架构的二进制文件。
