linux下编写dll
插件的想法是Internet浏览器用户熟悉的。 插件是从Web下载的,通常会在浏览器中提供对音频,视频和特殊效果的增强支持。 通常,插件无需更改原始应用程序即可为现有应用程序提供新功能。
DLL是在设计和构建应用程序时已知的程序功能。 应用程序的主程序设计有框架或底板,可以选择在运行时加载所需的dll,而这些dll位于与磁盘上的主应用程序不同的文件中。 这种打包和动态加载提供了灵活的升级,维护和许可策略。
Linux附带了成千上万的命令和应用程序,这些命令和应用程序至少都需要libc库功能。 如果libc函数与所有程序打包在一起,则相同函数的数千个副本将在磁盘上。 Linux不会浪费磁盘空间,而是构建这些应用程序以使用通常需要的系统库的单个系统范围的副本。 Linux更进一步。 每个需要通用系统库功能的进程都使用单个系统范围的副本,该副本一次加载到内存中并共享。
在Linux中,插件和dll被实现为动态库。 本文的其余部分是在应用程序运行后使用动态库更改应用程序的示例。
Linux动态链接
Linux中的应用程序通过以下两种方式之一链接到外部函数: 在构建时静态链接 ,使用静态库( lib*.a
)并将库代码包含在应用程序的可执行文件中,或在运行时通过共享的方式动态链接库( lib*.so
)。 动态库由动态链接加载程序映射到应用程序执行内存中。 在启动应用程序之前,动态链接加载程序将所需的共享库映射到应用程序的内存中,或者使用系统共享库,并为应用程序解析所需的外部引用。 现在,该应用程序可以运行了。
例如,下面是一个小程序,它演示了Linux中动态库的默认用法:
main()
{
printf("Hello world
");
}
使用gcc hello.c编译时,将创建一个名为a.out
的可执行文件。 使用Linux命令ldd a.out
,它显示共享库依赖关系,所需的共享库为:
libc.so.6 => /lib/libc.so.6 (0x4001d000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
运行后,同一动态链接加载器用于将dll映射到应用程序的内存中。 该应用程序控制使用Linux动态加载程序例程加载哪些动态库以及在库中调用哪些功能,以执行加载和链接并返回所需入口点的地址。
Linux dll功能
Linux提供了四个库函数( dlopen
, dlerror
, dlsym
, dlclose
),一个包含文件( dlfcn.h
)和两个共享库(静态library libdl.a
和动态library libdl.so
)来支持动态链接加载程序。 库函数是:
- dlopen打开并将共享对象文件映射到内存中,并返回一个句柄
- dlsym返回指向所请求入口点的指针
- dlerror返回NULL或指向描述最新错误的ASCII字符串的指针
- dlclose关闭句柄并取消映射共享对象
动态链接加载程序例程dlopen需要在文件系统中找到共享对