用strip命令脱衣服

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 --