一 动态加载
什么是动态加载.按需加载.程序在执行的时候,需要使用到动态库里的函数的时候,程序调用动态链接器提供的API,请求动态链接器将需要的动态库加载到内存.
dlopen(3) dlclose(3) dlerror(3) dlsysm(3)
#include <dlfcn.h>
void *dlopen(const char *filename, int flags);
功能:打开一个共享库文件
参数:
filename:指定了动态库文件的名字
flags:
RTLD_LAZY 代码使用到这个库函数的时候,才解析了
RTLD_NOW 立即加载 函数返回前已经被解析了
返回值:
NULL 函数调用失败
not NULL 函数调用成功
如果出现错误 可以使用dlerror(3)获取诊断信息
int dlclose(void *handle);
功能:加载的动态库的引用计数减1.如果引用计数减到0,从系统中移除这个动态库
参数:
handle dlopen(3)的返回值
返回值:
成功 0
错误 非0
如果出现错误 可以使用dlerror(3)获取诊断信息
Link with -ldl.
举例说明 动态加载库函数 libpmath.so
代码参见 dynamic.c
#include <dlfcn.h>
char *dlerror(void);
功能:获取动态链接器的API的错误信息
参数:
返回值:
NULL 代表没有错误信息
返回一个字符串的首地址.这个字符串描述了最近一次调用动态链接器的API
#include <dlfcn.h>
void *dlsym(void *handle, const char *symbol);
功能:获取一个符号的地址(函数的名字 全局变量的名字 静态的局部变量的名字)
参数:
handle:指定共享对象的地址.dlopen(3)的返回值
symbol:指定具体的函数的名字
返回值:
成功 返回函数的入口地址
失败 NULL 可以使用dlerror(3)获取错误信息
二 程序中的错误处理
系统维护着一个全局变量,整型的.
errno.库函数和系统调用产生错误的时候,会设置这个变量值.错误码.
#include <errno.h>
需要 根据错误的编号,找到描述错误的原因.
举例说明 文件的操作 代码参见 file.c
strerror(3)
#include <string.h>
char *strerror(int errnum);
功能:获取错误编号对应的错误描述信息
参数:
errnum:错误的编号.就是获取这个错误编号对应的错误描述信息
返回值:
返回一个字符串的首地址.描述错误编号的信息
找不到错误编号,返回"Unknown error nnn"
perror(3)
#include <stdio.h>
void perror(const char *s);
功能:输出一条错误消息
参数:
s:用户指定的字符串
返回值:
标准输入 FILE *stdin 键盘
标准输出 FILE *stdout 显示器
标准错误输出 FILE *stderr 显示器
三 内存管理
什么是内存?
ROM RAM
CS DS SS ES
虚拟地址 物理地址
页 页表 页框 4k
代码区域 数据区域 栈区域
代码段 数据段 栈段