Cosa sono gli eseguibili eliminati e non eliminati in Unix?


37

Dal file man ,

EXAMPLES
   $ file file.c file /dev/{wd0a,hda}
   file.c:   C program text
   file:     ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
             dynamically linked (uses shared libs), stripped
   /dev/wd0a: block special (0/0)
   /dev/hda: block special (3/0)
   $ file -s /dev/wd0{b,d}
   /dev/wd0b: data
   /dev/wd0d: x86 boot sector
   $ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
   /dev/hda:   x86 boot sector
   /dev/hda1:  Linux/i386 ext2 filesystem
   /dev/hda2:  x86 boot sector
   /dev/hda3:  x86 boot sector, extended partition table
   /dev/hda4:  Linux/i386 ext2 filesystem
   /dev/hda5:  Linux/i386 swap file
   /dev/hda6:  Linux/i386 swap file
   /dev/hda7:  Linux/i386 swap file
   /dev/hda8:  Linux/i386 swap file
   /dev/hda9:  empty
   /dev/hda10: empty

   $ file -i file.c file /dev/{wd0a,hda}
   file.c:      text/x-c
   file:        application/x-executable, dynamically linked (uses shared libs),
   not stripped
   /dev/hda:    application/x-not-regular-file
   /dev/wd0a:   application/x-not-regular-file

Cosa significa stripping eseguibile?

Perché alcuni degli eseguibili vengono rimossi mentre altri no?

Risposte:


50

Se si compila un eseguibile con il flag -g di gcc, contiene informazioni di debug. Ciò significa che per ogni istruzione ci sono informazioni su quale riga del codice sorgente lo ha generato, il nome delle variabili nel codice sorgente viene mantenuto e può essere associato alla memoria corrispondente in fase di esecuzione ecc. Strip può rimuovere queste informazioni di debug e altri dati inclusi nell'eseguibile che non è necessario per l'esecuzione al fine di ridurre le dimensioni dell'eseguibile.


10
Vedi anche la manpage strip (1) . In genere strip rimuove tutti i simboli poiché non sono strettamente necessari; rimuove anche le informazioni di debug, ma i simboli sono la cosa più importante
Michael Mrozek

3
Il concetto si generalizza alla maggior parte dei formati eseguibili, questo non è specifico per gcc o anche per unix.
Gilles 'SO- smetti di essere malvagio' il

4
Avevo un eseguibile da 40 MB che, quando rimosso, era ridotto a 6 MB, solo per farti un'idea del tipo di spazio occupato dai dati di debug.
Nathan Osman,

Quindi, lo stripping di un eseguibile prog.eche è stato creato gcc -g -o prog.e prog.cti dà l'equivalente della compilazione gcc -O0 -o prog.e prog.c?
Sì, il

1
@ysap no, non ha nulla a che fare con l'ottimizzazione (-O). Il codice assembly rimane lo stesso indipendentemente dal fatto che il file venga rimosso. Ottieni un eseguibile senza le informazioni di debug (quindi hai ragione sulla perdita di "-g") e senza tutti i simboli (cioè nomi di funzioni, nomi di variabili globali ...). È l'equivalente di "gcc -s -o prog.e prog.c". Quando viene eseguito un programma, i simboli non fanno alcuna differenza. Ad esempio, il software proprietario ha sempre simboli eliminati perché altrimenti tutti potrebbero conoscere i nomi originali delle funzioni e le loro posizioni.
Pikrass,
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.