# strip命令及使用
# 作用
在使用gcc
编译程序时,我们记得有选项-g
,意味者是否保存调试信息。如果保存了调试信息,那么程序体积就会变大。
strip命令就是将程序中不必要的信息如debug
和symbol
信息去除,使程序体积减小。
# 使用方法
strip [options] file...
选项:
--remove-section=<name>
移除指定名称的节--strip-debug
移除调试信息--strip-all
移除所有不需要的信息--strip-program-headers
移除程序头信息--strip-section=<name>
移除指定名称的节--strip-symbol=<name>
移除指定名称的符号--strip-unneeded
移除未使用的符号-R
移除运行时搜索路径信息-g
保留调试信息-h
显示帮助信息-K
保留符号表和字符串表-M
保留运行时搜索路径信息-N
保留符号表和字符串表-R
移除运行时搜索路径信息-V
显示版本信息
# 使用
gcc app.cpp -g -o app
ls -alh app
# -rwxrwxrwx 1 xx xx 34K 4月 11 21:58 app
file app
# app: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, with debug_info, not stripped
strip app
ls -alh app
# -rwxrwxrwx 1 xx xx 15K 4月 11 21:58 app
file app
# app: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, stripped
使用nm
命令查看:
before strip:
nm app
# 0000000000404068 B __bss_start
# 0000000000404190 b completed.0
# 0000000000404058 D __data_start
# 0000000000404058 W data_start
# 00000000004010f0 t deregister_tm_clones
# 00000000004010e0 T _dl_relocate_static_pie
# 0000000000401160 t __do_global_dtors_aux
# 0000000000403dd8 d __do_global_dtors_aux_fini_array_entry
# 0000000000404060 D __dso_handle
# 0000000000403de0 d _DYNAMIC
# 0000000000404068 D _edata
# 0000000000404198 B _end
# 0000000000401338 T _fini
# 0000000000401190 t frame_dummy
# 0000000000403dd0 d __frame_dummy_init_array_entry
# 00000000004021cc r __FRAME_END__
# 0000000000404000 d _GLOBAL_OFFSET_TABLE_
# w __gmon_start__
# 000000000040200c r __GNU_EH_FRAME_HDR
# U __gxx_personality_v0@@CXXABI_1.3
# 0000000000401000 T _init
# 0000000000403dd8 d __init_array_end
# 0000000000403dd0 d __init_array_start
# 0000000000402000 R _IO_stdin_used
# 0000000000401330 T __libc_csu_fini
# 00000000004012c0 T __libc_csu_init
# U __libc_start_main@@GLIBC_2.2.5
# 0000000000401196 T main
# 0000000000401120 t register_tm_clones
# 00000000004010b0 T _start
# 0000000000404068 D __TMC_END__
# U _Unwind_Resume@@GCC_3.0
# U _ZdaPv@@GLIBCXX_3.4
# 0000000000401250 W _ZlsRSoRK3Foo
# 00000000004011f8 W _ZN3FooC1Ev
# 00000000004011f8 W _ZN3FooC2Ev
# 0000000000401226 W _ZN3FooD1Ev
# 0000000000401226 W _ZN3FooD2Ev
# U _Znam@@GLIBCXX_3.4
# U _ZNSolsEi@@GLIBCXX_3.4
# U _ZNSolsEPFRSoS_E@@GLIBCXX_3.4
# 0000000000402006 r _ZNSt8__detail30__integer_to_chars_is_unsignedIjEE
# 0000000000402007 r _ZNSt8__detail30__integer_to_chars_is_unsignedImEE
# 0000000000402008 r _ZNSt8__detail30__integer_to_chars_is_unsignedIyEE
# U _ZSt21ios_base_library_initv@@GLIBCXX_3.4.32
# 0000000000404080 B _ZSt4cout@@GLIBCXX_3.4
# U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
# U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
after strip:
nm app
# nm: app: no symbols
nm
命令是 Linux
下的一个强大的文件分析工具,用于检查和分析二进制文件、库文件、可执行文件中的符号表。它返回二进制文件中各段的信息,特别是其中的符号表
nm
用于检查编译过程中生成的.o
目标文件、.so
库文件和可执行文件文件,并显示其中的内容,特别是符号表,而符号表包含了程序中定义的函数、变量和其他符号的信息。
与nm
功能相同的还有objdump/ar
命令。
# reference
1.https://www.cnblogs.com/diegodu/p/6824895.html (opens new window)