天天看點

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

關注、星标公衆号,直達精彩内容

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

ID:嵌入式情報局

作者:情報小哥

1檢視執行檔案共享庫

    在平時的開發中可能會存在這樣的需求,想确定所提供的可執行檔案需要哪些動态共享庫,這樣友善我們進行相關路徑的設定和準備,防止在編譯過程中造成的編譯錯誤。

    這樣Linux提供了ldd指令,通過使用該指令行不僅僅能夠知道該可執行檔案需要哪些動态共享庫檔案,同時還能夠測試這些共享庫是否能夠被加載。

    下面小哥就使用ldd指令檢視之前的Test可執行檔案的連結狀态,大家可以發現在連接配接過程中不僅僅隻包括我們自己編寫的libTest.so共享庫檔案,還包括libc其他動态庫檔案。

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)
bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

ldd指令

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

    ldd不是一個可執行檔案,僅僅隻是一個shell腳本,通過該腳本設定相應的環境變量的值,進而使得ld-linux.so(elf動态庫的裝載器)隻顯示該執行程式的依賴。

    ldd指令還有一些可選的選項,下面小哥簡單的例舉了幾個,其他的可以通過man指令來查找:

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

2指定連結動态或者靜态庫

    前面的知識中不管是動态連結庫還是靜态連結庫都會把最終的庫檔案定義為libxxx.so或者libxxx.a,這樣友善GCC進行連結查找并進行相應的程式連結。

    然而如果其中的xxx名字是一樣的,GCC該進行如何的連結呢?下面小哥就前面的例子實驗一下:

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

     把兩個連結庫名字中的xxx都改成了Test,然後執行可執行檔案的生成,最終使用ldd指令發現其進行的還是動态連結方式,是以gcc預設是采用的動态連結,如果找不到對應的動态連結就會采用靜态連結方式。

    那麼小哥再介紹一下gcc的 -static選項,通過使用該選項,最終編譯器會以靜态連結的方式進行庫的連結,如下:

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

    通過使用-static選項,最終生成的可執行檔案大小相比動态連結庫不是一個數量等級上的。

    從上面的結果也可知道該選項使用的是完全的靜态連結方式,如果使用ldd會提示其沒有任何依賴的共享庫:

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

    然而在平時的開發中還會有動靜态混合連結的需求,這樣就需要使用到GCC的-Wl,-Bstatic ,-Wl,-Bdynamic等選項,本文就暫時不展開了,後面的文章小哥再跟大家示範。

3小結

    今天主要是跟大家介紹了ldd指令和-static完全的靜态連結,同時在平時的開發中還會有動靜态混合連結的需求,下期精彩見。

bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)
bazel 連結第三方動态庫_Linux應用程式設計之動靜态連結庫輔助技巧(ldd,static)

長按前往圖中包含的公衆号關注

繼續閱讀