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

时间:2018-11-19 04:46:14

标签: c linux caching assembly shared-libraries

我创建了一个名为libSum.so的共享库,并创建了两个c文件名file1.c和file2.c,并在两个c文件中都使用了libsum。 libsum.so内部有一个“ sum”函数,该函数正在执行加法运算。使用调试器,我得到了sum函数的汇编指令的地址。现在,我想从我的c代码中读取此地址。 我如何访问该地址?

1 个答案:

答案 0 :(得分:2)

如果函数具有外部链接并且是库公共的,则在表达式中使用函数名称将得到函数的地址。

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

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

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

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

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));