LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1345|回复: 4

[==LFS精华系列==]库文件出错调试方法

[复制链接]
发表于 2003-10-22 09:36:11 | 显示全部楼层 |阅读模式
把一些心得記下?恚ǔ library 的問題都是比較隱性的,而且容易造成一些怪問題。

# 在編譯時期常出現的問題就是 gcc 找不到 library。

首先檢查一下到底有沒有在 ld 的 hints 內有沒有我們需要的 library

[PHP]-- gentoo
% ldconfig -p

-- FreeBSD
% ldconfig -r [/PHP]


如果有的話,那可能要檢查一下 gcc 的 -l&ltlibrary> 的 library 名稱有沒有寫錯。

如果沒有的話,那要檢查一下 ld 的搜尋範圍(哪些 directory 是在掌控之中)


[PHP] -- gentoo
改 /etc/env.d/00basic 裡面的 LDPATH
then
% env-update

-- FreeBSD
改 /etc/rc.conf,底下是 /etc/default/rc.conf 裡面的內容,overwrite 就好。
ldconfig_paths="/usr/lib/compat /usr/X11R6/lib /usr/local/lib"
# shared library search paths
ldconfig_paths_aout="/usr/lib/compat/aout /usr/X11R6/lib/aout /usr/local/lib/aout"
# a.out shared library search paths
看是要手動跑 ldconfig 還是要
% /bin/sh /etc/rc[/PHP]

這樣應該就能進去了


接下?淼膯栴}比較有趣點,先介紹一個工具: readelf,算是 Elf header dumper,用法很簡單,我都是這樣用:



[PHP] readelf -a &ltelf file>[/PHP]

這可以檢查你 link 的 library 有沒有問題,executable 有沒有 link 到正確的 lib,或是 library 裡面有沒有你需要的 function。

有次遇到一個問題就是 PHP 一直編不起?恚钺崾悄硞 library 的次版本過舊,缺了一個 function,就是用 readelf 看 symbol table 找到的。

再者,切入正題吧,這次的問題還蠻有趣的。跟 BerkerleyDB 有關,編譯沒有問題,然後一開始的 create db 也 OK,然後 store key/data 進去也可以過,但是一要 query 就掛點。

於是按照之前的步驟確認過一次,應該沒問題,但是 ldconfig 倒是出現了一些有趣的東西:


[PHP] news db # ldconfig -p | grep db
...略...
libdb1.so (libc6) => /usr/lib/libdb1.so
libdb_cxx.so (libc6) => /usr/lib/libdb_cxx.so
libdb_cxx-3.2.so (libc6) => /usr/lib/libdb_cxx-3.2.so
libdb_cxx-3.so (libc6) => /usr/lib/libdb_cxx-3.so
libdb.so.3 (libc6) => /usr/lib/libdb.so.3
libdb.so.2 (libc6) => /usr/lib/libdb.so.2
libdb.so (libc6) => /usr/lib/libdb.so
libdb.so (libc6) => /usr/local/BerkeleyDB.4.1/lib/libdb.so
libdb-4.1.so (libc6) => /usr/local/BerkeleyDB.4.1/lib/libdb-4.1.so
libdb-4.so (libc6) => /usr/local/BerkeleyDB.4.1/lib/libdb-4.so
libdb-3.2.so (libc6) => /usr/lib/libdb-3.2.so
libdb-3.so (libc6) => /usr/lib/libdb-3.so[/PHP]


可以用的 db 還真是多啊。@@ 這是我原先的編法:

[PHP] gcc -I /usr/local/BerkeleyDB.4.1/include/ db_test.c -ldb[/PHP]

然後 readelf

[PHP]Dynamic segment at offset 0xa60 contains 21 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libdb-3.2.so]
0x00000001 (NEEDED) Shared library: [libc.so.6] [/PHP]

看?硭麅炏冗x擇 3.2 ?碜鬟B結,所以只好?娭浦付ㄒ幌拢
[PHP]gcc -I /usr/local/BerkeleyDB.4.1/include/ -L /usr/local/BerkeleyDB.4.1/lib/ db_test.c -ldb

Dynamic segment at offset 0xa60 contains 21 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libdb-4.1.so] [/PHP]

Yap,解決。不過這是在不同目錄底下的狀況,如果是相同目錄下通常是靠 ln ?碇赶蛘_你想要用的 library。



来自

http://blog.cdpa.nsysu.edu.tw/kmwang/archives/2003_07.html
 楼主| 发表于 2003-10-22 09:38:41 | 显示全部楼层
在Latte::技术  、。。。。。。。

http://blog.cdpa.nsysu.edu.tw/kmwang/archives/cat_lattee.html
发表于 2003-10-22 10:02:30 | 显示全部楼层
好文!
发表于 2003-10-23 10:49:13 | 显示全部楼层
?看来境界不够 看不太懂
发表于 2003-10-23 17:30:15 | 显示全部楼层
没什么,有些是写程序的基础知识
所谓“久病成良医”,大抵如此。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表