linux 動態庫檔案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為好。
到此前面遇到的問題基本上也大概明白了。
相關文章
- Linux檔案屬性Linux
- 檔案屬性
- 認識 Linux 檔案屬性及檔案配置(轉)Linux
- Linux 檔案屬性及詳細操作Linux
- linux 檔案屬性及基礎操作Linux
- 檔案的屬性
- 檔案屬性資訊
- Properties屬性檔案
- Linux(2) 檢視檔案屬性以及修改Linux
- Linux的檔案屬性和目錄配置Linux
- LINUX動態庫檔案 soname realname linkname 詳解Linux
- ls命令 & 檔案屬性
- 檔案時間屬性
- C#-----ExpandoObject動態屬性C#Object
- PHP動態屬性和stdclassPHP
- 三、動態繫結屬性
- linux 檔案屬性介紹及改變方法Linux
- Linux 基礎-檔案許可權與屬性Linux
- Mac系統檔案屬性Mac
- 改變檔案屬性 (轉)
- 檔案屬性解釋(轉)
- Laravel 動態屬性的實現Laravel
- node實現檔案屬性批量修改(時間屬性)
- linux 如何改變檔案屬性與許可權Linux
- 深入理解JavaScript類與物件:揭秘類欄位和靜態屬性的妙用,js靜態屬性和例項屬性JavaScript物件JS
- 每天一個 Linux 命令(25):Linux 檔案屬性詳解Linux
- win10怎麼更改檔案屬性 win10怎樣修改檔案屬性Win10
- Linux 依賴動態庫 / 靜態庫的動態態庫 / 靜態庫Linux
- 屬性配置檔案詳解(2)
- XMl 檔案屬性的讀取XML
- Java屬性檔案的讀取Java
- FreeBSD檔案的屬性(轉)
- 動態修改input元素type屬性值
- 理解linux配置檔案Linux
- JavaScript私有屬性和靜態屬性JavaScript
- 靜態屬性
- Linux動態庫Linux
- node實現檔案屬性批量修改(檔名)