ios - 带有 "PIE disabled"/i386 arch 的 Gomobile 绑定(bind)生成库

标签 ios go clang cocoapods gomobile

我已经使用 gomobile 绑定(bind)工具来构建我的 Go 库,以便在 iOS 应用程序中使用。我已将我的库打包到 Cocoapods .podspec 中。它在模拟器中运行良好(通过本地开发 pod),但是当我尝试执行 pod lib lint(部分步骤,发布 cocoapod 的一部分)时,我遇到了错误:

错误:

 ld: illegal text-relocation to 'runtime.rodata' in /Users/matti/src/foobar-sdk-ios/Frameworks/Client.framework/Client(go.o) from 'sync/atomic.(*Value).Store' in /Users/matti/src/foobar-sdk-ios/Frameworks/Client.framework/Client(go.o) for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

警告:

- NOTE  | [iOS] [FooBarSDK/Go] xcodebuild:  ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in sync/atomic.(*Value).Store from /Users/matti/src/foobar-sdk-ios/Frameworks/Client.framework/Client(go.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie

它似乎链接到其他架构。我无法弄清楚如何跳过 i386 - 即使我覆盖了 VALID_ARCHS - 我猜它无论如何都不是正确的解决方案。

所以我想知道如何从我的 Go 代码构建一个合适的二进制文件 - 我尝试向 gomobile bind 命令提供 -ldflags="-extldflags=-pie"但我假设它更多的是编译问题。我知道有 -buildmode=pie 可用于 go build,但仅适用于主包,也不适用于 gomobile bind。

最佳答案

显然这修复(抑制)了错误:

spec.pod_target_xcconfig = {
    "OTHER_LDFLAGS[arch=i386]" => "-Wl,-read_only_relocs,suppress"
}

我仍然收到 PIE 警告,但错误已消失,并且 pod 已正常推送到存储库。

我想知道 Apple 在推送到 App Store 时是否会因为缺少二进制 PIE 而感到不满?

关于ios - 带有 "PIE disabled"/i386 arch 的 Gomobile 绑定(bind)生成库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50024087/

相关文章:

go - 编译错误只构建一个模块,而不是主包

go - 填充包含 slice 的结构

c++ - 为什么 clang/llvm 不对此进行优化?

ios - 如何将谷歌即时搜索栏添加到 iOS 应用程序

ios - Java FX Gluon移动版

ios - 在 iOS (Swift) 中使用 FacebookLogin 设置 <Permission> 的值是多少

ios - 我们可以在 iOS 中将数据从 plist 设置到 Keychain 吗?

concurrency - 为什么我会从封闭的 channel 接收值(value)?

c++ - 用于解释自定义 c++11 属性的 Clang/GCC 插件

c++ - 通过命令行编译和链接 Swift/Objective-C++ 应用程序