web-dev-qa-db-fra.com

Nasm - Le symbole `printf 'provoque un débordement dans le déplacement de R_X86_64_PC32

J'essaie de créer un programme simple dans nasm qui devrait afficher la lettre a. Cependant, il me donne un Segfault et dit ceci: 

./a.out: Symbol `printf' causes overflow in R_X86_64_PC32 relocation
Segmentation fault (core dumped)

En gros, j'essaie de déplacer la valeur 0x61 (hexadécimal pour la lettre a) dans l'adresse de mémoire 1234, puis de la passer comme argument à printf. Voici mon code exact:

extern printf
section .text
global main
main:
Push rbp
mov rax,0
mov qword [1234], 0x61 ; move 0x61 into address 1234
mov rdi, qword [1234] ; mov address 1234 into rdi
call printf ; should print the letter a
pop rbp
mov rax,0
ret

J'utilise Linux x86_64

6
Unknown

essayez de compiler avec -no-pie, consultez ces publications pour obtenir des explications: L’assemblage avec GCC provoque une erreur de relocalisation bizarre en ce qui concerne .data

en bref:

Debian est passée aux fichiers binaires PIC/PIE en mode 64 bits et GCC dans votre cas tente de lier votre objet en tant que PIC, mais il rencontrera absolue adresse dans mov $ str,% rdi.

6
brian

Crédit complet à https://stackoverflow.com/users/3062591/brian

pour savoir comment faire fonctionner cela. Si vous êtes comme moi et que vous êtes très novice dans nasm OR et que, pour une raison quelconque, vous êtes novice dans nasm et que vous n'avez pratiquement rien fait avec gcc, vous devrez exécuter la commande suivante:

nasm -felf64 YOUR_FILE.asm && gcc -no-pie YOUR_FILE.o && ./a.out

J'ai pu obtenir cela en utilisant un 

appelez printf 

sans avoir besoin de le changer pour 

printf wrt ..got

qui a eu sur des tentatives précédentes avec quelques exemples d'introduction de MSNA, mais pas tous.

2
Anton_of_Ternopil