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

Linking problems when creating a library for iOS 7

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

没有任何问题

编辑 1: 看来问题不在链接器本身,而在编译器中。 我检查了目标文件(objdump),而不是差异常量只有零。

.L.dct_add_switch:
0000000000000010    .long   0x00000000
0000000000000014    .long   0x00000000
0000000000000018    .long   0x00000000
000000000000001c    nop

当我输入手动计算的常量而不是“.L.dct_add_4 - .L.dct_add_switch”等表达式时,一切正常。

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

谢谢。

好吧,存在编译器和链接器问题,它取决于用于偏移的数据大小。 Clang 对任何不同于 4 Bytes 的东西都不是很友好。

其他主题的讨论和可能的解决方案:

问题是 ARM 64 位目标的 Mach-O 目标文件格式不支持对两个符号之间的 16 位差异进行重定位。看来差异必须是 32 位或 64 位。它似乎不是编译器或链接器的问题。您在问题中引用的汇编代码看起来像手工汇编,而不是编译器输出。

解决方案是重写程序集以使用 32 位差值。像这样:

    adr     addr,   .L.dct_add_switch
    ldr     offset, [addr, ta, lsl #2]
    add     addr,   addr, offset, uxtw
    br      addr

.L.dct_add_switch:
    .word  .L.dct_add_4   - .L.dct_add_switch
    .word  .L.dst_add_4   - .L.dct_add_switch