March 07, 2008

Visual LDD : 視覺化動態函式庫呈現

傍晚慢慢自酒醉中甦醒,又繼續 hack Eclipse CDT,在分析 dynamic linker 時,發現電腦裡頭的 Gtk+ 程式都 linked 到 libstdc++,啊?!GNOME/Gtk+ 開發不是一直 [強烈支持慣C] 嗎?先用 ldd 分析 gedit:
$ ldd /usr/bin/gedit | grep libstdc++
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6f3a000)
$
真是太詭異了,可是 gedit 又連結到一堆函式庫:
$ ldd /usr/bin/gedit | wc -l
80
八十個!該如何觀察分析呢?還好 [Autopackage] 專案有個好用的工具 visual-ldd,直接將 gedit 塞進去可得以下圖形輸出:

由上往下看,gedit 是 Gtk+ 程式,Gtk+ 程式依賴 cairo 程式庫,而 cairo 程式庫依賴 libstdc++ (?!),我們終於抓到兇手了,當然,這跟系統組態有些關聯 (Ubuntu hardy),先不細究。visual-ldd 可以解讀 ELF 執行檔格式,分析動態函式庫的解析,並建立階層式表現,上圖的 [+] 即可進一步被展開。自 SVN 取得最新的 visual-ldd 並建構:
$ svn co svn://plan99.net/visual-ldd/trunk visual-ldd
$ cd visual-ldd
$ qmake-qt3
$ make
直接執行即可,不需安裝動作。
由 jserv 發表於 March 7, 2008 07:54 PM
迴響

所有纯 C 的 Gtk 程序都依赖 C++ 库了……

華華 發表於 March 7, 2008 09:31 PM

不過 Ubuntu gutsy 時,cairo 是不相依於 libstdc++ 的:
$ ldd /usr/lib/libcairo.so.2
linux-gate.so.1 => (0xffffe000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb7e37000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7e22000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb7df6000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb7dd3000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb7dcb000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb7cda000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7cb5000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7b6b000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb7b4a000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb7b47000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb7b42000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7b3e000)
/lib/ld-linux.so.2 (0x80000000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7b26000)

jserv 發表於 March 7, 2008 09:59 PM
發表迴響









記住我的資訊?