我们经常在游戏目录下看见dll文件,这是windows下的动态链接库。在linux下我们可以使用-shared -fpic生成so文件。
动态链接的好处在于,当我们需要变更函数实现时,不需要重新编译整个可运行文件,只需要修改动态链接库即可,所以破解游戏的时候通常补丁就是一个dll而已。快忘光了,写个随笔复习一下,大一知识简单勿怪。
下面这个是函数调用原理,如果是变量的话直接获得地址就好。
初次调用,惰性加载
后续调用,直接跳转
#include <dlfcn.h>
void *dlopen(const char *filename, int flag) ;
returns: ptr to handle if OK, NULL on error
void *dlsym(void *handle, char *symbol) ;
returns: ptr to symbol if OK, NULL on error
int dlclose(void *handle) ;
returns: 0 if OK, -1 on error
const char dlerror(void) ;
returns: errormsg if previous call to
dlopen, dlysym, or dlclose failed,
NULL if previous call was OK
dlopen为mmap+解析符号表
dpsym从符号表中寻址函数、变量
dlclose减少mmap引用计数,为0后munmap
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int
main(int argc, char **argv)
{
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen("libm.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror();
*(void **) (&cosine) = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
printf("%f\n", (*cosine)(2.0));
dlclose(handle);
exit(EXIT_SUCCESS);
}