動態鏈結庫是一種不可以直接執行的二進位制程式檔案,它允許程式共享執行一段公用的**和資源。 在 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檔案...