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小时内删除。
留言与评论(共有 0 条评论) |