shared library

发布时间:2026/5/23 17:49:03

shared library 原文、shared librarycompatible vs incompatiblecompatible library函数的工作场景没有变化所有的函数对全局变量和返回参数产生相同的影响所有的函数继续返回相同的结果值提升性能 fix bugs没有api 被删除可以有新的api加入export 的结构体没有变化违反以上各条的library 都是incompatiblelibrary verison and naming如果新版本的库与老版本的库是兼容的我们需要修改minor version number如果新版本的库与老版本的库是不兼容的我们需要修改major version numberreal namereal name 是有库代码的文件的名字format: libxxxx.so.major-id.minor-idmajor-id : 是不断递增的数字 用来标记不兼容的库minor-id: 用来区分在相同major-id下不同的但是兼容的子版本库通常情况下子版本号可以是一个数字或者用点分隔开的两个数字第一个表示子版本号第二个表示patch level 或者 revision numberlibdemo.so.1.0.1 libdemo.so.1.0.2 libdemo.so.2.0.1 libreadline.so.4.0sonameformat : libname.so.major-idsoname 与realname 有相同的major-id 但没有子版本号运行时加载只是依赖于主版本号soname 是符号链接指向有最近子版本号的库我们可以更改符号链接到最新版本的库不同主版本号的库可以共存可执行程序通过记录他的soname 即可samplelibdemo.so.1-libdemo.so.1.0.2libdemo.so.2-libdemo.so.2.0.1libreadline.so.4-libreadline.so.4.0在创建动态链接库的时候可以给ld 传-sonamename这个参数来指定库的soname,在链接的时候NEEDED中记录的就是soname.linker nameformat: libname.so目标是能够提供一种版本独立的链接命令它可以自动选择正确版本的库。创建符号链接指向realname或者soname动态加载库dlopen api:Four key functions: dlopen(), dlerror(), dlsym(), and dlclose()./* Usage: dynload lib-path func-name */#includestdio.h#includestdlib.h#includedlfcn.hintmain(intargc,char*argv[]){void*libHandle;/* Handle for shared library */void(*funcp)(void);/* Pointer to function with no args */char*err;if(argc!3){/* Check command line arguments */fprintf(stderr,Usage: %s lib-path func-name\n,argv[0]);exit(EXIT_FAILURE);}/* if *//* Load the shared library and get a handle for later use */libHandledlopen(argv[1],RTLD_NOW);if(libHandleNULL){fprintf(stderr,Error on dlopen: %s\n,dlerror());exit(EXIT_FAILURE);}/* if *//* Get a pointer to named function inside library */(void)dlerror();/* Clear dlerror() *//* The strange cast below is required by C99, which forbids assignment between a function pointer and void * */*(void**)(funcp)dlsym(libHandle,argv[2]);errdlerror();if(err!NULL){/* Non-NULL from dlerror() means we got error */fprintf(stderr,Error on dlsym: %s\n,err);exit(EXIT_FAILURE);}/* if *//* If the function address is non-NULL try calling it */if(funcpNULL)printf(%s is NULL\n,argv[2]);else(*funcp)();/* And close the library */dlclose(libHandle);exit(EXIT_SUCCESS);}/* main */

相关新闻