2014-04-25 14 views
6

Voglio sapere come i sistemi operativi Linux eseguono i file. Quindi dalle mie ricerche sul Web ho capito che ogni file su cui è impostato il bit eseguibile può essere eseguito. Ma poi ho appreso che esiste un formato chiamato ELF che è lo standard Linux per i file eseguibili.In che modo Linux esegue un file?

Quindi quello che voglio sapere è ciò che è necessario per un file che ha il permesso di eseguire (il bit eseguibile è attivo), al fine di eseguire il codice nel sistema? Posso creare un nuovo file con l'editor esadecimale e scrivere 90 all'interno (NOP opcode) e aspettarmi che venga eseguito? O Linux richiede un qualche tipo di formato standard, come il formato ELF o il formato Bash?

+0

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. –

+0

@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

risposta

10

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.

+0

Link utili: http://www.linux.it/~rubini/docs/binfmt/binfmt.html – osgx

Problemi correlati