c - 如何获取自定义 ELF 部分的开始和结束地址?

标签 c gcc elf

我在 Linux 上使用 C 语言工作。我看过 gcc __section__ attribute 的用法(尤其是在 Linux 内核中)将数据(通常是函数指针)收集到自定义 ELF 部分中。如何检索和使用放置在这些自定义部分中的“内容”?

最佳答案

只要节名称产生有效的 C 变量名称,gcc(ld,而是)生成两个魔法变量:__start_SECTION__stop_SECTION。这些可用于检索部分的开始和结束地址,如下所示:

/**
 * Assuming you've tagged some stuff earlier with:
 * __attribute((__section__("my_custom_section")))
 */

struct thing *iter = &__start_my_custom_section;

for ( ; iter < &__stop_my_custom_section; ++iter) {
    /* do something with *iter */
}

我找不到任何关于此功能的正式文档,只有一些晦涩的邮件列表引用。如果您知道文档在哪里,请发表评论!

如果您使用自己的链接描述文件(就像 Linux 内核那样),您必须自己添加魔术变量(参见 vmlinux.lds.[Sh]this SO answer) .

参见 here另一个使用自定义 ELF 部分的示例。

关于c - 如何获取自定义 ELF 部分的开始和结束地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16552710/

相关文章:

c++ - 如何为动态加载编写 MPI 包装器

c - 带有 CSS 的 GtkProgressBar 进度颜色不起作用

c++ - 对 `DES_set_odd_parity' 的 undefined reference

gcc - 变量值的字符串化

c - ELF 文件的 .bss 部分应该在哪里占用内存?

c - 'Segment type: Externs'在IDA中是什么意思?

c - pthread_barrier_wait 返回后,如何立即销毁屏障?

c - 这个基本的 C 程序总是得到错误的答案,特别是 x 总是 0,y 的值是正确的

c - 我怎样才能为 Windows 制作一个二进制文件,使非编码人员能够只获得一个可以提供给 gdb 的故障转储?

c - .init_array 函数参数的任何文档?