Eseguibili vs oggetti condivisi


13

Ho notato qualcosa mentre facevo find /bin -exec file {} \;:

il filecomando riporta alcune voci in /binsono shared objects, mentre altri come executables. Per esempio,

/ bin / ntfsck: oggetto condiviso
ELF a 64 bit LSB , x86-64, versione 1 (SYSV), collegato dinamicamente (usa librerie condivise), per GNU / Linux 2.6.24, BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00, stripped

Stesso rapporto per gawk

/ usr / bin / gawk: oggetto condiviso LSF a
64 bit ELF , x86-64, versione 1 (SYSV), collegato dinamicamente (usa librerie condivise), per GNU / Linux 2.6.24, BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db44543c9, stripped

Al contrario fileper /bin/echoè:

/ bin / echo: eseguibile
LSB a 64 bit ELF , x86-64, versione 1 (SYSV), collegato dinamicamente (usa librerie condivise), per GNU / Linux 2.6.24, BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a5934cf601c, stripped

In sostanza, voglio sapere qual è la differenza tra executablefile e shared objectfile.


Risposte:


14

Tl; dr

Non c'è alcuna differenza, a parte il fatto che un eseguibile compilato potrebbe essere collegato a un oggetto condiviso ma non a un eseguibile.


In generale, ci sono due modi per compilare 1 un eseguibile:

  • Utilizzo del collegamento statico: le librerie esterne incluse nel codice sorgente vengono compilate e la libreria compilata (o l'oggetto nella prospettiva del linker) viene aggiunta all'eseguibile stesso;
  • Utilizzo del collegamento dinamico: le librerie esterne incluse nel codice sorgente vengono compilate ma un collegamento alla libreria compilata (o oggetto nella prospettiva del linker) viene aggiunto all'eseguibile (e le librerie / gli oggetti compilati vengono caricati dal linker in fase di esecuzione se necessario);

Ci sono vantaggi / svantaggi nell'uso di ciascuno di questi metodi, ma non è questo il punto della domanda;

  • /bin/ntfscke /usr/bin/gawksono oggetti condivisi: ciò significa che un eseguibile potrebbe essere compilato e quindi collegato contro di loro per utilizzare le loro funzionalità;
  • /bin/echoè un eseguibile: ciò significa che un eseguibile potrebbe non essere compilato e quindi collegato contro di esso per utilizzare le sue funzionalità;

Quindi /bin/ntfscke /usr/bin/gawksono librerie tecnicamente compilate (o oggetti nella prospettiva del linker), ma, come si può prevedere, nulla impedisce a un oggetto condiviso di essere eseguito come eseguibile.

In una nota a margine, nota anche che fileriporta (per ciascuno di essi):

collegato dinamicamente (usa librerie condivise)

Ciò significa che ognuno di essi è collegato dinamicamente (e probabilmente utilizza) anche altri oggetti condivisi.


1. "Compilazione" inteso nella sua più ampia accettazione, che include preelaborazione, compilazione e collegamento.


1
collegato dinamicamente ad altri oggetti condivisi , IN OS? o librerie condivise in sé ?!
Dr.jacky,

@ Mr.Hyde Nel sistema operativo, in particolare nelle posizioni che devono essere preconfigurate nel linker, in modo che il linker possa caricarle in fase di esecuzione, se necessario. Vedi qui , capitolo 3.2.
kos,

Si può effettivamente collegarsi a un eseguibile usando dlopen: D esempio
Adam Zahran,

6

Un'altra differenza è che gli eseguibili hanno un offset di indirizzo del punto di ingresso definito, ovvero 0x08048000 per i386, 0x00400000 per x86 e 0x00010000 per braccio.

Un file oggetto condiviso può essere una libreria, ma anche un eseguibile. Quando si tratta di un eseguibile, non esiste tale offset. Un eseguibile oggetto condiviso , per così dire, è un eseguibile indipendente di posizione (PIE) che utilizza la randomizzazione del layout dello spazio degli indirizzi (ASLR). Quindi, guardando il suo file / proc / pid / maps, noterai che la posizione dei segmenti caricati varia in ogni esecuzione in contrasto con gli eseguibili standard.

L'idea alla base di questa funzione è quella di aggiungere sicurezza agli eseguibili impedendo agli aggressori di eseguire attacchi di programmazione orientati al ritorno. Molti manutentori hanno deciso di creare pacchetti con PIE abilitato come predefinito, ad es. Da Fedora 23 o con Ubuntu 17.10.


Risposta interessante. Manca alcune fonti (sarebbe bello se tu aggiungessi qualche link, specialmente per la parte del punto di ingresso) ma ho cercato alcune domande di StackOverflow al riguardo. Ma sicuramente una buona risposta.
Sergiy Kolodyazhnyy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.