久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

linux靜態(tài)庫與動態(tài)庫分析

 zhouADNjj 2014-03-11

簡單地說,庫(Library)就是一組已經(jīng)寫好了的函數(shù)和變量,、是為了能夠提高程序開發(fā)效率和運行效率而設計的,。庫分為靜態(tài)庫(Static Library)和共享庫(Shared library)兩類。靜態(tài)庫文件的擴展名是.a,,共享庫文件的擴展名是.so

1)靜態(tài)庫
靜態(tài)庫是指每個用到該庫的應用程序都擁有一份自己的庫拷貝,;應用程序在程序的鏈接階段就會將靜態(tài)庫鏈接到最后的可執(zhí)行程序,即使將靜態(tài)庫刪除也不影響應用程序的運行


2)共享庫
相對于靜態(tài)函數(shù)庫,,共享庫在程序的鏈接階段并沒有被鏈接進目標代碼中,,它是在加載應用程序時被加載的,而且它與應用程序是在運行時綁定的,,其中共享庫又分:動態(tài)鏈接庫,、動態(tài)加載庫。動態(tài)加載庫和動態(tài)鏈接庫都是.so庫,。

不同之處就是加載的方法不同,,動態(tài)連接庫是程序在啟動的時候,在LD_LIBRARY_PATH環(huán)境變量中尋找動態(tài)連接庫,,可以export LD_LIBRARY_PATH=path來設置動態(tài)鏈接庫查找路徑,。可以使用ldd命令查看一個程序在啟動時加載的動態(tài)連接庫,。而動態(tài)加載庫可以用程序的方法來控制什么時候加載,。

靜態(tài)庫使用示例

//hello.h

#ifndef HELLO_H

#define HELLO_H

void hello(const char *name);

#endif

//hello.c

#include <stdio.h>

void hello(const char *name)

{

printf("hello %s! \n",name);

}

//main.c

#include "hello.h"

int main()

{

hello("everyone");

return 0;

}

# gcc -c hello.c (生成hello.o)

# ar crv libmyhello.a hello.o(生成libmyhello.a)

ararchive,歸檔的意思)可以把.o文件打包成一個.a文件

# gcc main.c libmyhello.a -o main(連接libmyhello.a,,也可以用gcc -o out main.c -L. -lmyhello)

其中

  -L指定靜態(tài)函數(shù)庫的位置供查找,,注意L后面還有".",表示靜態(tài)函數(shù)庫在本目錄下查找,。

  -l則指定了靜態(tài)函數(shù)庫名,,由于靜態(tài)函數(shù)庫的命名方式是lib***.a,其中的lib.a忽略,。

可用ar -t libmyhello.a來查看靜態(tài)庫的內(nèi)容

動態(tài)鏈接庫使用

#gcc -shared -fPIC -o libmyhello.so hello.o

#gcc main.c libmyhello.so -o maingcc -o main main.c -L. -lmyhello

可用nm -D libavformat.so查看共享庫的內(nèi)容

arm平臺下(X86arm-linux-readelf -d input_uvc.so

(板卡上)/lib/ld.so.2 –list input_uvc.so查看應用程序的共享庫

root@cheney:lib_test# ls

hello.c hello.h hello.o main main.a_test main.c

root@cheney:lib_test# gcc -shared -fPIC -o libmyhello.so hello.o

root@cheney:lib_test# ls

hello.c hello.h hello.o libmyhello.so main main.a_test main.c

root@cheney:lib_test# gcc -o main main.c -L. -lmyhello

root@cheney:lib_test# ls

hello.c hello.h hello.o libmyhello.so main main.a_test main.c

root@cheney:lib_test# ldd libmyhello.so

linux-gate.so.1 => (0xb7807000)

libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7691000)

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

root@cheney:lib_test# ldd main

linux-gate.so.1 => (0xb780e000)

libmyhello.so => not found

libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb769b000)

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

root@cheney:lib_test# ./main

./main: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

root@cheney:lib_test# mv libmyhello.so /lib/

root@cheney:lib_test# ldd main

linux-gate.so.1 => (0xb7821000)

libmyhello.so => /lib/libmyhello.so (0xb780e000)

libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb76ab000)

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

root@cheney:lib_test# ./main

hello everyone!

root@cheney:lib_test#

動態(tài)加載庫

-shared 該選項指定生成動態(tài)連接庫(讓連接器生成T類型的導出符號表,,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接,。相當于一個可執(zhí)行文件
-fPIC
:表示編譯為位置獨立的代碼,,不用此選項的話編譯后的代碼是位置相關的所以動態(tài)載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的,。
-L.
:表示要連接的庫在當前目錄中
-ltest
:編譯器查找動態(tài)連接庫時有隱含的命名規(guī)則,,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱

LD_LIBRARY_PATH:這個環(huán)境變量指示動態(tài)連接器可以裝載動態(tài)庫的路徑,。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多