note: 執行時 error while loading shared libraries的情形

2009072822:21
 
ImageMick (or Memcached ..)
程式 make install 完
執行時出現 library 找不到的情形:
 
# convert
convert: error while loading shared libraries: libMagickCore.so.2: cannot open shared object file: No such file or directory
 
# /sbin/ldconfig   <-- 跑一下 ldconfig 就行,不必重開機

 


# memcached
memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

or (新版 libevent)

memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file:  No such file or directory

解決:

# LD_DEBUG=libs /usr/local/bin/memcached
      3799:        find library=libevent-1.4.so.2 [0]; searching
      3799:      search cache=/etc/ld.so.cache
      3799:      search path=/lib/tls/i686/sse2:/lib/tls/i686:/lib/tls/sse2:/lib/tls:/lib/i686/sse2:/lib/i686:/lib
/sse2:/lib:/usr/lib/tls/i686/sse2:/usr/lib/tls/i686:/usr/lib/tls/sse2:/usr/lib/tls:/usr/lib/i686/sse2:/usr/lib/i68
6:/usr/lib/sse2:/usr/lib            (system search path)
      3799:       trying file=/lib/tls/i686/sse2/libevent-1.4.so.2
      3799:       trying file=/lib/tls/i686/libevent-1.4.so.2
      3799:       trying file=/lib/tls/sse2/libevent-1.4.so.2
      3799:       trying file=/lib/tls/libevent-1.4.so.2
      3799:       trying file=/lib/i686/sse2/libevent-1.4.so.2
      3799:       trying file=/lib/i686/libevent-1.4.so.2
      3799:       trying file=/lib/sse2/libevent-1.4.so.2
      3799:       trying file=/lib/libevent-1.4.so.2
      3799:       trying file=/usr/lib/tls/i686/sse2/libevent-1.4.so.2
      3799:       trying file=/usr/lib/tls/i686/libevent-1.4.so.2
      3799:       trying file=/usr/lib/tls/sse2/libevent-1.4.so.2
      3799:       trying file=/usr/lib/tls/libevent-1.4.so.2
      3799:       trying file=/usr/lib/i686/sse2/libevent-1.4.so.2
      3799:       trying file=/usr/lib/i686/libevent-1.4.so.2
      3799:       trying file=/usr/lib/sse2/libevent-1.4.so.2
      3799:       trying file=/usr/lib/libevent-1.4.so.2
      3799:
/usr/local/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file:
 No such file or directory

以上顯示在這些路徑找不到 libevent-1.4.so.2

解決:
libevent 1.4 版
ln -s /usr/local/lib/libevent-1.4.so.2 /lib/libevent-1.4.so.2

libevent 2.0 版
ln -s /usr/local/lib/libevent-2.0.so.5 /lib/libevent-2.0.so.5


Note:

以下參考 http://www.study-area.org/cyril/opentools/opentools/x869.html

RUN TIME的時候, 如果編譯時沒有指定-static這個選項,其實可執行檔並不是真的可執行, 它必須在執行(run time)時需要ld.so來做最後的連結動作,建造一個可執行的 image丟到記憶體。如果是靜態連結,編譯時ld會去找libm.a的檔 。如果是動態連結去找libm.so。 所以每次有新改版程式, 或新加動態函式庫如果不在原本的/etc/ld.so.conf搜尋路徑中,都要把路徑 加進來,然後用

 

ldconfig -v 
	
會重建cache並且顯示它所參照的函式庫。Run Time時ld.so才找得到lib"執行"。 ld與ld.so不一樣喔。

 

一些重要的程式

ld		:Link Editor 連結各obj寫進一個可執行檔(executable)。
ldd		:秀出一個執行檔用了那些動態函式庫。
ld.so		:Dynamic Linker, 動態連結的話,是由ld.so完成執行時期symbol的
	        :參照與連結。
ld-linux.so	:ELF檔的動態連結,跟ld.so一樣。只是ld.so是給a.out format的。
                :新的glicb2的ld-linux.so.2已經跟ld.so.2結合成單一程式了。
ldconfig	:根據/etc/ld.so.conf內的目錄,做出動態連結所需的cache檔。
	
ld 就是負責各個函式庫檔的資訊寫進最後可執行檔(executable),所以它叫做 link editor,編譯時根據flags -L搜尋需要的lib,gcc也會把他的設定pass下來。 ld.so ld-linux.so.2是負責最後動態連結,叫做dynamic linker, RUN Time 執行程式時,它根據這個順序搜尋函式庫。

 

 

  1. LD_LIBRARY_PATH 或LD_AOUT_LIBRARY_PATH環境變數所指的路逕

  2. ldconfig所建立的cache

  3. /lib /usr/lib內的檔

來找程式所需要的動態函式庫

 

ldconfig會根據/etc/ld.so.conf這個檔的設定,加上內定的兩個目錄 /lib /usr/lib來設定ld.so要用到所需要的連結 以及連結的cache到/etc/ld.so.cache。 所以如果換了新的函式庫,新的kernel,內部的標頭檔可能會有變化, 都要跟著改變讓gcc正確的找到,喔不,應該是cpp, ld, ld.so能正確的找到。 不然編出來的執行檔可能是錯誤的,執行時還可能segmentation fault。