您的位置:首页 > 运维架构 > Linux

Linux strip命令的用法

2014-01-21 17:14 288 查看
from:http://blog.csdn.net/comchen/article/details/7784676

strip 命令

用途

通过除去绑定程序和符号调试程序使用的信息,减少扩展公共对象文件格式(XCOFF)的对象文件的大小。

语法

strip [ -V] [ -r [ -l ] | -x [ -l ] | -t | -H | -e | -E ] [ -X {32|64|32_64}] [ -- ] File ...-

描述

strip 命令减少 XCOFF 对象文件的大小。strip 命令从 XCOFF 对象文件中有选择地除去行号信息、重定位信息、调试段、typchk 段、注释段、文件头以及所有或部分符号表。 一旦您使用该命令,则很难调试文件的符号;因此,通常应该只在已经调试和测试过的生成模块上使用 strip 命令。使用 strip 命令减少对象文件所需的存储量开销。

对于每个对象模块,strip 命令除去给出的选项所指定的信息。对于每个归档文件,strip 命令从归档中除去全局符号表。

可以使用 ar -s 命令将除去的符号表恢复到归档文件或库文件中。

没有选项的 strip 命令除去行号信息、重定位信息、符号表、调试段、typchk 段和注释段。

标志

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

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

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

注:不除去符号表信息。

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

-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 变量。

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

退出状态

该命令返回以下退出值:

0 成功完成。

>0 出错。

示例

要除去 a.out 文件中的符号表和行号信息,请输入:

strip a.out要除去 a.out 文件中的对象文件头,请输入:

strip -H a.out要除去 lib.a 中的 32 位和 64 位符号表,请输入:

strip -X 32_64 lib.a文件

/usr/ccs/bin/strip 包含 strip 命令。

相关信息

ar 命令、as 命令、dump 命令、ld 命令、size 命令。

ar 文件、a.out 文件。

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

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

测试代码如下:

int max(int val1, int val2)
{
int iVal = (val1 > val2) ? val1 : val2;
return iVal;
}

int min(int val1, int val2)
{
int iVal = (val1 < val2) ? val1 : val2;
return iVal;
}


#include <stdio.h>

extern int max(int val1, int val2);
extern int min(int val1, int val2);

int main()
{
int val1, val2;

scanf("%d %d", &val1, &val2);
printf("%d\n", max(val1, val2));
printf("%d\n", min(val1, val2));
}

>gcc -c max.c min.c

>ar rcs libcmp.a max.o min.o

>gcc -o test main.c libcmp.a

>gcc -share -fPIC -o libcmp.so max.c min.c

>cp libcmp.a libcmp.a.bak

>cp libcmp.so libcmp.so.bak

>cp test test.orig

>strip libcmp.a libcmp.so

>strip test

>ll -h

总计 92K

-rwxr-xr-x 1 6.9K a.out

-rw-r--r-- 1 1.1K libcmp.a

-rw-r--r-- 1 1.6K libcmp.a.bak

-rwxr-xr-x 1 2.9K libcmp.so

-rwxr-xr-x 1 5.3K libcmp.so.bak

-rw-r--r-- 1 237 main.c

-rw-r--r-- 1 89 max.c

-rw-r--r-- 1 695 max.o

-rw-r--r-- 1 89 min.c

-rw-r--r-- 1 695 min.o

-rwxr-xr-x 1 3.2K test

-rwxr-xr-x 1 6.8K test.orig

选项简释:

The -fPIC flag directs the compiler to generate position independent code section).

The -shared flag directs the linker to create a shared object file.

可见无论是静态库(libcmp.a)还是动态库(libcmp.so)还是可执行文件(test),去掉一些符号信息后都减小了很多,但如果这时再链接这两个库的话是编不过的,因此,如果不是指定特殊的strip选项的话,还是尽量不要对库文件strip,只对链接后的可执行文件strip就可以了(如果也不调试)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: