Linux下動態鏈結庫的生成與使用

2021-09-28 22:04:38 字數 4683 閱讀 3262

動態鏈結庫是一種不可以直接執行的二進位制程式檔案,它允許程式共享執行一段公用的**和資源。 在 linux 平台上動態鏈結庫是以 .so 作為字尾名的。

相對於靜態鏈結庫來說,動態鏈結庫在編譯的時候並沒有被編譯進目標**中,直到程式在執行到動態鏈結庫中的相關函式的時候,才會呼叫動態鏈結庫中的函式執行,因此使用動態鏈結庫所生成的可執行檔案比較小。正是由於動態鏈結庫沒有被直接編譯到可執行檔案中,因此動態鏈結庫中的函式具體實現的變化並不影響可執行檔案,因此使用動態鏈結庫進行軟體公升級比較方便。

linux下動態鏈結庫的命令以lib***.so方式進行命名,庫名的前面加上lib,庫名字尾為.so

這裡以使用 md5 模組生成 md5 碼的工程為例,介紹動態鏈結庫的生成與使用。

#include

#include

#include

"md5.h"

intmain()

printf

("\n");

return0;

}

#include

#include

"md5.h"

unsigned

char padding=

;void

md5init

(md5_ctx *context)

void

md5update

(md5_ctx *context,

unsigned

char

*input,

unsigned

int inputlen)

else

memcpy

(&context->buffer[index]

,&input[i]

,inputlen-i);}

void

md5final

(md5_ctx *context,

unsigned

char digest[16]

)void

md5encode

(unsigned

char

*output,

unsigned

int*input,

unsigned

int len)

}void

md5decode

(unsigned

int*output,

unsigned

char

*input,

unsigned

int len)

}void

md5transform

(unsigned

int state[4]

,unsigned

char block[64]

)

#ifndef md5_h

#define md5_h

typedef

struct

md5_ctx;

#define f(x,y,z) ((x & y) | (~x & z))

#define g(x,y,z) ((x & z) | (y & ~z))

#define h(x,y,z) (x^y^z)

#define i(x,y,z) (y ^ (x | ~z))

#define rotate_left(x,n) ((x << n) | (x >> (32-n)))

#define ff(a,b,c,d,x,s,ac) \

#define gg(a,b,c,d,x,s,ac) \

#define hh(a,b,c,d,x,s,ac) \

#define ii(a,b,c,d,x,s,ac) \

void

md5init

(md5_ctx *context)

;void

md5update

(md5_ctx *context,

unsigned

char

*input,

unsigned

int inputlen)

;void

md5final

(md5_ctx *context,

unsigned

char digest[16]

);void

md5transform

(unsigned

int state[4]

,unsigned

char block[64]

);void

md5encode

(unsigned

char

*output,

unsigned

int*input,

unsigned

int len)

;void

md5decode

(unsigned

int*output,

unsigned

char

*input,

unsigned

int len)

;#endif

gcc -o sotest testmain.c md5.c
/home/libsotest# gcc -fpic -shared -o libmd5.so md5.c

/home/libsotest# ls

libmd5.so md5.c md5.h sotest testmain.c

ldd 介紹

ldd是list, dynamic, dependencies的縮寫。

使用 ldd 命令可以檢視乙個可執行檔案所鏈結的動態鏈結庫。

/home/libsotest#gcc -o testsomain testmain.c -l. libmd5.so

/home/libsotest# ldd testsomain

linux-vdso.so.1 (0x00007fffdafd6000)

libmd5.so =

> not found

libc.so.6 =

> /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9ca5164000)

/lib64/ld-linux-x86-64.so.2 (0x00007f9ca5757000)

/home/libsotest# cp libmd5.so /lib/

/home/libsotest# ldd testsomain

linux-vdso.so.1 (0x00007ffec20fe000)

libmd5.so =

> /lib/libmd5.so (0x00007f86a08b2000)

libc.so.6 =

> /lib/x86_64-linux-gnu/libc.so.6 (0x00007f86a04c1000)

/lib64/ld-linux-x86-64.so.2 (0x00007f86a0cb8000)

/home/libsotest# ./testsomain

please input a string ,the string length must <100

tes***5

str :tes***5

加密前:tes***5

加密後:

32269ae63a25306bb46a03d6f38bd2b7

下面介紹一下如何在 makefile 中生成動態鏈結庫檔案。

cc = gcc

rm = rm -f

target = testsomain

objs = md5.o testmain.o

md5obj = md5.o

libs = libmd5.so

all:$(objs)

$(cc) -o $(target) $(objs)

dynamic:$(libs)

clean:

$(rm) $(target) $(objs) $(libs)

$(libs):$(md5obj)

$(cc) -shared -fpic -o $@ $^

%.o:%.c

$(cc) -c -fpic $^ -o $@

cc = gcc

rm = rm -f

target = testsomain

objs = md5.o testmain.o

md5obj = md5.o

libs = libmd5.so

all:$(objs)

$(cc) -o $(target) $(objs)

dymtarget:$(libs)

$(cc) -o $(target) testmain.c -l. $^

dynamic:$(libs)

clean:

$(rm) $(target) $(objs) $(libs)

$(libs):$(md5obj)

$(cc) -shared -fpic -o $@ $^

%.o:%.c

$(cc) -c -fpic $^ -o $@

linux生成動態鏈結庫

步驟 1 建立動態鏈結庫 建立caculate.c caculate.h兩個檔案 編譯生成libcac.so檔案 gcc shared fpic caculate.c o libcac.so 2 建立測試程式 建立 main.pc檔案 編譯生成可執行檔案 gcc main.c o main l lc...

Linux下的動態鏈結庫與靜態鏈結庫的生成與使用

1 靜態鏈結庫的生成 靜態鏈結庫實際上是.o檔案乙個集合,因此只需要使用ar命令來將這些.o檔案合併就行了 比如ar rc test.a o那就是生成乙個叫test.a的靜態庫檔案 2 動態鏈結庫的生成 編譯時就需要指定引數 fpic shared引數 3 靜態鏈結庫的使用 靜態鏈結庫使用跟.o檔案...

Linux下的動態鏈結庫與靜態鏈結庫的生成與使用

1 靜態鏈結庫的生成 靜態鏈結庫實際上是.o檔案乙個集合,因此只需要使用ar命令來將這些.o檔案合併就行了 比如ar rc test.a o那就是生成乙個叫test.a的靜態庫檔案 2 動態鏈結庫的生成 編譯時就需要指定引數 fpic shared引數 3 靜態鏈結庫的使用 靜態鏈結庫使用跟.o檔案...