编译中使用strip的介绍

E-MAIL: [email protected]

  1. 什么是strip?

strip经常用来去除目标文件中的一些符号表、调试符号表信息,以减小程序的大小。

  1. Strip的原理?

strip 命令减少 XCOFF(Common Object File Format) 对象文件的大小。strip 命令从 XCOFF 对象文件中有选择地除去行号信息、重定位信息、调试段、typchk 段、注释段、文件头以及所有或部分符号表。

 

例如:

(1)、在对test程序编译的时候不使用strip时的状态:

使用file命令查看如下:

编译中使用strip的介绍_第1张图片

查看文件大小:

编译中使用strip的介绍_第2张图片

(2)、在对test程序编译的时候使用strip时的状态:

 

使用file命令查看如下:

        

看下下strip瘦身结果如何:

编译中使用strip的介绍_第3张图片

        编译中使用strip的介绍_第4张图片

瘦身结果是很明显的。

  1. Strip使用的要注意什么?

在实际的开发中, 经常需要对动态库.so进行strip操作, 减少占地空间。 而在调试的时候(比如用addr2line), 就需要符号了。 因此, 通常的做法是: strip前的库用来调试, strip后的库用来实际发布, 他们两者有对应关系。 一旦发布的strip后的库出了问题, 就可以找对应的未strip的库来定位。

 

目标文件分为:可重定位文件、可执行文件、共享文件

-e

在对象文件的可选头中设置 F_LOADONLY 标志。如果对象文件放置在归档中,则该标志告知绑定程序(ld 命令),在与此归档链接时应忽略该对象文件中的符号。

-E

复位(关闭)对象文件的可选头中的 F_LOADONLY 位。(请参阅 -e 标志。)

-H

除去对象文件头、任何可选的头以及所有段的头部分。

注:不除去符号表信息。

-l

(小写 L)从对象文件中除去行号信息。

strip的默认选项会去除.symbol节的内容以及.debug节的内容,因此尽量只对可执行文件执行strip而不要对静态库或动态库等目标文件strip。

 

附使用的参数:

-r

除了外部符号和静态符号条目,将全部符号表信息除去。不除去重定位信息。同时除去调试段和 typchk 段。这个选项产生一个对象文件,该对象文件仍可以用作输入到链接编辑器(ld 命令)中。

-t

除去大多数符号表信息,但并不除去函数符号或行号信息。

-V

打印 strip 命令的版本号。

-x

除去符号表信息,但并不除去静态或外部符号信息。-x 标志同时除去重定位信息,因此将不可能链接到该文件。

-X mode

指定应检查 strip 的对象文件的类型。mode 必须是下列之一:

32

只处理 32 位对象文件

64

只处理 64 位对象文件

32_64

既处理 32 位对象文件,又处理 64 位对象文件

缺省值是处理 32 位对象文件(忽略 64 位对象文件)。也可以用 OBJECT_MODE 环境变量来设置 mode。例如,OBJECT_MODE=64 使 strip 处理任何 64 位对象文件,并忽略 32 位对象文件。-X 标志重设 OBJECT_MODE 变量。

--

(双连字符)将跟随在该标志后的所有参数解释为文件名。这就允许除去名称是以连字符开始的文件。

 

 

整体的COFF文件结构体:

The COFF Object Format is used both for object files (.o extension) and executable files.

COFF目标格式既用于中间文件,也用于可执行文件

Some of the information is only present in object files,

一些信息只出现在对象文件中

other information is only present in the executable files.

其他的信息只出现在可执行文件中

 

Table G-1   COFF file components COFF文件组成

Section  区段名

Description  说明

File header  

文件头

Contains general information; always present.  

包含一般性的消息, 永远有效

Optional header  

扩展头

Contains information about an executable file; usually only present in executables.  

包含关于可执行文件的信息, 通常只出现在可执行文件中

Section header  

区段头

Contains information about the different COFF sections; one for each section.  

包含每个不同的COFF区段信息, 每个区段头对应每个区段

Raw data sections

原始数据区

One for each section containing raw data, such as machine instructions and initialized variables.  

每个区段包含的数据, 例如可执行的机器码,和用来初始化变量的数据

Relocation information

重定位信息  

Contains information about unresolved references to symbols in other modules;

包含来自其它文件中没有确定地址的符号的信息.

one for each section having external references.

每个区段都有一个外部符号

Usually only present in object files and not in executable files.  

通常在目标文件出现而不在可执行文件中出现

Line number information  

行号信息

Contains debugging information about source line numbers;

好汉源代码行号的调试信息

one for each section if compiled with the -g option.  

如果编译选项含有-g参数,那么每一个区段都含有

Symbol table  

符号表

Contains information about all the symbols in the object file;

包含目标文件的所有符号信息

present if not stripped from an executable file.  

目标文件都含有, 可执行文件如果没有剔除的话也有

String table  

字符串表

Contains long symbol names.

包含一些长过8字节的符号名  

 

你可能感兴趣的:(LINUX)