/bin/true
e /bin/false
não precisam fazer nenhuma chamada do sistema além da exit(2)
exigida. (GNU true e false são executáveis ELF dinamicamente vinculados, então é claro que você obtém a inicialização usual da placa de boiler).
Se você escrever um programa em asm que tenta retornar de _start
, ou que continua sendo executado, ele será segfault quando a execução pular para uma página não mapeada. Então você tecnicamente pode evitar chamar exit()
, mas não vale a pena. : P
Você pode ter lido que a implementação mais simples de true(1)
é um arquivo vazio. Isso só funciona se chamado a partir do shell.
touch true
chmod 755 true
./true
echo $?
0
strace ./true
write(2, "strace: exec: Exec format error\n", 32) = 32
exit_group(1)
Se você quiser fazer sua própria implementação true
mínima, então na amd64 você pode fazer:
cat > exit64.s <<EOF
.section .text
.globl _start
_start:
xor %edi, %edi
mov $231, %eax # exit(0)
syscall
# movl $1,%eax # 32bit int80 can call the 32bit ABI system calls from long mode
# int $0x80
EOF
as exit64.s -o exit64.o && ld exit64.o -o exit64
strace ./exit64
execve("./exit64", ["./exit64"], [/* 69 vars */]) = 0
exit_group(0) = ?
+++ exited with 0 +++
file exit64
exit64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Ao contrário do GNU true
, este não suporta --help
e --version
! (por exemplo, command true --version
para ignorar o built-in de shell).
Veja também Um tutorial do Whirlwind sobre como criar executáveis ELF realmente teensivos para Linux se você pensou isso foi legal.