当前位置: 首页 > 编程笔记 >

C语言从代码中加载动态链接库过程解析

杜烨伟
2023-03-14
本文向大家介绍C语言从代码中加载动态链接库过程解析,包括了C语言从代码中加载动态链接库过程解析的使用技巧和注意事项,需要的朋友参考一下

这篇文章主要介绍了C语言从代码中加载动态链接库过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

函数:void *dlopen(const char *filename, int flag);

功能:打开动态链接库文件

参数:filename 动态链接库文件名

flag 打开方式,一般为RTLD_LASY

返回值:库指针

函数:char *dlerror(void);

功能:获取错误值

返回值:错误值

函数:void *dlsym(void *handle, const char *symbol);

功能:获取动态链接库中指定函数的指针

参数:handle 库指针

symbol 函数名称

返回值:与参数symbol名称对应的函数的指针

函数:int dlclose(void *handle);

功能:关闭动态链接库文件

参数:库指针

返回值:

源码

/*main.c*/
#include <dlfcn.h>// 相关函数头文件
#include <stdio.h>
 
int main(void)
{
  const char *src = "Hello Dymatic";
  int (*pStrLen)(const char *);// 函数指针
  void *pHandle = NULL;// 库指针
  char *pErr = NULL;// 错误指针
   
  // 打开动态链接库并检查是否有错误发生
  pHandle = dlopen("./libstr.so“, RTLD_LASY);
  pErr = dlerror();
  if(!pHandle || pErr != NULL){printf("Failed load library!\n%s\n", pErr);return -1;}
   
  // 获取StrLen函数地址并检查是否有错误发生
  pStrLen = dlsym(pHandle, "StrLen");
  pErr = dlerror();
  if(!pStrLen || pErr == NULL){printf("%s\n", pErr);return -1;}
   
  // 调用StrLen函数
  printf("The string length is:%d\n", pStrLen(src));
   
  // 关闭库文件
  dlclose(pHandle);
  return 0;
]

运行以下命令编译成可执行文件。-L./ 当前目录,-lstr为StrLen函数所在库文件,-ldl为dlopen等相关函数所在库文件

gcc -o test main.c -L./ -lstr -ldl

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 在Postgresql版本10中创建扩展时出错 无法加载库"C:/Program Files/PostgreSQL/10/lib/plpython3.dll":找不到指定的模块 注意:在窗口10上使用Postgresql 10

  • 本文向大家介绍C语言中的链接编写教程,包括了C语言中的链接编写教程的使用技巧和注意事项,需要的朋友参考一下 链接   链接就是将不同部分的代码和数据收集和组合成为一个单一文件的过程,这个文件可被加载或拷贝到存储器执行.   链接可以执行与编译时(源代码被翻译成机器代码时),也可以执行与加载时(在程序被加载器加载到存储器并执行时),甚至执行与运行时,由应用程序来执行.在现代系统中,链接是由链接器自动

  • 问题内容: 我在fedora 116上使用gcc / g ++,我的想法是: c ++动态库B是第三方提供的,我无法对其进行修改。 当用链接c 动态库B组合c 动态库A时,A可以在B中找到符号。但是当我使用’dlsym’在A代码中加载B函数(不链接)时,A告诉我 ============================ 使用nm -DC 错误报告: 库A中的代码: 在库A中,它可以使用dlopen

  • 问题内容: 我正在编写一个程序,该程序从文件中加载并执行代码。但是我有一个问题:“写”系统调用不起作用。代码成功加载并执行,但在屏幕上不显示任何文本。 加载代码的程序: 我试图通过此程序(test.s)执行的代码: 这是我的编译方式: 解决了 ,感谢@Christoph 有工作代码: 问题答案: 您的方法行不通:shellcode必须与位置无关,但是您的代码引用的是绝对地址。无条件跳转也可以是相对

  • 动态链接库(也称为DLL)是Microsoft Windows最重要的组成要素之一。大多数与Windows相关的磁盘文件如果不是程序模块,就是动态链接程序。迄今为止,我们都是在开发Windows应用程序;现在是尝试编写动态链接库的时候了。许多您已经学会的编写应用程序的规则同样适用于编写这些动态链接库模块,但也有一些重要的不同。 动态链接库的基本知识 正如前面所看到的,Windows应用程序是一个可

  • 问题 你想在C中安全的执行某个Python调用并返回结果给C。 例如,你想在C语言中使用某个Python函数作为一个回调。 解决方案 在C语言中调用Python非常简单,不过设计到一些小窍门。 下面的C代码告诉你怎样安全的调用: #include <Python.h> /* Execute func(x,y) in the Python interpreter. The argument