目标
我想解析链接到我的二进制文件(不是共享库)特定部分的所有符号的签名。
我做了什么
在汇编中,您可以定义一个section .example
(NASM 语法),然后使用以下方法将其链接到我的二进制文件中的特定位置:
exampleStart = .;
*(.example)
exampleEnd = .;
这允许我使用 exampleStart
和 exampleEnd
遍历所有符号,只要我知道它们是什么。例如,如果我知道所有符号都是不需要参数且不返回任何内容的方法,我可以将它们转换为 void(*)()
并将它们作为方法调用。
问题
- 有没有一种方法可以在 C++ 中定义部分,类似于 NASM 中的
.section
语法? - 我可以告诉链接器创建类似符号表的东西,它还包含方法的签名吗?
一个例子
在下面我想展示一个我想要实现的小例子(伪 C++):
SECTION example
void somePrefix_myFunction() {
// ...
}
int somePrefix_anotherFunction(int a, int b) {
return a + b;
}
ENDSECTION
然后我希望能够在其他地方迭代此部分中的符号并获取符号的位置和签名。
最佳答案
假设说 binary 是指可执行文件,您通常无法从 linux1 上的可执行文件加载符号 - 必须编写 C++ 代码或重构为(共享)库。然后你就可以调用dlopen
和dlsym
来加载相关符号。
剩下的问题是如何定位这些符号?当您从汇编转移到 C++ 时,并且您的问题被标记为这样,您将对符号编码作为汇编标签的大部分控制权交给了编译器和链接器。例如,您将不得不考虑诸如 C++ 名称修改之类的事情。枚举名称的最佳方法是调用 nm
列出所有符号并解析输出以提取您感兴趣的符号名称 - 据我所知,没有 nm
调用,您也可以调用自己。否则您将不得不考虑太多特定的文件格式知识,以枚举 linux 上不同版本的链接器和可执行文件的符号。
编辑。您表示 nm
不是一个选项。鉴于此限制,我认为您将不得不求助于手动维护交易品种列表。否则,您实际上是在复制 do_lookup
的内容。在遍历链接映射时在 glibc 中执行。
另外请注意,您可能必须使用 extern "C"
标记您的符号,以避免名称混淆,并能够理智地维护所讨论的符号列表。
<子> 1 除了 PIE 可执行文件的特殊情况。
关于c++ - 遍历特定部分中的所有符号并获取它们的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22168987/