Segfault в простой программе печати поплавков C/NASM x86_64/C

  1. В моем C-коде я вызываю функцию ассемблера (NASM x86_64) (main.c).
  2. В сборке я вызываю функцию C (printf.asm)
  3. Эта функция печатает float с помощью printf. (C_printf.c)
  4. Я получаю сегфо.

Должен ли я скомпилировать / ссылку по-другому? Может быть, способ вызова функции C из сборки неправильный?

Я компилирую с:

gcc -c c_printf.c
nasm -f elf64 -F dwarf -g printf.asm
gcc -o main printf.o c_printf.o main.c

Мой код:

main.c

extern void start_asm(void);
int main(void) {
    start_asm();
    return 0;
}

printf.asm

global start_asm
extern printf_float
start_asm:
    call printf_float
    ret

c_printf.c

#include <stdio.h>
void printf_float(void) {
    printf("%f\n", 42.0f);
}

Может быть, вывод valgrind будет полезен?

==16257== Memcheck, a memory error detector
==16257== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==16257== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==16257== Command: ./main
==16257== 
--16257-- WARNING: Serious error when reading debug info
--16257-- When reading debug info from /home/starsep/stack/main:
--16257-- Overrun whilst parsing .debug_abbrev section(2)
==16257== 
==16257== Process terminating with default action of signal 11 (SIGSEGV)
==16257==  General Protection Fault
==16257==    at 0x4E8F824: printf (printf.c:28)
==16257==    by 0x40055F: printf_float (in /home/starsep/stack/main)
==16257==    by 0x400534: ??? (printf.asm:6)
==16257==    by 0x4E5A82F: (below main) (libc-start.c:291)
==16257== 
==16257== HEAP SUMMARY:
==16257==     in use at exit: 0 bytes in 0 blocks
==16257==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==16257== 
==16257== All heap blocks were freed -- no leaks are possible
==16257== 
==16257== For counts of detected and suppressed errors, rerun with: -v
==16257== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
[1]    16257 segmentation fault  valgrind ./main

0 ответов

Другие вопросы по тегам