strip and linux lib compile

From: http://www.360doc.com/content/11/0808/17/7472348_138951246.shtml

strip经常用来去除目标文件中的一些符号表、调试符号表信息,以减小程序的大小,在rpmbuild包的最后就用到。
其支持的选项如下:
>strip -h
用法:strip <选项> 输入文件
从文件中删除符号和节
 选项为:
  -I --input-target=<bfdname>      Assume input file is in format <bfdname>
  -O --output-target=<bfdname>     Create an output file in format <bfdname>
  -F --target=<bfdname>            Set both input and output format to <bfdname>
  -p --preserve-dates              Copy modified/access timestamps to the output
  -R --remove-section=<name>       Remove section <name> from the output
  -s --strip-all                   Remove all symbol and relocation information
  -g -S -d --strip-debug           Remove all debugging symbols & sections
     --strip-unneeded              Remove all symbols not needed by relocations
     --only-keep-debug             Strip everything but the debug information
  -N --strip-symbol=<name>         Do not copy symbol <name>
  -K --keep-symbol=<name>          Do not strip symbol <name>
     --keep-file-symbols           Do not strip file symbol(s)
  -w --wildcard                    Permit wildcard in symbol comparison
  -x --discard-all                 Remove all non-global symbols
  -X --discard-locals              Remove any compiler-generated symbols
  -v --verbose                     List all object files modified
  -V --version                     Display this program's version number
  -h --help                        Display this output
     --info                        List object formats & architectures supported
  -o <file>                        Place stripped output into <file>
strip: 支持的目标: elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big elf64-alpha ecoff-littlealpha elf64-little elf64-big elf32-littlearm elf32-bigarm elf32-hppa-linux elf32-hppa elf64-ia64-little elf64-ia64-big efi-app-ia64 elf32-m68k a.out-m68k-linux elf32-powerpc aixcoff-rs6000 elf32-powerpcle ppcboot elf64-powerpc elf64-powerpcle aixcoff64-rs6000 elf32-s390 elf64-s390 elf32-sparc a.out-sparc-linux elf64-sparc a.out-sunos-big elf64-x86-64 pe-i386 pei-i386 srec symbolsrec tekhex binary ihex trad-core

目标文件分为:可重定位文件、可执行文件、共享文件
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就可以了(如果也不调试)。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC之控制器的单例和多例管理

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 在使用Spring3对控制器Controller进行bean管理时&#xff0c;如果要对控制器是否单例进行管理。 有两种方式配置多例模式&#xff1a; 1.springXML 2.注解本身的控制器类 [java] view plaincopyprin…

Python多个版本指定如何指定

1、指定python3 32bit 版本安装SciPy库 py -3-32 -m pip install SciPy 2、指定python2 64bit 版本安装SciPy库 py -2-64 -m pip install SciPy 3、进入指定版本根目录执行操作 D:\Tools\python37_32bit>python.exe -m pip list

[react] react16的reconciliation和commit分别是什么?

[react] react16的reconciliation和commit分别是什么&#xff1f; React 16 三个核心&#xff1a; Scheduler 调度器&#xff1a;决定什么时候调度 ReconcilerReconciler 协调器&#xff1a;进行 Fiber diff 及新的 Fiber 树的生成以及副作用记录Commit 将新的树应用到 DOM 中…

BZOJ 1997: [Hnoi2010]Planar( 2sat )

平面图中E ≤ V*2-6..一个圈上2个点的边可以是在外或者内, 经典的2sat问题..------------------------------------------------------------------------------------------#include<cstdio>#include<cstring>#include<algorithm>#include<stack>usin…

Qt6.2.1在线安装教程

1、Qt下载官网 Download Qt | Develop Desktop & Embedded Systems | Qt 2、下载后在线安装 安装时会要求登陆账号&#xff0c;这个可以去官网注册账号。 相关模块和版本按需选择。以下为我的项目开发需要安装的部分模块&#xff1a; 然后漫长等待安装结束即可。

Vxworks增加system call

Vxworks中增加system call的伪代码.比如用户层可以获取kernel中的time tick.#include <syscall.h>#include<syscallLib.h>unsignedshortgettimdsp(void);SYSCALL_RTN_TBL_ENTRYmsGetTbl[] {{(FUNCPTR) gettimdsp, 1,"gettimdsp", 0}};unsignedshortgetti…

[react] 使用react写一个todo应用,说说你的思路

[react] 使用react写一个todo应用&#xff0c;说说你的思路 拆分组件&#xff1a;应用 表单部分&#xff08;input button&#xff09;、列表部分&#xff08;checkbox ul>li delete button&#xff09;数据设计&#xff1a;表单的待输入字段 列表中的List数据&#x…

第一次写博客

