Що таке зняті та не позбавлені виконувані файли в Unix?


37

З файлу 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

Що означає виконується зачистка?

Чому деякі виконувані файли позбавлені, а інші - ні?

Відповіді:


50

Якщо ви компілюєте виконуваний файл із прапорцем gcc -g, він містить інформацію про налагодження. Це означає, що для кожної інструкції є інформація, який рядок вихідного коду її генерував, ім'я змінних у вихідному коді зберігається і може бути пов'язане з відповідною пам'яттю під час виконання тощо. Стрип може видалити цю інформацію про налагодження та інші дані у виконуваному файлі, який не потрібен для виконання, щоб зменшити розмір виконуваного файлу.


10
Дивіться також стрічку (1) . Зазвичай смужка видаляє всі символи, оскільки вони не є суворо необхідними; він також видаляє інформацію про налагодження, але символи - це найбільше
Michael Mrozek

3
Концепція узагальнює більшість виконуваних форматів, це не характерно для gcc або навіть unix.
Жил "ТАК - перестань бути злим"

4
У мене був виконаний 40 Мб, який при зніманні зменшувався до 6 МБ - просто так ви отримуєте уявлення про те, який простір займає налагодження даних.
Натан Осман

Отже, чи знімання виконуваного файлу, prog.eякий було побудовано, gcc -g -o prog.e prog.cотримує вам еквівалент компіляції gcc -O0 -o prog.e prog.c?
ysap

1
@ysap ні, це не має нічого спільного з оптимізацією (-O). Код складання залишається таким самим, незалежно від того, чи знімається файл чи ні. Ви отримуєте виконуваний файл без інформації про налагодження (тому ви маєте рацію щодо втрати "-g") і без усіх символів (тобто імен функцій, імен глобальних змінних ...). Це еквівалент "gcc -s -o prog.e prog.c". Коли програма виконується, символи не мають жодного значення. Але, наприклад, у власному програмному забезпеченні завжди є позбавлені символи, оскільки в іншому випадку кожен міг знати оригінальні назви функцій та їх місцезнаходження.
Pikrass
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.