【file命令not stripped】
UNIX下*.o和*.so文件顯示的stripped和not stripped是什么意思?
表示符號表是否被清除.
在centos 6.2下用file命令查看文件信息的時候,顯示如下:
libcom_err.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped
libcrypto.so.10: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped
libcrypt.so.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
libc.so.6: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
libdl.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
第一個最后顯示的是stripped,第二個是not stripped。而且對於同樣名字的動態庫,帶not stripped庫會大很多。
所以由此想到會不會類似於gcc編譯的時候加上調試信息的形式呢?
至少乍一看,對於這個名詞都不是很懂,百度翻譯了一下也不好用,那么到底是什么意思呢?
在一篇“elf文件格式與動態鏈接庫”的博客里我們可以找到答案。
a.out和elf(Executable and Linking Format)。這兩種格式中都有符號表(symbol table),其中包括所有的符號(程序的入口點還有變量的地址等等)。在elf格式中符號表的內容會比a.out格式的豐富的多。但是這些符號表可以用 strip工具去除,這樣的話這個文件就無法讓debug程序跟蹤了,但是會生成比較小的可執行文件。a.out文件中的符號表可以被完全去除,但是 elf中的在加載運行時起着重要的作用,所以用strip永遠不可能完全去除elf格式文件中的符號表。但是用strip命令不是完全安全的,比如對未連接的目標文件來說如果用strip去掉符號表的話,會導致連接器無法連接。
例如:
代碼:
$:gcc -c hello.c
$:ls hello.c hello.o
用gcc把hello.c編譯成目標文件hello.o
代碼:
$:strip hello.o
用strip去掉hello.o中的符號信息。
代碼:
$:gcc hello.o /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o –o hello
/*
$:gcc hello.o /usr/lib/gcc/i686-pc-linux-gnu/3.4.5/../../../crt1.o7
: In function `_start'
: init.c: (.text+0x18)
: undefined reference to `main' collect2
: ld returned 1 exit status
*/
再用gcc連接時,連接器ld報錯。說明在目標文件中的符號起着很重要的作用,如果要發布二進制的程序的話,在debug后為了減小可執行文件的大小,可以用strip來除去符號信息但是在程序的調試階段還是不要用strip為好。
到此前面遇到的問題基本上也大概明白了。
---------------------
作者:bitsjx
來源:CSDN
原文:https://blog.csdn.net/bitsjx/article/details/7454805
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
相關鏈接:
stripped 和 not stripped - 沉淀 - CSDN博客 https://blog.csdn.net/panfengsoftware/article/details/7775108
