深入理解计算机系统-----动态链接
1、建立C文件,构造共享库。
前面和静态链接一样。(https://blog.csdn.net/zl6481033/article/details/85340096)。

-fpic 选项指示编译器生成与位置无关的代码,-shared 选项指示链接器创建一个共享的目标文件。一旦创建了这个库就可以链接到程序中。
2、链接,创建可执行文件。
这样就创建了一个可执行文件,文件的形式使它在运行时可以和libvector.so链接。基本思路是,当创建可执行文件时,静态执行一些链接,然后再程序加载时动态完成链接过程。
动态链接器通过执行下面的重定位完成链接任务:重定位libc.so的文本和数据到某个内存段,重定位libvector.so的文本和数据到另一个内存段,重定位prog21中所有对lib.so和libvector.so定义的符号的引用。
最后,动态链接器将控制传递给应用程序。从这个时刻开始,共享库的位置就固定了并且在程序执行过程中不会改变。
3、运行时动态链接
#include<stdio.h>
#include<stdlib.h>
#include<dlfcn.h>
#include"vector.h"
int x[2]={1,2};
int y[2]={3,4};
int z[2];
int main()
{
void *handle;
void (*addvec)(int *,int *,int *,int );
char *error;
//运行时载入动态库
handle=dlopen("./libvector.so",RTLD_LAZY);
if(!handle){
fprintf(stderr,"%s\n",dlerror());
exit(1);
}
//函数指针
addvec=dlsym(handle,"addevc");
if((error=dlerrpr())!=NULL){
fprintf(stderr,"%s\n,"dlerror());
exit(1);
}
//调用
addvec(x,y,z,2);
printf("z=[%d %d]\n",z[0],z[1]);
if(dlclose(handle)<0){
fprintf(stderr,"%s\n",dlerror());
exit(1);
}
return 0;
}

浙公网安备 33010602011771号