Linux动态链接库的使用
动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。
针对二进制文件有用的命令
查看文件类型
file
查看二进制文件链接到哪些库
ldd
查看二进制文件里面所包含的symbol,T表示加载,U表示undefinedsymbol
nm
读二进制文件里面的信息
readelf-asmu.o
将二进制文件转换为汇编
objdump-dsum.o
动态链接库的生成
sum.c
#include#include intsum(intx){ inti,result=0; for(i=0;i<=x;i++){ result+=i; } if(x>100) exit(-1); returnresult; }; voiddisplay(char*msg){ printf("%s\n",msg); } intadd(floata,floatb){ returna+b; } intsum_array(intarray[],intnum){ inti=0,sum=0; for(i=0;i main.c
#include#include intmain(void){ intx; printf("Inputaninteger:\n"); scanf("%d",&x); printf("sum=%d\n",sum(x)); return0; }; 生成可执行文件
gcc-cmain.c-omain.o gcc-csum.c-osum.o gccsum.omain.o将会生成main的可执行文件
filemain//ELF64-bitLSBexecutable filesum.o//ELF64-bitLSBrelocatable因为sum.c里面含有可复用的函数,所以想把sum.c编译成为一个动态链接库
gccsum.o-shared-osum.so出现错误,提示
/usr/bin/ld:sum.o:relocationR_X86_64_PC32againstundefinedsymbol`exit@@GLIBC_2.2.5'cannotbeusedwhenmakingasharedobject;recompilewith-fPIC
/usr/bin/ld:finallinkfailed:Badvalue
collect2:error:ldreturned1exitstatus这说明不是所有的.o文件都能编译成为动态链接库,需要在.o文件生成时加参数-fPIC
gcc-csum.c-fPIC-osum.o gccsum.o-osharedsum.so一般,共享库的编译命令为(曾经的实验)
动态链接库
gcc-shared-fPIC-olibmyhello.sohello.o gcc-ohellomain.c-L.-lmyhello静态链接厍
arrcslibxx.axx.o g++-omainmain.cpp-static-L.-lxx这时候再
g++-omainmain.csum.so ./main有时会报错
errorwhileloadingsharedlibraries:sum.so:cannotopensharedobjectfile:Nosuchfileordirectory
lddmain output: sum.so=>notfound这时候需要
export$LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH注意:-fPIC是生成.o时使用,-shared是用来生成动态链接库的
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。