strip (从编译的目标文件中丢弃符号)

瑞兹 发表于 2020-12-11 09:17
浏览次数:
在手机上阅读

在类似Unix的操作系统上,strip命令从编译的目标文件中丢弃符号。

查看英文版

目录

1 strip 运行系统环境

2 strip 描述

3 strip 语法

4 strip 例子

strip 运行系统环境

Unix&Linux

strip 描述

strip是一个GNU 实用程序,用于“剥离”目标文件中的符号。这对于最小化它们的文件大小,简化它们的分发很有用。对于使反向编译 工程的代码更加困难也很有用。

提供给strip的目标文件列表可能包括档案,并且必须至少提供一个目标文件。目标文件本身由strip修改;没有创建新文件。

strip is a GNU utility to "strip" symbols from object files. This is useful for minimizing their file size, streamlining them for distribution. It can also be useful for making it more difficult to reverse-engineer the compiled code.

The list of object files provided to strip may include archives and at least one object file must be provided. The object files themselves are modified by strip; new files are not created.

查看英文版

查看中文版

strip 语法

strip [options] objfile [...]

选件

-F bfdname,--target=bfdname 将原始objfile视为目标代码格式为bfdname的文件,并以相同的格式重写它。
--help 显示的摘要选项来strip和退出。
--info 显示一个列表,其中列出了所有可用的体系结构和对象格式。
-I bfdname,-- input-target = bfdname 将原始objfile视为目标代码格式为bfdname的文件。
-O bfdname,-- output-target = bfdname objfile替换为输出格式为bfdname的文件。
-R sectionname-- remove -section =sectionname 从输出文件中删除任何名为sectionname的节。可以多次给此选项。请注意,不当使用此选项可能会使输出文件无法使用。
-s,-- strip-all 删除所有符号。
-g-S-d,-- strip-debug 仅删除调试符号。
--strip-dwo 删除所有DWARF .dwo部分的内容,其余的调试部分和所有符号保持不变。
--strip-unneeded 删除重定位处理不需要的所有符号。
-K symbolname,-- keep-symbol = symbolname 剥离符号时,即使符号通常被剥离,也应保留符号symbolname。可以多次给此选项。
-N symbolname,-- strip-symbol = symbolname 从源文件中删除符号symbolname。可以多次给此选项,也可以将其与-K以外的其他Strip选项结合使用。
-o file 将剥离的输出放入文件中,而不是替换现有文件。使用此参数时,只能指定一个objfile 参数。
-p,-- preserve-dates 保留文件的访问和修改日期。
-D,--enable-deterministic-archives 以确定性模式操作。复制存档成员并写入存档索引时,对于UID,GID,时间戳记请使用零,并为所有文件使用一致的文件模式。
-w,--wildcard 允许使用其他命令行选项中使用的符号名形式的正则表达式。问号(),星号(*),反斜杠(\)和方括号([])运算符可以在符号名称中的任何位置使用。如果符号名称的第一个字符是感叹号(),则该符号的开关方向相反。例如:-w -K!foo -K fo *将导致strip只保留以字母“ fo ”开头的符号,而丢弃符号“ foo ”。



-x,-- discard-all 删除非全局符号。
-X,-- discard-locals 删除编译器生成的本地符号。(这些通常以' L '或'  '开头。)
--keep-file-symbols 剥离文件时,可能使用--strip-debug--strip-unneeded,保留任何指定源文件名的符号,否则将被剥离。
--only-keep-debug 剥离文件,删除--strip-debug不会剥离的任何节的内容,并使调试节完整无缺。在ELF文件中,这会将所有注释部分保留在输出中。

目的是将此选项与--add-gnu-debuglink一起使用,以创建一个两部分可执行文件。一个是剥离的二进制文件,它将在RAM和分配中占用较少的空间,第二个是仅在需要调试能力时才需要的调试信息文件。建议的创建这些文件的过程如下:
/ 正常链接可执行文件。假设它被称为foo,那么... / 运行objcopy --only-keep-debug foo foo.dbg,以创建包含调试信息的文件。 / 运行objcopy --strip-debug foo创建剥离的可执行文件。 / 运行objcopy --add-gnu-debuglink = foo.dbg foo,将调试信息的链接添加到剥离的可执行文件中。 / 注意-选择.dbg作为调试信息文件的扩展名是任意的;可以是任何东西。同样,-- only-keep-debug步骤是可选的。您可以改为: / 正常链接可执行文件。 / 将foo复制到foo.full / 运行strip --strip-debug foo / 运行objcopy --add-gnu-debuglink = foo.full foo / 换句话说,-- add-gnu-debuglink指向的文件可以是完整的可执行文件。它不必是--only-keep-debug开关创建的文件。

