Como o _exit (0) (saindo pelo syscall) me impede de receber qualquer conteúdo stdout?

Eu tenho um programa de montagem Linux x86-32 GAS terminando assim:

movl $1, %eax
movl $0, %ebx # argument for _exit
int $0x80

uando saio dessa maneira, o programa funciona normalmente, mas se eu tentar ler a saída stdout, não recebo nada (usando, por exemplo, menos ou wc

Tentei compilar um programa C mínimo e comparar as saídas strace. A única diferença que encontrei foi que o GCC criou o programa C int main() { printf("donkey\n"); }) saia implicitamente comexit_group(0) na saída strace.

Tentei modificar meu programa ASM para sair comcall exit em vez do syscall bruto. O stdout agora estava legível como norma

Caso de test

.data
douout: .string "monkey\n"
.text
.globl main

main:

pushl $douout
call printf
# Exit
movl $1, %eax
movl $0, %ebx
int $0x80

Compile e execute:

$ yasm -g dwarf2 -f elf -p gas t.asm && gcc -g -melf_i386 -o t t.o && ./t | wc -c
0

Esperado

7

EDITAR

Tentei ligar para os doistcflush efflush e ainda tenho o problema. Comfflush Eu até recebo um 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:

Ok, ele funciona agora todo mundo. Eu estava usando a convenção de chamada errada que copiei daqui:Printf sem nova linha na montagem

O argumento parafflush deve estar na pilha, como sempr

$ 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
$

Obrigado a todos, especialmente no

questionAnswers(6)

yourAnswerToTheQuestion