深入理解计算机系统-----动态链接

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
#include
#include
#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;

}

        

你可能感兴趣的:(【CSAPP】)