注意:此开关仅适用于完全链接的文件。在调试信息可能不完整的目标文件上使用它是没有意义的。目前,gnu_debuglink功能仅支持存在一个包含调试信息的文件名,而不是每个对象文件一个的多个文件名。
-V,-- version 显示strip的版本号
-v,-- verbose 详细输出:列出所有已修改的目标文件。对于档案,` strip -v '列出档案的所有成员。
strip [options] objfile [...]

Options

-F bfdname--target=bfdname Treat the original objfile as a file with the object code format bfdname, and rewrite it in the same format.
--help Show a summary of the options to strip and exit.
--info Display a list showing all architectures and object formats available.
-I bfdname--input-target=bfdname Treat the original objfile as a file with the object code format bfdname.
-O bfdname--output-target=bfdname Replace objfile with a file in the output format bfdname.
-R sectionname--remove-section=sectionname Remove any section named sectionname from the output file. This option may be given more than once. Note that using this option inappropriately may make the output file unusable.
-s--strip-all Remove all symbols.
-g-S-d--strip-debug Remove debugging symbols only.
--strip-dwo Remove the contents of all DWARF .dwo sections, leaving the remaining debugging sections and all symbols intact.
--strip-unneeded Remove all symbols that are not needed for relocation processing.
-K symbolname--keep-symbol=symbolname When stripping symbols, keep symbol symbolname even if it would normally be stripped. This option may be given more than once.
-N symbolname--strip-symbol=symbolname Remove symbol symbolname from the source file. This option may be given more than once, and may be combined with other strip options, except -K.
-o file Put the stripped output in file, rather than replacing the existing file. When this argument is used, only one objfile argument may be specified.
-p--preserve-dates Preserve the access and modification dates of the file.
-D--enable-deterministic-archives Operate in deterministic mode. When copying archive members and writing the archive index, use zero for UIDs, GIDs, timestamps, and use consistent file modes for all files.
-w--wildcard Permit regular expressions in symbolnames used in other command line options. The question mark (?), asterisk (*), backslash (\) and square brackets ([]) operators can be used anywhere in the symbol name. If the first character of the symbol name is the exclamation point (!) then the sense of the switch is reversed for that symbol. For example:

-w -K !foo -K fo*

would cause strip to only keep symbols that start with the letters "fo", but to discard the symbol "foo".
-x--discard-all Remove non-global symbols.
-X--discard-locals Remove compiler-generated local symbols. (These usually start with `L' or `.'.)
--keep-file-symbols When stripping a file, perhaps with --strip-debug or --strip-unneeded, retain any symbols specifying source file names, which would otherwise get stripped.
--only-keep-debug Strip a file, removing contents of any sections that would not be stripped by --strip-debug and leaving the debugging sections intact. In ELF files, this preserves all note sections in the output.

The intention is that this option will be used in conjunction with --add-gnu-debuglink to create a two part executable. One a stripped binary which will occupy less space in RAM and in a distribution and the second a debugging information file that is only needed if debugging abilities are required. The suggested procedure to create these files is as follows:
  • /Link the executable as normal. Assuming that it is called foo then...
  • Run objcopy --only-keep-debug foo foo.dbg to create a file containing the debugging info.
  • Run objcopy --strip-debug foo to create a stripped executable. 
  • Run objcopy --add-gnu-debuglink=foo.dbg foo to add a link to the debugging info into the stripped executable. 

Note—the choice of .dbg as an extension for the debug info file is arbitrary; it can be anything. Also, the --only-keep-debug step is optional. You could instead do this: 

  • Link the executable as normal. 
  • Copy foo to foo.full.
  • Run strip --strip-debug foo.
  • Run objcopy --add-gnu-debuglink=foo.full foo

In other words, the file pointed to by the --add-gnu-debuglink can be the full executable. It does not have to be a file created by the --only-keep-debug switch.


Note—this switch is only intended for use on fully linked files. It does not make sense to use it on object files where the debugging information may be incomplete. The gnu_debuglink feature currently only supports the presence of one file name containing debugging information, not multiple file names on a one-per-object-file basis.
-V--version Show the version number for strip.
-v--verbose Verbose output: list all object files modified. In the case of archives, `strip -v' lists all members of the archive.

查看英文版

查看中文版

strip 例子

strip -s a.out

上面的示例将从可执行文件a.out中删除符号表。

strip -s a.out

The above example would strip the symbol table from the executable file a.out.

查看英文版

查看中文版

其他命令行

sysklogd | s2p | service | sag | set | setenv | setfacl | sfdisk | sha224sum | sha256sum | sha384sum | sha512sum | shutdown | sleep | stat | startx | strftime | swapoff | shred |

如此好文,分享给朋友
发表评论
验证码:
评论列表
共0条