|
把一些心得記下?恚ǔ library 的問題都是比較隱性的,而且容易造成一些怪問題。
# 在編譯時期常出現的問題就是 gcc 找不到 library。
首先檢查一下到底有沒有在 ld 的 hints 內有沒有我們需要的 library
[PHP]-- gentoo
% ldconfig -p
-- FreeBSD
% ldconfig -r [/PHP]
如果有的話,那可能要檢查一下 gcc 的 -l<library> 的 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 <elf 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 |
|