为 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
...
ta
、addr
、offset
分别为通用寄存器x3
、x4
、w5
。
有人知道如何处理这种情况吗?
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
在 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 & 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