• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 關于Linux共享庫的一點兒知識

    發表于:2013-12-30來源:IT博客大學習作者:phpor 點擊數: 標簽:linux
    1. 關于動態鏈接的文件依賴的共享庫: 鏈接時使用-l指定的庫文件都會記錄到elf文件里面的,程序加載前的動態鏈接一定會加載的,不管你的程序是否會用到;如:

      1. 關于動態鏈接的文件依賴的共享庫:

      鏈接時使用-l指定的庫文件都會記錄到elf文件里面的,程序加載前的動態鏈接一定會加載的,不管你的程序是否會用到;如:

      ======= phpor.c ============

      #include

      void phpor_hello() {

      printf("hello\n");

      }

      ======= phpor_test.c =============

      //void phpor_hello();

      int main(int ac, char **av) {

      // phpor_hello();

      printf("no dependent \n");

      return 0;

      }

      ----------------------------------

      # gcc -shared -o libphpor.so phpor.c

      # gcc -o phpor_test -l phpor -L. phpor_test.c

      # LD_LIBRARY_PATH=. ./phpor_test

      no dependent

      # LD_LIBRARY_PATH=. ldd ./phpor_test

      libphpor.so => ./libphpor.so (0x00e4f000)

      libc.so.6 => /lib/tls/libc.so.6 (0x00865000)

      /lib/ld-linux.so.2 (0x00846000)

      你可以把libphpor.so 刪掉,執行的時候就報錯了

      2. 關于共享庫的版本號:

      我創建了一個so文件 libphpor.so.1 ,現在我要編譯一個phpor_test的文件,該文件依賴libphpor.so.1,于是有如下命令:

      gcc -o phpor_test -l phpor -L. phpor_test.c

      我的libphpor.so.1 是在當前目錄下的,所以 -L.

      如果我不創建軟連接 libphpor.so => libphpor.so.1 的話,則是無法連接的。 為什么不能直接使用 libphpor.so.1 呢? 關鍵是:

      # ldd /bin/ls

      librt.so.1 => /lib/tls/librt.so.1 (0x00ce9000)

      libacl.so.1 => /lib/libacl.so.1 (0x00f7f000)

      libselinux.so.1 => /lib/libselinux.so.1 (0x00a22000)

      libc.so.6 => /lib/tls/libc.so.6 (0x00865000)

      libpthread.so.0 => /lib/tls/libpthread.so.0 (0x009f5000)

      /lib/ld-linux.so.2 (0x00846000)

      libattr.so.1 => /lib/libattr.so.1 (0x00502000)

      為什么ls這個命令就能依賴一個帶有主版本號的庫,而我就不能依賴指定的主版本號?

      我只好創建一個軟連接 libphpor.so => libphpor.so.1 ,因為該so文件沒有在LD_LIBRARY_PATH 下,所以,這里測試時臨時指定一下:

      LD_LIBRARY_PATH=. ./phpor_test

      3. 關于共享庫、靜態庫和動態鏈接、靜態鏈接的概念

      共享庫、靜態庫

      強調的是:

      我能否被其它程序動態加載

      特點:

      靜態庫(不是靜態鏈接的可執行程序)可能(也可能不)依賴別的未定義的符號,但是,自己不知道(也不會說明)這些符號在那里可以找到,即: 不描述依賴關系

      共享庫可能(也可能不)依賴別的未定義的符號,但是,自己會說明這些符號可能在哪里可以找到,即:描述依賴關系

      其實,靜態庫實際是沒有經過鏈接的,只是一些目標文件的打包;共享庫是經過了鏈接這個步驟了的

      動態鏈接、靜態鏈接:

      強調的是:

      我(就是鏈接的結果文件,可能是一個可執行文件,也可能是一個共享庫so文件,注意,so文件有的也可以直接執行,但一定不是靜態庫文件)在運行的時候,是否依賴別的動態庫文件。

      特點:

      動態鏈接的文件一定依賴其他的so文件,至少要依賴 ld.so

      靜態鏈接的文件一定不依賴其他的so文件

      庫類型與鏈接類型之間的關系:

      共享庫也可以是靜態鏈接的,如:

      # ldd /lib/ld-linux.so.2

      statically linked

      可以使用共享庫來靜態鏈接生成一個靜態的可執行程序,如:

      LD_LIBRARY_PATH=. gcc -o phpor_test -static -l phpor -L. phpor_test.c

      你也可以使用靜態庫來動態鏈接生成一個動態的可執行程序, 如:

      # gcc -o phpor_test phpor_test.c ./libphpor.a

      # ./phpor_test

      hello

      # ldd phpor_test

      libc.so.6 => /lib/tls/libc.so.6 (0x00b9a000)

      /lib/ld-linux.so.2 (0x00b7b000)

      4. 我們說,共享庫也可以是靜態鏈接的,下面我們做一個實驗,把上面的phpor.c 編譯成一個靜態鏈接的共享庫文件:

      因為linux幾乎所有程序都依賴libc.so, 現在要靜態鏈接,就需要指定需要的.a 文件 libc.a, 在/usr/lib下; 一般默認是動態鏈接的,如果要靜態連接,就需要使用 -static 選項指定,命令如下:

      gcc -shared -static -o libphpor.so.2 /usr/lib/libc.a phpor.c

      但是,這樣編譯的結果還是動態鏈接的,為什么? -static 沒有起作用嗎?

      使用如下命令:

      # gcc -shared -nodefaultlibs -o libphpor.so.2 /usr/lib/libc.a phpor.c

      # ldd libphpor.so.2

      statically linked

      當然,您可以同時使用 -nodefaultlibs和 -static ; 不明白的是: 難道static不是用來屏蔽其它的動態庫文件的嗎?

      先生成目標文件,自己使用ld命令來做靜態連接:

      # gcc -o phpor.o -c phpor.c

      # ld -shared -dn -o libphpor.so.3 phpor.o

      # ldd libphpor.so.3

      statically linked

      # ln -s libphpor.so.3 libphpor.so

      # LD_LIBRARY_PATH=. ./phpor_test

      hello

      又有問題了,為什么我沒有指定/usr/lib/libc.a , 這里卻能鏈接完成,而且還能用了呢?難道ld幫我做了?

    原文轉自:http://blogread.cn/it/article/4900

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>