我正在尝试为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_ssaaaa
和sub_ddmmss
并在gcd_1.asm(blo
到b.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
^
如果这种情况继续下去,最好通过电子邮件继续发送。
答案 0 :(得分:1)
“支持 ARM64 别名 Aarch64 别名 ARMv8”
答案 1 :(得分:0)
除了版权问题......
GMP可能与Apple的专有CPU不兼容,可能与Clang / LLVM不兼容。作为一个GNU项目,它可能在非专有芯片组上使用GCC进行了更彻底的测试。
快速搜索显示历史上至少存在使用clang编译GMP的问题。
您真的应该通过电子邮件向GMP社区发送电子邮件并寻求帮助。