O que são executáveis ​​removidos e não removidos no Unix?

37

Do arquivo 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

O que significa execução executável?

Por que alguns dos executáveis ​​são removidos, enquanto outros não?

lazer
fonte

Respostas:

50

Se você compilar um executável com o sinalizador -g do gcc, ele conterá informações de depuração. Isso significa que, para cada instrução, há informações sobre qual linha do código fonte a gerou, o nome das variáveis ​​no código fonte é retido e pode ser associado à memória correspondente em tempo de execução, etc. O strip pode remover essas informações de depuração e outros dados incluídos no executável que não é necessário para a execução, a fim de reduzir o tamanho do executável.

fschmitt
fonte
10
Veja também a página de manual da faixa (1) . Geralmente, a tira remove todos os símbolos, pois eles não são estritamente necessários; ele remove informações de depuração também, mas os símbolos são a grande coisa
Michael Mrozek
3
O conceito generaliza para a maioria dos formatos executáveis, isso não é específico para o gcc ou mesmo para o unix.
Gilles 'SO- stop be evil'
4
Eu tinha um executável de 40 MB que, quando retirado, foi reduzido para 6 MB - apenas para você ter uma idéia do tipo de espaço que os dados de depuração ocupam.
Nathan Osman
Então, remover um executável prog.eque foi construído com gcc -g -o prog.e prog.cvocê equivale a compilar gcc -O0 -o prog.e prog.c?
ysap
11
@ syap não, não tem nada a ver com otimização (-O). O código de montagem permanece o mesmo, independentemente de o arquivo ser removido. Você obtém um executável sem as informações de depuração (portanto, está certo sobre a perda de "-g") e sem todos os símbolos (ou seja, nomes de funções, nomes de variáveis ​​globais ...). É o equivalente a "gcc -s -o prog.e prog.c". Quando um programa é executado, os símbolos não fazem diferença. Mas, por exemplo, softwares proprietários sempre têm símbolos despojados, porque, caso contrário, todos poderiam saber os nomes originais das funções e seus locais.
Pikrass