2017-08-03 2 views
1

Bonjour à tous les corps pour mon école je dois faire ma propre fonction strdup dans ASM [intel] [NASM].Mon strdup dans ASM

J'ae problème étrange ...

Dans mon code si je call _malloc

Mon code segfault avec cette erreur:

Program received signal SIGSEGV, Segmentation fault. 
0x00007fff849612da in stack_not_16_byte_aligned_error() from /usr/lib/system/libdyld.dylib 

Je ne comprends pas pourquoi parce que dans la section .text J'ai dit extern _malloc

Quelqu'un a une idée pourquoi j'ai eu cette erreur? :)

Voici mon code:

section .text 
    global _ft_strdup 
    extern _strlen 
    extern _malloc 
    ; extern _ft_memcpy 

_ft_strdup: 
    call _strlen   ;rax = len of str 
    mov r8, rdi   ;r8 = str = src 
    inc rax    ;rax++ 
    ; mov r9, rax   ;len of dest with '\0' 
    mov rdi, rax   ;to send the len for malloc 
    call _malloc   ;rax = ptr of dest 
    ; cmp rax, 0   ;malloc failled 
    ; jle _error_malloc 
    ; mov rdi, rax  ;malloc param 1 of ft_memcpy 
    ; mov rsi, r8   ;str in param 2 of ft_memcpy 
    ; mov rdx, r9   ;len of str with '\0' param 3 of ft_memcpy 
    ; call _ft_memcpy  ;call ft_memcpy 
    ret 
_error_malloc: 
    xor rax, rax   ;return NULL 
    ret 

Toutes les fonctions commencent par ft_ sont les mêmes que la libc Thx tous

+0

Veuillez prendre le temps de [lire comment poser de bonnes questions] (http://stackoverflow.com/help/how-to-ask), et apprendre comment créer un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) que vous pouvez nous montrer. –

+0

En ce qui concerne un indice possible à propos de votre problème, ne vous demandez-vous pas ce que 'stack_not_16_byte_aligned_error' pourrait signifier? Peut-être devriez-vous commencer à regarder comment vous configurez vos cadres de pile? –

+0

La réponse de Fuz est correcte. En tant qu'expérience, vous pouvez essayer d'aligner la pile sur une limite de 16 octets en appuyant simplement sur n'importe quelle valeur de la pile et en la faisant disparaître à la fin. Par exemple, en tant que première instruction dans '_ft_strdup', mettez' push rbp' et ensuite juste avant chaque 'ret' mettez' pop rbp'. –

Répondre

5

Ce message d'erreur indique que vous avez appelé malloc avec une pile insuffisamment alignée. Le SysV-ABI pour amd64 exige que la pile soit alignée sur 16 octets lors d'un appel de fonction. Dans votre propre code, vous pouvez vous assurer que vous appuierez toujours un nombre pair de mots quadruples sur la pile et souvenez-vous qu'en entrée, la pile est désalignée de 8 octets en raison de l'adresse de retour sur la pile. déjà.

Sans voir votre code source, il est difficile de donner une aide plus spécifique.