<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 21.5 函數庫管理 在我們的 Linux 操作系統當中,函數庫是很重要的一個項目。 因為很多的軟件之間都會互相取用彼此提供的函數庫來進行特殊功能的運行, 例如很多需要驗證身份的程序都習慣利用 PAM 這個模塊提供的驗證機制來實作,而很多網絡連線機制則習慣利用 SSL 函數庫來進行連線加密的機制。所以說,函數庫的利用是很重要的。不過, 函數庫又依照是否被編譯到程序內部而分為動態與靜態函數庫,這兩者之間有何差異?哪一種函數庫比較好? 下面我們就來談一談先! ### 21.5.1 動態與靜態函數庫 首先我們要知道的是,函數庫的類型有哪些?依據函數庫被使用的類型而分為兩大類,分別是靜態 (Static) 與動態 (Dynamic) 函數庫兩類。下面我們來談一談這兩種類行的函數庫吧! * 靜態函數庫的特色: * **擴展名**:(擴展名為 .a) 這類的函數庫通常擴展名為 libxxx.a 的類型; * **編譯行為**: 這類函數庫在編譯的時候會直接整合到執行程序當中,所以利用靜態函數庫編譯成的文件會比較大一些喔; * **獨立執行的狀態**: 這類函數庫最大的優點,就是編譯成功的可可執行文件可以獨立執行,而不需要再向外部要求讀取函數庫的內容 (請參照動態函數庫的說明)。 * **升級難易度**: 雖然可執行文件可以獨立執行,但因為函數庫是直接整合到可執行文件中, 因此若函數庫升級時,整個可執行文件必須要重新編譯才能將新版的函數庫整合到程序當中。 也就是說,在升級方面,只要函數庫升級了,所有將此函數庫納入的程序都需要重新編譯! * 動態函數庫的特色: * **擴展名**:(擴展名為 .so) 這類函數庫通常擴展名為 libxxx.so 的類型; * **編譯行為**: 動態函數庫與靜態函數庫的編譯行為差異挺大的。 與靜態函數庫被整個捉到程序中不同的,動態函數庫在編譯的時候,在程序里面只有一個“指向 (Pointer)”的位置而已。也就是說,動態函數庫的內容并沒有被整合到可執行文件當中,而是當可執行文件要使用到函數庫的機制時, 程序才會去讀取函數庫來使用。由于可執行文件當中僅具有指向動態函數庫所在的指標而已, 并不包含函數庫的內容,所以他的文件會比較小一點。 * **獨立執行的狀態**: 這類型的函數庫所編譯出來的程序不能被獨立執行, 因為當我們使用到函數庫的機制時,程序才會去讀取函數庫,所以函數庫文件“必須要存在”才行,而且,函數庫的“所在目錄也不能改變”,因為我們的可可執行文件里面僅有“指標”亦即當要取用該動態函數庫時, 程序會主動去某個路徑下讀取,呵呵!所以動態函數庫可不能隨意移動或刪除,會影響很多相依的程序軟件喔! * **升級難易度**: 雖然這類型的可執行文件無法獨立運行,然而由于是具有指向的功能, 所以,當函數庫升級后,可執行文件根本不需要進行重新編譯的行為,因為可執行文件會直接指向新的函數庫文件 (前提是函數庫新舊版本的文件名相同喔!)。 目前的 Linux distribution 比較傾向于使用動態函數庫,因為如同上面提到的最重要的一點, 就是函數庫的升級方便!由于 Linux 系統里面的軟件相依性太復雜了,如果使用太多的靜態函數庫,那么升級某一個函數庫時, 都會對整個系統造成很大的沖擊!因為其他相依的可執行文件也要同時重新編譯啊! 這個時候動態函數庫可就有用多了,因為只要動態函數庫升級就好,其他的軟件根本無須變動。 那么這些函數庫放置在哪里呢?絕大多數的函數庫都放置在:/lib64, /lib 目錄下! 此外,Linux 系統里面很多的函數庫其實 kernel 就提供了,那么 kernel 的函數庫放在哪里?呵呵!就是在 /lib/modules 里面啦!里面的數據可多著呢!不過要注意的是, 不同版本的核心提供的函數庫差異性是挺大的,所以 kernel 2.4.xx 版本的系統不要想將核心換成 2.6.xx 喔! 很容易由于函數庫的不同而導致很多原本可以執行的軟件無法順利運行呢! ### 21.5.2 ldconfig 與 /etc/ld.so.conf 在了解了動態與靜態函數庫,也知道我們目前的 Linux 大多是將函數庫做成動態函數庫之后,再來要知道的就是,那有沒有辦法增加函數庫的讀取性能? 我們知道內存的存取速度是硬盤的好幾倍,所以,如果我們將常用到的動態函數庫先載入內存當中 (高速緩存, cache),如此一來,當軟件要取用動態函數庫時,就不需要從頭由硬盤里面讀出啰! 這樣不就可以增進動態函數庫的讀取速度?沒錯,是這樣的!這個時候就需要 ldconfig 與 /etc/ld.so.conf 的協助了。 如何將動態函數庫載入高速緩存內存當中呢? 1. 首先,我們必須要在 /etc/ld.so.conf 里面寫下“ 想要讀入高速緩存內存當中的動態函數庫所在的目錄”,注意喔, 是目錄而不是文件; 2. 接下來則是利用 ldconfig 這個可執行文件將 /etc/ld.so.conf 的數據讀入高速緩存當中; 3. 同時也將數據記錄一份在 /etc/ld.so.cache 這個文件當中吶! ![使用 ldconfig 預載入動態函數庫到內存中](img/ldconfig.gif)圖21.5.1、使用 ldconfig 預載入動態函數庫到內存中 事實上, ldconfig 還可以用來判斷動態函數庫的鏈接信息呢!趕緊利用 CentOS 來測試看看。假設你想要將目前你系統下的 mariadb 函數庫加入到高速緩存當中時,可以這樣做: ``` [root@study ~]# ldconfig [-f conf] [ -C cache] [root@study ~]# ldconfig [-p] 選項與參數: -f conf :那個 conf 指的是某個文件名稱,也就是說,使用 conf 作為 libarary 函數庫的取得路徑,而不以 /etc/ld.so.conf 為默認值 -C cache:那個 cache 指的是某個文件名稱,也就是說,使用 cache 作為高速緩存暫存 的函數庫數據,而不以 /etc/ld.so.cache 為默認值 -p :列出目前有的所有函數庫數據內容 (在 /etc/ld.so.cache 內的數據!) 范例一:假設我的 Mariadb 數據庫函數庫在 /usr/lib64/mysql 當中,如何讀進 cache ? [root@study ~]# vim /etc/ld.so.conf.d/vbird.conf /usr/lib64/mysql &lt;==這一行新增的啦! [root@study ~]# ldconfig &lt;==畫面上不會顯示任何的信息,不要太緊張!正常的! [root@study ~]# ldconfig -p 924 libs found in cache `/etc/ld.so.cache' p11-kit-trust.so (libc6,x86-64) =&gt; /lib64/p11-kit-trust.so libzapojit-0.0.so.0 (libc6,x86-64) =&gt; /lib64/libzapojit-0.0.so.0 ....(下面省略).... # 函數庫名稱 =&gt; 該函數庫實際路徑 ``` 通過上面的動作,我們可以將 Mariadb 的相關函數庫給他讀入高速緩存當中,這樣可以加快函數庫讀取的效率呢! 在某些時候,你可能會自行加入某些 Tarball 安裝的動態函數庫,而你想要讓這些動態函數庫的相關鏈接可以被讀入到高速緩存當中, 這個時候你可以將動態函數庫所在的目錄名稱寫入 /etc/ld.so.conf.d/yourfile.conf 當中,然后執行 ldconfig 就可以啦! ### 21.5.3 程序的動態函數庫解析: ldd 說了這么多,那么我如何判斷某個可執行的 binary 文件含有什么動態函數庫呢?很簡單,利用 ldd 就可以曉得了!例如我想要知道 /usr/bin/passwd 這個程序含有的動態函數庫有哪些,可以這樣做: ``` [root@study ~]# ldd [-vdr] [filename] 選項與參數: -v :列出所有內容信息; -d :重新將數據有遺失的 link 點秀出來! -r :將 ELF 有關的錯誤內容秀出來! 范例一:找出 /usr/bin/passwd 這個文件的函數庫數據 [root@study ~]# ldd /usr/bin/passwd ....(前面省略).... libpam.so.0 =&gt; /lib64/libpam.so.0 (0x00007f5e683dd000) &lt;==PAM 模塊 libpam_misc.so.0 =&gt; /lib64/libpam_misc.so.0 (0x00007f5e681d8000) libaudit.so.1 =&gt; /lib64/libaudit.so.1 (0x00007f5e67fb1000) &lt;==SELinux libselinux.so.1 =&gt; /lib64/libselinux.so.1 (0x00007f5e67d8c000) &lt;==SELinux ....(下面省略).... # 我們前言的部分不是一直提到 passwd 有使用到 pam 的模塊嗎!怎么知道? # 利用 ldd 察看一下這個文件,看到 libpam.so 了吧?這就是 pam 提供的函數庫 范例二:找出 /lib64/libc.so.6 這個函數的相關其他函數庫! [root@study ~]# ldd -v /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 (0x00007f7acc68f000) linux-vdso.so.1 =&gt; (0x00007fffa975b000) Version information: &lt;==使用 -v 選項,增加顯示其他版本信息! /lib64/libc.so.6: ld-linux-x86-64.so.2 (GLIBC_2.3) =&gt; /lib64/ld-linux-x86-64.so.2 ld-linux-x86-64.so.2 (GLIBC_PRIVATE) =&gt; /lib64/ld-linux-x86-64.so.2 ``` 未來如果你常常升級安裝 RPM 的軟件時 (下一章節會介紹),應該常常會發現那個“ 相依屬性”的問題吧!沒錯!我們可以先以 ldd 來視察“相依函數庫”之間的相關性!以先取得了解! 例如上面的例子中,我們檢查了 libc.so.6 這個在 /lib64 當中的函數庫,結果發現他其實還跟 ld-linux-x86-64.so.2 有關!所以我們就需要來了解一下,那個文件到底是什么軟件的函數庫呀?使用 -v 這個參數還可以得知該函數庫來自于哪一個軟件!像上面的數據中,就可以得到該 libc.so.6 其實可以支持 GLIBC_2.3 等的版本!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看