在iPhone(ARM64)上为iOS 7创建库时出现链接问题。
错误消息是:
ld: in /long_path/libHEVCCodec.a(inv_xforms_arm64.o), in section TEXT,text reloc 0:
ARM64_RELOC_SUBTRACTOR must have r_length of 2 or 3 for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
此错误会出现此错误(它是某种切换):
adr addr, .L.dct_add_switch
ldrh offset, [addr, ta, lsl #1]
add addr, addr, offset, uxth
br addr
.L.dct_add_switch:
.hword .L.dct_add_4 - .L.dct_add_switch
.hword .L.dst_add_4 - .L.dct_add_switch
...
ta
,addr
,offset
分别是通用注册x3
,x4
,w5
。
有人知道如何处理这种情况吗?
PS:GNU GCC&没有任何问题。机器人。
EDIT1: 似乎问题不在链接器本身,而在编译器中。 我检查了目标文件(objdump),而不是差异常量,只有零。
.L.dct_add_switch:
0000000000000010 .long 0x00000000
0000000000000014 .long 0x00000000
0000000000000018 .long 0x00000000
000000000000001c nop
当我手动计算常量而不是" .L.dct_add_4 - .L.dct_add_switch"等表达式时,一切都很顺利。
也许有一些编译器密钥会让编译器正确地完成它的工作?
感谢。
答案 0 :(得分:0)
有一个编译器&链接器问题,它取决于用于偏移的数据大小。 Clang对4字节不同的东西不是很友好。
其他主题的讨论和可能的解决方案:creating constant jump table; xcode; clang; asm
答案 1 :(得分:0)
问题是ARM 64位目标的Mach-O目标文件格式不支持重定位两个符号之间的16位差异。看来差异必须是32位或64位。它似乎不是编译器或链接器的问题。您在问题中引用的汇编代码看起来像是手工编译的汇编,而不是编译器输出。
解决方案是重写程序集以使用32位差值。像这样:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void okay(View view) {
Intent i = new Intent(this, Login.class);
startActivity(i);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}