2016-01-19 44 views
4

我知道如何使用dlsym()来查找由字符串键入的符号 - 当这些符号由共享库导出时,我已经使用dlopen() ed。但是 - 其他代码呢?只是静态链接的对象代码。有没有可能以某种方式查找符号?用于非动态加载代码的类似dlsym的功能?

注:

  • 如果有帮助,使有关编译和连接过程中的任何合理的假设(如该编译器,调试信息存在,PIC代码等)
  • 我感兴趣更多的是在非操作系统特定的解决方案中,但如果它很重要:Linux。
  • 涉及功能预注册的解决方案不相关。或者说,也许他们是,但我宁愿避免这种情况。

回答

3

你的确可以只使用dlsym()用于这一目的。你只需要所有符号导出到动态符号表。将该二进制与gcc -rdynamic链接。

例子:

#include <stdio.h> 
#include <dlfcn.h> 

void foo (void) { 
    puts("foo"); 
} 

int main (void) { 
    void (*foo)(void) = dlsym(NULL, "foo"); 
    foo(); 
    return 0; 
} 

编译:gcc -rdynamic -O2 dl.c -o dl -ldl

$ ./dl 
foo 
$ 
+0

这是真棒!谢谢......这不是gcc特定的,但是,对吧? – einpoklum

+0

嗯,这更多的是链接器的问题。当'-rdynamic'被指定时,gcc只会将'-export-dynamic'传递给'ld'。任何ELF连接器都应该以这种或那种方式支持它。如果二进制格式不知道符号表或类似的结构,它当然不起作用。 – Ctx

+1

请注意,如果链接静态库,则通过此方法可访问的库中的唯一符号将是由可执行文件中实际链接的对象文件导出的符号。 – chqrlie