非动态加载代码的类似 dlsym 的功能?
dlsym-like functionality for non-dynamically-loaded code?
我知道如何使用 dlsym()
查找由字符串键入的符号 - 当这些符号由我 dlopen()
编辑的共享库导出时。但是 - 其他代码呢?只是我静态链接的目标代码。是否有可能以某种方式查找符号?
备注:
- 如果有帮助,请对编译和链接过程做出任何合理的假设(例如哪个编译器、是否存在调试信息、PIC 代码等)
- 我对非 OS 特定的解决方案更感兴趣,但如果它很重要:Linux.
- 涉及功能预注册的解决方案不相关。或者更确切地说,也许是,但我宁愿避免这种情况。
您确实可以为此目的使用 dlsym()
。您只需将 所有 符号导出到动态符号 table。 Link 带有 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
$
我知道如何使用 dlsym()
查找由字符串键入的符号 - 当这些符号由我 dlopen()
编辑的共享库导出时。但是 - 其他代码呢?只是我静态链接的目标代码。是否有可能以某种方式查找符号?
备注:
- 如果有帮助,请对编译和链接过程做出任何合理的假设(例如哪个编译器、是否存在调试信息、PIC 代码等)
- 我对非 OS 特定的解决方案更感兴趣,但如果它很重要:Linux.
- 涉及功能预注册的解决方案不相关。或者更确切地说,也许是,但我宁愿避免这种情况。
您确实可以为此目的使用 dlsym()
。您只需将 所有 符号导出到动态符号 table。 Link 带有 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
$