Call .so in Linux
来源:互联网 发布:淘宝真货店 编辑:程序博客网 时间:2024/06/03 23:08
linux下查看动态链接库so文件的依赖的相关组建
ldd *.so
如何在LINUX下查看一个.o文件里有哪些函数
nm *.o像window调用库文件一样,在linux下,也有相应的API因为加载库文件而存在。它们主要是以下几个函数:
dlopen
函数的对象文件中的函数的地址关闭目标文件。如果无需再调用共享对象的话,应用程序可以调用该方法来通知操作系统不再需要句柄和对象引用了。它完全是按引用来计数的,所以同一个共享对象的多个用户相互间不会发生冲突(只要还有一个用户在使用它,它就会待在内存中)。任何通过已关闭的对象的 dlsym
解析的符号都将不再可用
实例代码(soTest.c):
1 #include <stdio.h> 2 #include <dlfcn.h> 3 4 int main(int argc, char *argv[]){ 5 void * libm_handle = NULL; 6 float (*cosf_method)(float); 7 char *errorInfo; 8 float result; 9 10 // dlopen 函数还会自动解析共享库中的依赖项。这样,如果您打开了一个依赖于其他共享库的对象,它就会自动加载它们。11 // 函数返回一个句柄,该句柄用于后续的 API 调用12 libm_handle = dlopen("libm.so", RTLD_LAZY );13 // 如果返回 NULL 句柄,表示无法找到对象文件,过程结束。否则的话,将会得到对象的一个句柄,可以进一步询问对象14 if (!libm_handle){15 // 如果返回 NULL 句柄,通过dlerror方法可以取得无法访问对象的原因16 printf("Open Error:%s.\n",dlerror());17 return 0;18 }19 20 // 使用 dlsym 函数,尝试解析新打开的对象文件中的符号。您将会得到一个有效的指向该符号的指针,或者是得到一个 NULL 并返回一个错误21 cosf_method = dlsym(libm_handle,"cosf");22 errorInfo = dlerror();// 调用dlerror方法,返回错误信息的同时,内存中的错误信息被清空23 if (errorInfo != NULL){24 printf("Dlsym Error:%s.\n",errorInfo);25 return 0;26 }27 28 // 执行“cosf”方法29 result = (*cosf_method)(0.0);30 printf("result = %f.\n",result);31 32 // 调用 ELF 对象中的目标函数后,通过调用 dlclose 来关闭对它的访问33 dlclose(libm_handle);34 35 return 0;36 }
在这个例子中主要是调用了 math 库(libm.so)中的“cosf”函数,dlopen函数的第二个参数表示加载库文件的模式,主要有两种:RTLD_LAZY 暂缓决定,等有需要时再解出符号;RTLD_NOW 立即决定,返回前解除所有未决定的符号。另外记得引用包含API的头文件“#include <dlfcn.h>”(^_^)。
编译执行结果如下:
如果将代码12行中的库文件名改为一个不存在的库文件,运行后错误结果如下:
如果将代码21行中的函数名改为一个不存在的函数名,运行后错误结果如下:
本文主要简单讲述在linux下调用SO库文件的一些基本知识和注意点。
- Call .so in Linux
- System call in Linux
- the implementation of system call in linux
- Select system call limitation in Linux
- Init Call Mechanism in the Linux Kernel
- c call mysql in linux process
- system call, signal, exception in linux
- Init Call Mechanism in the Linux Kernel
- how to call c++ function in python coding in linux?
- get system call table in x86-64 Linux
- Adding a Custom System Call to Ubuntu Linux in [C]
- explicit call dynamic library in windows and linux platform
- get system call table in x86-64 Linux
- Sysenter Based System Call Mechanism in Linux 2.6
- get system call table in x86-64 Linux
- Sysenter Based System Call Mechanism in Linux 2.6
- Add a system call to the linux kernel in Ubuntu
- no libsigar-x86-linux.so in java.library.path
- This generally means that another instance of this process was already running or is hung in the deb
- unsafe指针
- Windows 7 下Nuthc二次开发笔记(二)——配置nutch-1.2
- 晚上An和CW都在呢
- Cache 的write back和write through
- Call .so in Linux
- C语言函数参数传递
- java 面试题(一) [模拟交通灯管理系统]
- Linux中通过locale来设置字符集
- 软件测试
- 数据结构之栈
- linux date时间戳互相转换
- JS中文本框获得焦点后,光标位置如何跳到文本末尾
- 网银“病毒”