¿Qué son los ejecutables eliminados y no eliminados en Unix?

37

Del archivo 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

¿Qué significa stripping ejecutable?

¿Por qué se eliminan algunos de los ejecutables y otros no?

Lazer
fuente

Respuestas:

50

Si compila un ejecutable con el indicador -g de gcc, contiene información de depuración. Eso significa que para cada instrucción hay información sobre qué línea del código fuente lo generó, el nombre de las variables en el código fuente se retiene y puede asociarse a la memoria correspondiente en tiempo de ejecución, etc. Strip puede eliminar esta información de depuración y otros datos incluidos en el ejecutable que no es necesario para la ejecución a fin de reducir el tamaño del ejecutable.

fschmitt
fuente
10
Consulte también la página de manual de strip (1) . Generalmente la tira elimina todos los símbolos, ya que no son estrictamente necesarios; también elimina la información de depuración, pero los símbolos son lo más importante
Michael Mrozek
3
El concepto se generaliza a la mayoría de los formatos ejecutables, esto no es específico para gcc o incluso para unix.
Gilles 'SO- deja de ser malvado'
44
Tenía un ejecutable de 40 MB que, cuando se eliminó, se redujo a 6 MB, para que tenga una idea del tipo de espacio que ocupa la depuración de datos.
Nathan Osman
Entonces, ¿eliminar un ejecutable prog.eque fue construido con gcc -g -o prog.e prog.cte da el equivalente de compilar gcc -O0 -o prog.e prog.c?
ysap
1
@ysap no, no tiene nada que ver con la optimización (-O). El código de ensamblaje permanece igual independientemente de si el archivo se elimina o no. Obtiene un ejecutable sin la información de depuración (por lo que tiene razón acerca de la pérdida de "-g") y sin todos los símbolos (es decir, nombres de funciones, nombres de variables globales ...). Es el equivalente de "gcc -s -o prog.e prog.c". Cuando se ejecuta un programa, los símbolos no hacen ninguna diferencia. Pero, por ejemplo, el software propietario siempre tiene los símbolos eliminados porque de lo contrario todos podrían conocer los nombres originales de las funciones y sus ubicaciones.
Pikrass