在为iOS 7创建库时链接问题

时间:2015-09-16 14:46:22

标签: ios assembly linker clang arm64

在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
...

taaddroffset分别是通用注册x3x4w5

有人知道如何处理这种情况吗?

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"等表达式时,一切都很顺利。

也许有一些编译器密钥会让编译器正确地完成它的工作?

感谢。

2 个答案:

答案 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;
}