我在网上搜索了一段时间,但没有看到任何类似的问题。
所以我正在编写一个小编译器来将语言编译为x64代码。
但是当我尝试clang generated-code.s
时,我得到了:
ld:在__DATA部分,__ data reloc 0:length< 2和 X86_64_RELOC_UNSIGNED不支持文件 '/var/folders/3g/ydlqd7bx3819pfrr9n52zjv80000gn/T/hello_world-795c7e.o' 对于体系结构x86_64 clang:错误:链接器命令因退出而失败 代码1(使用-v查看调用)
我真的不明白这条错误信息的含义。这是否意味着我有未定义的符号?有人可以向我解释一下吗?
以下是我的编译器生成的代码:
.data
.globl Main_protoObj
.globl Int_protoObj
.globl String_protoObj
.globl Main_init
.globl Int_init
.globl String_init
.globl Bool_init
.globl Main_main
class_objTab:
.word Object_protoObj
.word Object_init
.word IO_protoObj
.word IO_init
.word String_protoObj
.word String_init
.word Int_protoObj
.word Int_init
.word Bool_protoObj
.word Bool_init
.word Main_protoObj
.word Main_init
Object_protoObj:
.word 0
.word 1
.word Object_dispatch_table
IO_protoObj:
.word 1
.word 3
.word IO_dispatch_table
String_protoObj:
.word 2
.word 3
.word String_dispatch_table
.word 0
.asciz ""
.align 8
Int_protoObj:
.word 3
.word 2
.word Int_dispatch_table
.word 0
Bool_protoObj:
.word 4
.word 2
.word Bool_dispatch_table
.word 0
Main_protoObj:
.word 5
.word 1
.word Main_dispatch_table
String_dispatch_table:
.word Object_abort
.word Object_copy
.word String_length
.word String_concat
.word String_substr
Main_dispatch_table:
.word Object_abort
.word Object_copy
.word IO_out_string
.word IO_out_int
.word IO_in_string
.word IO_in_int
.word Main_main
Bool_dispatch_table:
.word Object_abort
.word Object_copy
Object_dispatch_table:
.word Object_abort
.word Object_copy
IO_dispatch_table:
.word Object_abort
.word Object_copy
.word IO_out_string
.word IO_out_int
.word IO_in_string
.word IO_in_int
Int_dispatch_table:
.word Object_abort
.word Object_copy
int_const0:
.word 3
.word 4
.word Int_dispatch_table
.word 22
string_const0:
.word 2
.word 6
.word String_dispatch_table
.word int_const0
.asciz "Hello, World.\n \n\n"
.align 8
.text
Object_init:
pushq %rbp
movq %rsp, %rbp
leave
ret
IO_init:
pushq %rbp
movq %rsp, %rbp
movq %rdi, %rdi
callq Object_init
leave
ret
String_init:
pushq %rbp
movq %rsp, %rbp
movq %rdi, %rdi
callq Object_init
movq '', 32(%rbp)
movq $0, 24(%rbp)
leave
ret
Int_init:
pushq %rbp
movq %rsp, %rbp
movq %rdi, %rdi
callq Object_init
movq $0, 24(%rbp)
leave
ret
Bool_init:
pushq %rbp
movq %rsp, %rbp
movq %rdi, %rdi
callq Object_init
movq $0, 24(%rbp)
leave
ret
Main_main:
pushq %rbp
movq %rsp, %rbp
subq $8, %rsp
movq %rdi, -8(%rbp)
movq -8(%rbp), %rdi
leaq string_const0(%rip), %rax
movq %rax, %rsi
movq 16(%rdi), %r10
movq 16(%r10), %r10
callq* %r10
leave
ret
Main_init:
pushq %rbp
movq %rsp, %rbp
movq %rdi, %rdi
callq IO_init
leave
ret
答案 0 :(得分:1)
错误:
ld:在__DATA部分,__ data reloc 0:length<不支持2和X86_64_RELOC_UNSIGNED
看起来像是一种相当模糊的方式,表示您的对象已经分配了空间来将偏移存储到可能无法保持链接时生成的偏移的数据项中。
快速查看代码会显示您使用.word
和值的标签。示例.word Object_protoObj
,其中Object_protoObj
偏移是标签。指令.word
允许值介于0x0000和0xffff(16位)之间。链接器错误可能表明它生成的标签的偏移量不能适合16位字。
也许您应该使用.quad
(允许64位值)或.int
(32位值)?我不知道您将如何访问表格中的这些偏移量,因此您必须根据使用要求选择.quad
或.int
。