学习关于前端的知识也有些时间了&#xff0c;从一点不懂到现在的了解到很多关于前端各方面的知识&#xff0c;也算是收获了许多吧&#xff0c;学习了HTML,CSS,JavaScript,PHP,ajax,jQuery,等等许多东西&#xff0c;还有一些框架结构和关于函数的封装&#xff0c;可是关于所学的…

shell除去重复的行——uniq命令

From: http://blog.163.com/redhumor126/blog/static/1955478420123119218332/ 进行排序之后&#xff0c;您会发现有些行是重复的。有时候该重复信息是不需要的&#xff0c;可以将它除去以节省磁盘空间。不必对文本行进行排序&#xff0c;但是您应当记住 uniq 在读取行时会对…

Qt6.2.1使用clang格式化代码

1、环境说明 Qt6.2.1 64bit, windows环境, 安装链接&#xff1a;Download Qt | Develop Desktop & Embedded Systems | Qt llvm 10.0.0 64bit windows环境&#xff0c;安装链接&#xff1a; LLVM Download Page 2、启用Beautifer 帮助--关于插件&#xff0c;勾选Beautif…

为何加入了AddType就无法启动Apache

AddType application/x-compress .Z AddType application/x-gzip .gz .tgz AddType application/x-httpd-php.php 如上面第3句加入了就无法启动apache。这是为什么&#xff1f; 其实我一直都没有错误。后来在网络上找了下&#xff0c;原来addtype这种值只有通过拷贝&#xff0c…

[react] 请说说你对react的render方法的理解

[react] 请说说你对react的render方法的理解 render是class组件中必须被重载的方法&#xff0c;组件执行render方法的条件如下&#xff1a; 初始渲染this.setState方法&#xff0c;参数不能为null,及时this.setState({}),或者setState一个相同的值&#xff0c;也会导致render…

Getting Started With Hazelcast 读书笔记(第七章)

第七章 部署策略 Hazelcast具有适应性,能根据不同的架构和应用进行特定的部署配置,每个应用可以根据具体情况选择最优的配置: 数据与应用紧密结合的模式(重点,of就是这种) 胖客户端模式(最好用一种) 轻成员节点模式(折衷上面两种) 1.使用紧密结合的模式&#xff0c;每个JVM实例…

shell 删除文本中的重复行(sort+uniq/awk/sed) (方法=效率啊)

From: http://churuimin425.blog.163.com/blog/static/341298772012230112956712/ 删除文本中的重复行(sortuniq/awk/sed)三种常见方法:第一&#xff0c;用sortuniq&#xff0c;注意&#xff0c;单纯uniq是不行的。shell> sort -k2n file | uniq > a.out 这里我做了个…

Qt 调用Python引擎混合编程

0、前言 使用Qt和Python做混合编程&#xff0c;充分发挥Qt GUI的图形化框架优势和Python数据处理的计算能力。复杂的计算可用到Python众多三方库&#xff0c;将Python需要执行的功能写成py文件&#xff0c;做成插件的形式&#xff0c;被Qt c调用&#xff0c;修改py文件即可实现…

高扫后督解决方案 力助银行内部核查

网络时代&#xff0c;传统扫描仪需求萎缩&#xff0c;但作为扫描仪家族中重要成员&#xff0c;高速扫描仪却正经历逆势繁荣&#xff1a;因随以金融、教育、政府为代表的行业信息化建设力度不断加强&#xff0c;海量文档快速扫描及数字化存储管理需求飞涨&#xff0c;而满足这类…

[react] 在react中遍历的方法有哪些?它们有什么区别呢?

[react] 在react中遍历的方法有哪些&#xff1f;它们有什么区别呢&#xff1f; 有React.Children.map和 React.Children.forEach这两个方法&#xff0c;他们的参数都是在组件中接受props.children这个ReactNode作为参数&#xff0c;然后进行遍历。专门提供这两个遍历方法的目的…

C# 特性 Attribute

特性就是在类的类名称、属性、方法等上面加一个标记&#xff0c;使这些类、属性、方法等具有某些统一的特征&#xff0c;从而达到某些特殊的需要。举个小栗子&#xff1a;方法的异常捕捉&#xff0c;你是否还在某些可能出现异常的地方&#xff08;例如数据库的操作、文件的操作…

setsockopt , getsoctopt 函数的Level 参数和 name 参数对应表!!!

From: http://blog.csdn.net/jasonm2008/article/details/4016292 int setsockopt( SOCKET s, int level, int optname, const char* optval, int optlen ); 对于这个函数的level级别的参数到底有哪些&#xff0c; optname &#xff0c;对应的又有哪些&#xff0c;一…

Qt 调用MATLAB引擎混合编程

0、前言 C/C调用MATLAB有三个方式&#xff1a;调用dll文件、调用exe可执行程序和调用Engin引擎。 第一种方式利用MATLAB Coder 将MATLAB代码生成C/C代码和相关动态链接库&#xff0c;可以在没有MATLAB的电脑和设备上运行。 第二种方式利用MATLAB将MATLAB代码编译成exe可执行…