一、实验目标
了解和掌握静态链接、动态链接以及动态加载之间的区别
一、实验内容
1.思路
利用例子代码,生成静态库文件
利用例子代码,生成动态库文件
利用 VIM 编辑器,编写例子代码,查看运行结果,并加以确认分析
利用动态加载方式,重新编写程序
确认和查看静态链接、动态链接、动态加载时的内存使用
2.代码
//bill.c
#include <stdio.h>
void bill(char* arg)
{
printf("bill:you passed %s\n", arg);
}
//dloading.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
void main(void)
{
void * plib;
typedef void (*FUN_HELLO)();
FUN_HELLO funHello = NULL;
printf("Before loading dynamic library\n");
printf("Please enter to continue:");
getchar();
plib = dlopen("./libtest.so", RTLD_NOW| RTLD_GLOBAL);
if (plib == NULL)
printf("error\n");
funHello = dlsym(plib, "printHello");
funHello();
dlclose(plib);
printf("After release dynmic library\n");
printf("Please enter to continue:");
getchar();
}
//fred.c
#include <stdio.h>
void fred(int arg)
{
printf("fred: you passed %d\n", arg);
}
//lib.h
// This is lib.h. It declares the functions fred and bill for users
void bill(char *);
void fred(int);
//libtest.c
#include <stdio.h>
void printHello()
{
printf("After load dynamic library\n");
printf("Please enter to continue:");
getchar();
}
//main.c
#include "lib.h"
#include <stdio.h>
#include <stdlib.h>
int main()
{
bill("Hello World!");
exit(0);
}
3.过程及实验结果展示
·静态库
编译生成目标文件,并把目标文件打包成静态库
通过链接静态库生成可执行文件(静态链接)
运行可执行文件,并确认生成的可运行文件的文件大小
利用目标文件生成可运行文件(无连接运行)
运行可执行文件,并确认生成的可执行文件的文件大小
·动态库
编译生成目标文件,并把目标文件打包成动态库,出现错误提示:
把生成的 libfoo.so 文件复制到 /usr/lib 目录下,再重新运行
动态加载前内存使用情况:
动态加载
动态加载后内存使用情况(可以比较dlmain,dloading,slmain三者大小):
三、实验结论
1.利用ar crv 命令将bill.o和fred.o集成到libfoo.a文件里面,ranlib命令给libfoo.a建立索引,对里面的函数定义一个目录,方便编译。
2.利用 gcc -c fPIC和 gcc -shared-o libfoo.so建立一个可共享的动态库,利用-L ./ -lfoo来链接动态库。
3.动态链接需要把创建的libfoo.so文件复制到 /usr/lib目录下。
4.动态链接是系统做的,动态加载是程序员控制的
5.文件大小:静态链接>动态链接>动态加载