带有“PIE禁用”/ i386拱门的Gomobile绑定生成库

时间:2018-04-25 13:51:04

标签: ios go clang cocoapods gomobile

我已经使用gomobile绑定工具构建了我的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代码构建一个合适的二进制文件 - 我尝试将-ldflags =“ - extldflags = -pie”提供给gomobile bind命令,但我假设它更多的是编译问题。我知道-buildmode = pie可用于构建,但仅适用于主程序包,也不适用于gomobile bind。

1 个答案:

答案 0 :(得分:0)

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

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

我仍然收到PIE警告但是错误消失了,并且pod被推送到存储库ok。

我想知道Apple在推送到App Store时是否会厌倦二进制缺失PIE?