在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

可执行文件剥离是什么意思?

为什么某些可执行文件被剥离,而其他可执行文件却未被剥离?

Answers:


50

如果使用gcc的-g标志编译可执行文件,则该可执行文件包含调试信息。这意味着对于每条指令,都有信息生成源代码的哪一行,源代码中变量的名称得以保留,并且可以在运行时关联到匹配的内存等。Strip可以删除此调试信息和其他包含的数据为了减小可执行文件的大小,在执行文件中不需要执行该文件。


10
另请参见strip(1)联机帮助页。通常,Strip会删除所有符号,因为它们并非严格必要;它也删除了调试信息,但是符号很重要
Michael Mrozek

3
该概念适用于大多数可执行文件格式,这并非特定于gcc甚至是unix。
吉尔(Gilles)“所以,别再邪恶了”,2010年

4
我有一个40MB的可执行文件,剥离后的可执行文件减少到6MB-只是您对调试数据所占用的空间有所了解。
内森·奥斯曼

那么,这是否剥离可执行文件prog.e,将其与建立gcc -g -o prog.e prog.c与编译得到相当于你gcc -O0 -o prog.e prog.c
ysap 2015年

1
@ysap不,它与优化(-O)没有关系。无论是否删除文件,汇编代码都保持不变。您将获得一个没有调试信息的可执行文件(因此您对“ -g”的丢失是正确的)并且没有所有符号(即函数名,全局变量名...)。它等效于“ gcc -s -o prog.e prog.c”。执行程序时,符号没有任何区别。但是例如专有软件总是将符号剥去,因为否则每个人都可以知道功能的原始名称及其位置。
Pikrass 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.