ld 動態鏈接庫配置

一、ldconfig

ldconfig是一個動態鏈接庫管理命令,爲了讓動態鏈接庫爲系統所共享,還需運行動態鏈接庫的管理命令--ldconfig。 ldconfig 命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態 鏈接庫(格式如前介紹,lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認爲 /etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表.


Linux下的共享庫機制採用了類似於高速緩存的機制,將庫信息保存在/etc/ld.so.cache裏邊。

程序連接的時候首先從這個文件裏邊查找,然後再到ld.so.conf的路徑裏邊去詳細找。

這就是爲什麼修改了ld.so.conf要重新運行一下ldconfig的原因

補充一點,ldconfig在/sbin裏面。


ldconfig幾個需要注意的地方 
1. 往/lib和/usr/lib裏面加東西,是不用修改/etc/ld.so.conf的,但是完了之後要調一下ldconfig,不然這個library會找不到 
2. 想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf,然後再調用ldconfig,不然也會找不到 
比如安裝了一個MySQL到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,這時 就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存過後ldconfig一下,新的library才能在 程序運行時被找到。 
3. 如果想在這兩個目錄以外放lib,但是又不想在/etc/ld.so.conf中加東西(或者是沒有權限加東西)。那也可以,就是export一個全局變 量LD_LIBRARY_PATH,然後運行程序的時候就會去這個目錄中找library。一般來講這只是一種臨時的解決方案,在沒有權限或臨時需要的時 候使用。 
4. ldconfig做的這些東西都與運行程序時有關,跟編譯時一點關係都沒有。編譯的時候還是該加-L就得加,不要混淆了。 
5. 總之,就是不管做了什麼關於library的變動後,最好都ldconfig一下,不然會出現一些意想不到的結果。不會花太多的時間,但是會省很多的事。


二、ldd

作用:用來查看程序運行所需的共享庫,常用來解決程序因缺少某個庫文件而不能運行的一些問題。
ldd命令原理(摘自網絡)
1、首先ldd不是一個可執行程序,而只是一個shell腳本
2、ldd能夠顯示可執行模塊的dependency,其原理是通過設置一系列的環境變量,如下:LD_TRACE_LOADED_OBJECTS、
LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。當
LD_TRACE_LOADED_OBJECTS環境變量不爲空時,任何可執行程序在運行時,它都會只顯示模塊的dependency,而程序並不真正執行。要不你可以在shell終端測試一下,如下:
(1) export LD_TRACE_LOADED_OBJECTS=1
(2) 再執行任何的程序,如ls等,看看程序的運行結果
3、ldd顯示可執行模塊的dependency的工作原理,其實質是通過ld-linux.so(elf動態庫的裝載器)來實現的。我們知道,ld-
linux.so模塊會先於executable模塊程序工作,並獲得控制權,因此當上述的那些環境變量被設置時,ld-linux.so選擇了顯示可執
行模塊的dependency。
4、實際上可以直接執行ld-linux.so模塊,如:/lib/ld-linux.so.2 --list program(這相當於ldd program)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章