# strip命令及使用

# 作用

在使用gcc编译程序时,我们记得有选项-g,意味者是否保存调试信息。如果保存了调试信息,那么程序体积就会变大。

strip命令就是将程序中不必要的信息如debugsymbol信息去除,使程序体积减小。

# 使用方法

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)