Mac OS:ld:在__DATA部分中,__ data reloc 0:length<不支持2和X86_64_RELOC_UNSIGNED

时间:2017-04-11 15:05:15

标签: macos assembly 64-bit x86-64 gas

我在网上搜索了一段时间,但没有看到任何类似的问题。

所以我正在编写一个小编译器来将语言编译为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

1 个答案:

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