2017-04-11 2 views
2

J'ai effectué une recherche en ligne pendant un certain temps et je n'ai vu aucune question similaire. Donc, j'écris un petit compilateur pour compiler un langage en code x64.Mac OS: ld: dans la section __DATA, __ relocalisation de données 0: longueur <2 et X86_64_RELOC_UNSIGNED non pris en charge

Mais quand j'essaie de faire clang generated-code.s, je reçois:

ld: in section __DATA,__data reloc 0: length < 2 and X86_64_RELOC_UNSIGNED not supported file '/var/folders/3g/ydlqd7bx3819pfrr9n52zjv80000gn/T/hello_world-795c7e.o' for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

Je ne comprends pas vraiment le sens de ce message d'erreur. Cela signifie-t-il que j'ai un symbole indéfini? Quelqu'un peut-il m'expliquer s'il vous plaît?

Voici le code de mon compilateur généré:

.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

Si j'avais à deviner, vous utilisez '.word' pour enregistrer le décalage sur les étiquettes. '.word' Je crois est 16 bits et vous essayez probablement de placer offset sur les étiquettes qui ne peuvent pas être représentées dans 16 bits. Peut-être que vous vouliez utiliser '.int' ou' .quad' dans ces cas? –

+0

@MichaelPetch Merci, cela a résolu le problème –

Répondre

1

L'erreur:

ld: in section __DATA,__data reloc 0: length < 2 and X86_64_RELOC_UNSIGNED not supported

ressemble à une manière assez obscure de dire que votre objet a alloué un espace pour stocker des décalages dans les éléments de données qui ne peut probablement pas contenir le décalage généré au moment de la liaison. Un aperçu rapide de votre code montre que vous utilisez .word et une étiquette pour une valeur.

Un exemple .word Object_protoObjObject_protoObj est une étiquette. La directive .word autorise des valeurs comprises entre 0x0000 et 0xffff (16 bits). L'erreur du linker suggère probablement que les décalages des étiquettes qu'il génère ne peuvent pas tenir dans des mots de 16 bits.

Peut-être que vous devriez utiliser .quad (permettant des valeurs de 64 bits) ou .int (valeurs de 32 bits)? Je ne sais pas comment vous allez accéder à ces offsets dans les tableaux, donc vous devrez choisir .quad ou .int en fonction de vos besoins d'utilisation.