Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / so 库加载 __attribute__((constructor))

动态库生成:gcc -Wall -shared -fPIC -o libss.so libss.c // 库名和源文件自定义动态加载:#include <dlfcn.h>void *dlopen(const char *filename, int flag); // filename 动态库名(如libss.so),flag为 RTLD_NOW 或 RTLD_LAZY,RTLD_NOW 库中的所有函数在dlopen返回前都加载,// RTLD_LAZY 库中的函数在用时才加载char *dlerror(void);  // dlopen dlsym dlclose的执行若有错误,返回描述错误的字符串void *dlsym(void *handle, const char *symbol); //返回函数指针int dlclose(void *handle); // 卸载库Link with -ldl.例:udlopen.c#include <stdio.h>
#include <string.h>
#include <dlfcn.h>int main(int argc, char **argv)
{
 void (*print)();
 int (*add)(int, int);
 void *handle;
 
 if (argc < 2)
  return -1;
 
 handle = dlopen(argv[1], RTLD_LAZY);
 if (!handle) {
  printf("dlopen failed: %s ", dlerror());
  return -1;
 }
 
 print = dlsym(handle, "print");
 if (!print) {
  printf("dlsym failed: %s ", dlerror());
  return -1;
 }
 print();
 
 add = dlsym(handle, "add");
 if (!add) {
  printf("dlsym failed: %s ", dlerror());
  return -1;
 }
 add(1, 2);
 
 dlclose(handle);
 
 return 0;
}libss.c #include <stdio.h>
#include <string.h>void print()
{
 printf("I am print ");
}int add(int a, int b)
{
 printf("Sum %d and %d is %d ", a, b, a + b);
 return 0;
}
//static void king() __attribute__((constructor(101))); the following is also right
static __attribute__((constructor(101))) void king()
{
 printf("I am king ");
}编译执行
 gcc -Wall -shared -fPIC -o libss.so libss.c -ldl
gcc -Wall -o udlopen udlopen.c
 
./udlopen libss.so
 
I am king
 I am print
 Sum 1 and 2 is 3