Or does linux requires some kind of standard format, like ELF format or bash format?
Sì, linux richiede che il file sia in un formato supportato (registrato) ed esegua bit impostato per eseguirlo. La maggior parte dei file in Linux ha ELF format o "shebang" format (i primi due simboli sono #!
e quindi viene scritto il percorso dell'interprete, usato da bash, perl, python e molti altri script). A volte i file di testo possono essere eseguiti come script di shell, ad es. quando esegui ./script
da bash (gestito non dal kernel, ma dalla shell bash).
Ulteriori dettagli sono disponibili in fs/exec.c file dal kernel linux, a partire dalla funzione do_execve
.
C'è il sottosistema del kernel "binfmt" per registrare altri formati eseguibili. Ad esempio, binfmt_misc
consente di definire e registrare il proprio formato binario tramite il file speciale /proc/sys/fs/binfmt_misc
. L'esecuzione è gestita tramite "interprete" definito dall'utente, il programma in grado di leggere, caricare ed eseguire l'eseguibile di destinazione. Ad esempio, i file binari di Windows PE possono essere avviati con l'aiuto di wine
non-emulatore.
Possiamo vedere diversi moduli incorporati binfmt
in fs
directory di origini del kernel. I più comuni sono: binfmt_elf.c
(formato binario ELF) e binfmt_script.c
(che rileva "shebang" e avvia l'interprete). C'è un semplice binary format "a.out" da AT & T, gestito da binfmt_aout.c
, che può essere più facile da generare rispetto a ELF.
binfmt_aout.c 11374 bytes
binfmt_elf.c 58415 bytes
binfmt_elf_fdpic.c 48256 bytes
binfmt_em86.c 2710 bytes
binfmt_flat.c 27054 bytes
binfmt_misc.c 15175 bytes
binfmt_script.c 2768 bytes
binfmt_som.c 7315 bytes
Se il file che si tenta di eseguire non è in formato supportato, exec*
chiamate di sistema torneranno errore:
$ hexdump -C asd
00000000 07 01 09 00 11 12 13 14 0a |.........|
00000009
$ strace ./asd
execve("./asd", ["./asd"], [/* 179 vars */]) = -1 ENOEXEC (Exec format error)
....
Secondo execve
man page, il codice di ritorno significa:
ENOEXEC
An executable is not in a recognized format, is for the wrong architecture, or has some other format error that means it cannot be executed.
mi ricordo trovare online da qualche parte è un articolo in cui qualcuno ha deciso di creare il più piccolo elfo eseguibile valido - alla fine hanno finito per sovrapporre alcune strutture dati, ma lungo il ho spiegato il ruolo minimo di ciascuno. Non sono sicuro se http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html lo fosse, o se fosse un altro simile. –
@ChrisStratton, http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html o http://timelessname.com/elfbin/. E cosa? Questo è solo un piccolo file binario ELF, caricato da 'binfmt_elf'. – osgx