Segfault в простой программе печати поплавков C/NASM x86_64/C
- В моем C-коде я вызываю функцию ассемблера (NASM x86_64) (main.c).
- В сборке я вызываю функцию C (printf.asm)
- Эта функция печатает float с помощью printf. (C_printf.c)
- Я получаю сегфо.
Должен ли я скомпилировать / ссылку по-другому? Может быть, способ вызова функции 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