Last Updated: 2023-10-17 02:14:18 Tuesday
-- TOC --
strip命令用来给ELF格式的二进制文件脱衣服
,即删除部分section,这有几个目的:
能够strip的二进制文件包括可执行文件,动态so库,静态a库等各种EFL格式的文件。
strip - discard symbols and other data from object files
Windows平台采用独立文件的方式保存debug信息,即PDB文件,Portable DeBugging format,这是Windows独有的技术。Linux都是DRARF,这个命令与ELF对应。
默认用gcc编译出来的可执行文件,含有符号表,符号表对应的字符串表,可能还有几个调试信息section,即默认没有strip。
$ gcc -g test.c -o test
$ readelf -h test | grep 'Number of section headers'
Number of section headers: 37
$ strip test
$ readelf -h test | grep 'Number of section headers'
Number of section headers: 29
strip后,ELF文件section数量从37减少到了29。
一个二进制文件,是否经过了strip的洗礼,可以用file命令来查看(file命令的输出是一长整行,请向右拖动查看最后的strip信息):
$ gcc -g test.c -o test
$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=88c0ab358fe613ca4aff9c5cb1b130956c5283f6, for GNU/Linux 3.2.0, with debug_info, not stripped
$ strip test
$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=88c0ab358fe613ca4aff9c5cb1b130956c5283f6, for GNU/Linux 3.2.0, stripped
不管是否strip,都不会影响程序运行,也不会影响程序运行时内存占用大小!
如果对relocatable object文件做strip,此object文件将无法链接,因为非常重要的符号表被strip掉了!而executable文件的符号表里面,存放的是所有符号的虚拟地址,这些地址已经体现在.text和.data中,因此strip掉也没有关系,反而更安全。
如果用objdump命令反汇编stripped executable文件,.text section的内容就全部混在一起了,没有了symbol talbe,objdump命令无法按symbol将.text内的代码区分开来。
下面是strip命令部分命令行参数:
-s|--strip-all
,remove all symbols,似乎默认就是这个动作。
-g|-S|-d|--strip-debug
,remove debugging symbols only。
-R sectionname
--remove-section=sectionname
,按section name执行remove,支持通配符*
,同时此参数可以多次出现。
# strip .comment section
$ strip --remove-section=.comment test
# strip all .text.* section but keep .text.foo
--remove-section=.text.* --remove-section=!.text.foo
本文链接:https://cs.pynote.net/sf/c/cdm/202110268/
-- EOF --
-- MORE --