c++ - 用于预填充运行时使用的对象的 ELF INIT 部分代码

标签 c++ gcc assembly elf dynamic-linking

我是 c++ 的新手,非常想了解更多。读了很多书。最近发现了 init/fini elf 部分。 我开始想知道是否以及如何使用 init 部分来预填充将在运行时使用的对象。比如说你想要 将性能测量添加到您的代码中,记录时间、文件名、行号,也许还有一些 ID(对于 ex 是单调递增的 int)或名称。 你会放置例如:

PROBE(0,"EventProcessing",__FILE__,__LINE__)
...... //process event
PROBE(1,"EventProcessing",__FILE__,__LINE__)
......//different processing on same event
PROBE(2,"EventProcessing",__FILE__,__LINE__)

PROBE 可以是一些宏,它填充包含此数据的结构(可能在数组/列表等上使用 id 作为索引器)。 是否可以在 init 部分中使用代码为每个 PROBE 预填充所有这些数据(当然时间除外),以便在运行时只需要检索/复制时间?

据我所知__attribute__((constructor))不能应用于成员函数?

我最初的想法是创建某种 每个节点指向每个探测器的链表和初始化部分中的代码可以迭代它填充 id、文件、行等,但是 这个想法假设我可以使用一个可以在“init”部分运行的成员函数,但这似乎是不可能的。任何提示表示赞赏!

最佳答案

据我了解,这里实际上不需要 ELF 构造函数。相反,您可以使用 extended asm statements 为您的探测器发出描述符。 (使用数据,而不是代码)。这还涉及切换到用于探测描述符的专用 ELF 部分,比如 __probes

链接器会将所有探针连接到一个数组中,并生成特殊符号 __start___probes__stop___probes,您可以在程序中使用它们来访问这些探针。请参阅 Input Section Example 中的最后一段.

Systemtap为其用户空间探测器实现了一些非常相似的东西:

Linux 内核中也使用了类似的结构来实现其 self 修补机制。

关于c++ - 用于预填充运行时使用的对象的 ELF INIT 部分代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51523530/

相关文章:

c++ - GLSL - 给定顶点法线计算表面法线

c++ - 将函数中的排序数字写入文本文件?

c++ - 在新版本的 gcc 上返回隐式不可复制结构的 std::map 时出现编译错误

c++ - gcc 或 makefile 是否有一种机制可以描述源文件的包含文件以替换 #include "xxxx.h"?

c++ - 未推断出尾随类模板参数

assembly - 这个汇编程序如何打印 "Hello World"?

c++ - 将 QGyroscopeReading 转换为 QVector3D 的正确方法是什么?

c++ - 为什么我的修剪功能不起作用?

c - 鼠标初始化后如何从端口 60h 提取 3 或 4 字节鼠标数据包

assembly 新手请求帮助 : signed integer division + "truncating to an integer"