Apa yang dapat dieksekusi dan tidak dapat dilucuti executables di Unix?

37

Dari 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

Apa arti dari pengupasan yang dapat dieksekusi?

Mengapa beberapa file executable dilucuti sementara yang lain tidak?

Lazer
sumber

Jawaban:

50

Jika Anda mengompilasi executable dengan flag gcc, itu berisi informasi debug. Itu berarti untuk setiap instruksi ada informasi yang baris kode sumber yang dihasilkannya, nama variabel dalam kode sumber dipertahankan dan dapat dikaitkan dengan memori yang cocok pada saat runtime dll. Strip dapat menghapus informasi debugging ini dan data lainnya termasuk dalam executable yang tidak perlu untuk dieksekusi untuk mengurangi ukuran executable.

fschmitt
sumber
10
Lihat juga halaman manual strip (1) . Umumnya strip menghapus semua simbol karena mereka tidak sepenuhnya diperlukan; menghapus info debug juga, tetapi simbol adalah hal besar
Michael Mrozek
3
Konsep ini digeneralisasi ke sebagian besar format yang dapat dieksekusi, ini tidak khusus untuk gcc atau bahkan unix.
Gilles 'SO- stop being evil'
4
Saya memiliki executable 40MB yang ketika dilucuti dikurangi menjadi 6MB - hanya agar Anda mendapatkan gambaran tentang jenis ruang yang membutuhkan data debug.
Nathan Osman
Jadi, apakah striping executable prog.eyang dibangun gcc -g -o prog.e prog.cmembuat Anda setara dengan kompilasi gcc -O0 -o prog.e prog.c?
ysap
1
@ ya, tidak ada hubungannya dengan mengoptimalkan (-O). Kode perakitan tetap sama apakah file dilucuti atau tidak. Anda dapat dieksekusi tanpa info debug (jadi Anda benar tentang hilangnya "-g") dan tanpa semua simbol (yaitu, nama fungsi, nama variabel global ...). Ini sama dengan "gcc -s -o prog.e prog.c". Ketika sebuah program dieksekusi, simbol tidak membuat perbedaan. Tetapi misalnya perangkat lunak berpemilik selalu memiliki simbol yang dilucuti karena jika tidak semua orang dapat mengetahui nama asli fungsi dan lokasinya.
Pikrass