c - 如何使用库从文件访问共享库中提到的指令的地址?

标签 c linux caching assembly shared-libraries

我创建了一个名为 libSum.so 的共享库和两个名为 file1.c 和 file2.c 的 c 文件,并在这两个 c 文件中使用了 libsum。 libsum.so 中有一个“求和”函数,它正在做加法运算。使用调试器我得到了 sum 函数的汇编指令的地址。现在我想从我的 C 代码中读取这个地址。 我怎样才能访问这个地址?

最佳答案

如果函数具有外部链接并且对库公开,则在表达式中使用函数的名称将导致函数的地址。

如果该函数具有外部链接但对库是私有(private)的,您可以尝试将您自己的对象添加到库中,并且您的代码将返回库函数的地址。

如果函数是静态的,则没有标准方法,除非函数地址恰好存储在外部可见的变量中。一些各种 hackish 方式:

  • 如果您需要调用该函数,您只需创建您的实现即可。如果文件源对您可用,并且软件许可证允许,您可以简单地创建一个仅包含该函数的新库。
  • 如果您愿意重新编译原始库本身,您可以定义一个具有外部链接的函数,可以为您返回函数的地址。
  • 如果您可以在调用函数时引发信号(例如,浮点异常或段错误),则可以尝试通过从信号处理程序中向后扫描调用堆栈来捕获函数的地址.

以上建议假设你的程序已经链接到库中。如果您的程序打算从尚未链接到您的程序的库中调用函数,那么您可能会询问动态链接。同样,该函数需要具有外部链接并对库公开。只要是这样,在 POSIX 系统(Linux 是)上,您可以调用 dlopen 来打开共享库,并调用 dlsym 来解析公共(public)符号的地址在图书馆内。

void *handle = dlopen("libSum.so", RTLD_LAZY);
void *sym = dlsym(handle, "sum");
void (*sum)();
_Static_assert(sizeof sym == sizeof sum);
memcpy(&sum, &sym, sizeof(sum));

关于c - 如何使用库从文件访问共享库中提到的指令的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53368454/

相关文章:

javascript - 以下可缓存资源的新鲜度生命周期很短 - Google 字体

android - 使用 ETag 的 Volley 缓存

c++ - 获取所有已使用来源的列表

c - linux内核一步一步

linux - 使用Openssl读取多个证书

linux - MATE 命令小程序 - 显示 '#' 而不是输出

caching - Varnish 4 VCL- strip 定义的查询字符串参数

c - 如何使用指针数组打印结构实体?

c - void 影响程序的输出

c - 随机数发生器产生相同的随机数