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