¿Cómo viene _exit (0) (salir por syscall) me impide recibir ningún contenido estándar?
Tengo un programa de ensamblaje Linux x86-32 GAS que termina así:
movl $1, %eax
movl $0, %ebx # argument for _exit
int $0x80
Cuando salgo así, el programa funciona normalmente, pero si trato de leer la salida estándar, no obtengo nada (es decir, menos o wc).
Intenté compilar un programa C mínimo y comparar los resultados de strace. La única diferencia que encontré fue que GCC creó el programa C int main() { printf("donkey\n"); }
) sale implícitamente conexit_group(0)
en la salida de strace.
Intenté modificar mi programa ASM para salir concall exit
en lugar de la llamada al sistema sin procesar. El stdout ahora era legible como normal.
Caso de prueb
.data
douout: .string "monkey\n"
.text
.globl main
main:
pushl $douout
call printf
# Exit
movl $1, %eax
movl $0, %ebx
int $0x80
Compilar y ejecutar:
$ yasm -g dwarf2 -f elf -p gas t.asm && gcc -g -melf_i386 -o t t.o && ./t | wc -c
0
Esperado
7
EDITAR
Intenté llamar a ambostcflush
yfflush
, y todavía tengo el problema. Confflush
Incluso recibo un segfault.
0xb7e9e7c9 in _IO_fflush (fp=0x804a018) at iofflush.c:42
42 iofflush.c: No such file or directory.
in iofflush.c
(gdb) bt
#0 0xb7e9e7c9 in _IO_fflush (fp=0x804a018) at iofflush.c:42
#1 0x08048434 in main () at t.asm:12
(gdb) frame 1
#1 0x08048434 in main () at t.asm:12
12 call fflush
(gdb) list
7
8 pushl $douout
9 call printf
10 # Exit
11 movl $0, %eax
12 call fflush
13 movl $1, %eax
14 movl $0, %ebx
15 int $0x80
EDIT2:
Está bien, ahora funciona todo el mundo. Estaba usando la convención de llamadas incorrecta que copié desde aquí:Printf sin nueva línea en el ensamblaje
El argumento a favor defflush
debería estar en la pila, como de costumbre.
$ cat t.asm
.data
douout: .string "monkey\n"
.text
.globl main
main:
pushl $douout
call printf
# Exit
pushl $0
call fflush
movl $1, %eax
movl $0, %ebx
int $0x80
$ yasm -g dwarf2 -f elf -p gas t.asm && gcc -g -melf_i386 -o t t.o && ./t | wc -c
7
$
Gracias a todos, especialmente a nos.