为arm64 iOS构建C库(GMP)

时间:2014-03-31 05:16:49

标签: ios clang gmp arm64

我正在尝试为arm64构建一个C库(GMP 6.0.0),以便在iOS上使用。我正在使用下面的调用运行configure脚本(使用xcrun --find找到编译器。)

./configure \
CC="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" \
CPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -E" \
CPPFLAGS="-target arm64-apple-darwin -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/ -miphoneos-version-min=7.0" \
--host=aarch64-apple-darwin

然而,这在下一行失败(“长期可靠性测试1”):

checking compiler /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -O2 -pedantic  -target arm64-apple-darwin -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/ -miphoneos-version-min=7.0... no, long long reliability test 1
configure: error: could not find a working compiler, see config.log for details

完整的config.log可用here。它显示了长期可靠性测试编译的多个警告和错误,包括以下内容:

conftest.c:9:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
f(){static const struct{t1 n;t1 src[9];t1 want[9];}d[]={{1,{0},{1}},};t1 got[9];int i;
^
conftest.c:10:44: error: implicit declaration of function 'h' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
for(i=0;i<1;i++){if(e(got,got,9,d[i].n)==0)h();g(i,d[i].src,d[i].n,got,d[i].want,9);if(d[i].n)h();}}
                                           ^
conftest.c:10:48: error: implicit declaration of function 'g' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
for(i=0;i<1;i++){if(e(got,got,9,d[i].n)==0)h();g(i,d[i].src,d[i].n,got,d[i].want,9);if(d[i].n)h();}}
                                               ^
conftest.c:10:100: warning: control reaches end of non-void function [-Wreturn-type]
for(i=0;i<1;i++){if(e(got,got,9,d[i].n)==0)h();g(i,d[i].src,d[i].n,got,d[i].want,9);if(d[i].n)h();}}
                                                                                                   ^

使用--host=none它工作正常,但我真的想弄清楚如何使用针对arm64优化的程序集来构建它。

我的系统是x86_64-apple-darwin13.1.0(或者根据config.guess的coreisbr-apple-darwin13.1.0),一个运行OS X v10.9.2的早期'11 Core i7 MBP。我正在使用Xcode 5.1(5B130a)。

任何帮助表示感谢。

编辑1

编译ARMv7传递configure,但在make(完全配置/ make输出here)上失败,显然是在编译某些程序集时:

tmp-dive_1.s:165:18: error: unexpected token in '.section' directive
 .section .rodata
                 ^

编辑2

@MarcGlisse:通过强制clang忽略建议的错误(-Wno -...)arm64传递configure,但是make失败(完整输出here):

tmp-mul_1.s:59:2: error: unrecognized instruction mnemonic
 bcc Lfi1
 ^
tmp-mul_1.s:60:2: error: unrecognized instruction mnemonic
 beq Lfi2
 ^

作为旁注:these commits,我假设打算删除抑制错误的需要,似乎无法正常工作,即在删除抑制时我得到相同的错误。

对于armv7,建议使用these commits修复.section错误,但稍后会使用以下内容(完整输出here)失败:

tmp-mode1o.s:64:2: error: unknown directive
 .protected ___gmp_binvert_limb_table
 ^

编辑3

使用建议的编辑,armv7,armv7s,i386和x86_64现在全部用汇编编译!

对于arm64,编辑得到它超过上一个错误,但现在给出了几个关于无效输入约束'rZ'的错误,所有错误都在同一个文件中(完整输出here):

divrem_1.c:237:5: error: invalid input constraint 'rZ' in asm
                  udiv_qrnnd_preinv (*qp, r, r, nshift, d, dinv);
                  ^
../gmp-impl.h:3062:2: note: expanded from macro 'udiv_qrnnd_preinv'
        add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl));                \
        ^
../longlong.h:551:7: note: expanded from macro 'add_ssaaaa'
           : "rZ" (ah), "rZ" (bh), "%r" (al), "rI" (bl) __CLOBBER_CC)

编辑4

在longlong.h中注释掉add_ssaaaasub_ddmmss并在gcd_1.asm(blob.lo等内部编辑更多汇编指令后),它现在失败了有几个以下错误(完整输出here):

tmp-invert_limb.s:75:22: error: immediate value expected for shifter operand
 add x1, x1, x2, lsr 1
                     ^
tmp-invert_limb.s:75:22: error: invalid operand for instruction
 add x1, x1, x2, lsr 1
                     ^

我稍后会发布一个完全差异。

编辑5

好的,这让我们又向前迈进了一步,但它现在已经进入(完整输出here):

tmp-invert_limb.s:52:2: error: ADR/ADRP relocations must be GOT relative
 adrp x1, approx_tab
 ^

如果这种情况继续下去,最好通过电子邮件继续发送。

2 个答案:

答案 0 :(得分:1)

“支持 ARM64 别名 Aarch64 别名 ARMv8”

https://gmplib.org/gmp6.0

答案 1 :(得分:0)

除了版权问题......

GMP可能与Apple的专有CPU不兼容,可能与Clang / LLVM不兼容。作为一个GNU项目,它可能在非专有芯片组上使用GCC进行了更彻底的测试。

快速搜索显示历史上至少存在使用clang编译GMP的问题。

您真的应该通过电子邮件向GMP社区发送电子邮件并寻求帮助。