Что такое зачищенные и не зачищенные исполняемые файлы в Unix?

37

Из мужского файла ,

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

Что означает исполняемый демонтаж?

Почему некоторые исполняемые файлы удаляются, а другие нет?

Lazer
источник

Ответы:

50

Если вы скомпилируете исполняемый файл с флагом gcc -g, он будет содержать информацию об отладке. Это означает, что для каждой инструкции есть информация, какая строка исходного кода сгенерировала ее, имя переменных в исходном коде сохраняется и может быть связано с соответствующей памятью во время выполнения и т. Д. Strip может удалить эту информацию отладки и другие включенные данные в исполняемом файле, который не является необходимым для выполнения, чтобы уменьшить размер исполняемого файла.

fschmitt
источник
10
Смотрите также полосу (1) . Обычно полоска удаляет все символы, поскольку они не являются строго необходимыми; он также удаляет отладочную информацию, но символы - это главное
Майкл Мрозек
3
Концепция обобщает большинство исполняемых форматов, это не относится только к gcc или даже к unix.
Жиль "ТАК - перестань быть злым"
4
У меня был исполняемый файл объемом 40 МБ, который при удалении был уменьшен до 6 МБ - просто чтобы вы поняли, какое место занимают отладочные данные.
Натан Осман
Итак, извлекает ли исполняемый файл, prog.eкоторый был gcc -g -o prog.e prog.cскомпилирован, эквивалентный компиляции gcc -O0 -o prog.e prog.c?
2010 г.
1
@ysap нет, это не имеет ничего общего с оптимизацией (-O). Код сборки остается неизменным вне зависимости от того, был ли удален файл. Вы получаете исполняемый файл без отладочной информации (так что вы правы насчет потери «-g») и без всех символов (то есть имен функций, имен глобальных переменных ...). Это эквивалент "gcc -s -o prog.e prog.c". Когда программа выполняется, символы не имеют никакого значения. Но, например, в проприетарном программном обеспечении всегда есть символы, потому что в противном случае каждый может знать исходные имена функций и их расположение.
Пикрасс