dynamically

更新时间:2022-12-27 02:16:30 阅读: 评论:0


2022年12月27日发(作者:延续性)

linux动态库⽂件stripped属性理解(转)

在centos6.2下⽤file命令查看⽂件信息的时候,显⽰如下:

libcom_.2:ELF64-bitLSBsharedobject,x86-64,version1(SYSV),dynamicallylinked,stripped

.10:ELF64-bitLSBsharedobject,x86-64,version1(SYSV),dynamicallylinked,stripped

.1:ELF64-bitLSBsharedobject,x86-64,version1(SYSV),dynamicallylinked(ussharedlibs),forGNU/Linux

2.6.18,notstripped

.6:ELF64-bitLSBsharedobject,x86-64,version1(SYSV),dynamicallylinked(ussharedlibs),forGNU/Linux

2.6.18,notstripped

.2:ELF64-bitLSBsharedobject,x86-64,version1(SYSV),dynamicallylinked(ussharedlibs),forGNU/Linux

2.6.18,notstripped

第⼀个最后显⽰的是stripped,第⼆个是notstripped。⽽且对于同样名字的动态库,带notstripped库会⼤很多。

所以由此想到会不会类似于gcc编译的时候加上调试信息的形式呢?

⾄少乍⼀看,对于这个名词都不是很懂,百度翻译了⼀下也不好⽤,那么到底是什么意思呢?

在⼀篇“elf⽂件格式与动态链接库”的博客⾥我们可以找到答案。

和elf(ExecutableandLinkingFormat)。这两种格式中都有符号表(symboltable),其中包括所有的符号(程序的⼊⼝点还有

变量的地址等等)。在elf格式中符号表的内容会⽐格式的丰富的多。但是这些符号表可以⽤strip⼯具去除,这样的话这个⽂件就⽆法

让debug程序跟踪了,但是会⽣成⽐较⼩的可执⾏⽂件。⽂件中的符号表可以被完全去除,但是elf中的在加载运⾏时起着重要的作

⽤,所以⽤strip永远不可能完全去除elf格式⽂件中的符号表。但是⽤strip命令不是完全安全的,⽐如对未连接的⽬标⽂件来说如果⽤strip

去掉符号表的话,会导致连接器⽆法连接。

例如:

代码:

⽤gcc把hello.c编译成⽬标⽂件hello.o

代码:

⽤strip去掉hello.o中的符号信息。

代码:

$:gcc-chello.c

$:.o

$:striphello.o

$:gcchello.o/usr/lib/crt1.o/usr/lib/crti.o/usr/lib/crtn.o–ohello

/*

$:gcchello.o/usr/lib/gcc/i686-pc-linux-gnu/3.4.5/../../../crt1.o7

:Infunction`_start'

:init.c:(.text+0x18)

:undefinedreferenceto`main'collect2

:ldreturned1exitstatus

*/

再⽤gcc连接时,连接器ld报错。说明在⽬标⽂件中的符号起着很重要的作⽤,如果要发布⼆进制的程序的话,在debug后为了减⼩可执⾏

⽂件的⼤⼩,可以⽤strip来除去符号信息但是在程序的调试阶段还是不要⽤strip为好。

到此前⾯遇到的问题基本上也⼤概明⽩了。

本文发布于:2022-12-27 02:16:30,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/37498.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:jiugan
下一篇:沉没度
标签:dynamically
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图