获取linux可执行文件加载地址(__builtin_return_address和addr2line)

2024-02-29

我正在编写一些代码来存储每个内存分配的回溯。然后,我将这些列表写入文件以进行离线分析。在win32中我使用_AddressOfReturnAddress然后手动创建回溯。由于我使用的每次运行的地址都是随机的GetModuleInformation and lpBaseOfDll来获取基地址。这在没有 FPO 的 x86 上效果很好,这对我来说已经足够了。然后,我使用 win32 API 加载 PDB,将地址转换为函数名称。

我将如何在 Linux 上执行此操作?我目前的方法是使用__builtin_return_address(x) and addr2line离线获得相同的结果。问题是每次运行的地址都是随机的,所以addr2line不理解他们。__executable_start不起作用,因为每次运行都会返回相同的值。有什么方法可以在运行时获取可执行文件的基地址吗?

一次运行给了我这个:

__executable_start: 0x8048000
backtrace:
0x9cce628
0x9cce2b8
0x9cce260
0x9cce1f8
0x9cce138
0x9cce0c8
0x9cce060
0x9cce008

下一个:

__executable_start: 0x8048000
backtrace:
0x8db6628
0x8db62b8
0x8db6260
0x8db61f8
0x8db6138
0x8db60c8
0x8db6060
0x8db6008

等等。


您可以使用dl_iterate_phdr()在Linux上确定每个动态加载对象的加载地址:

#define _GNU_SOURCE
#include <stdio.h>
#include <link.h>

int callback(struct dl_phdr_info *info, size_t size, void *data)
{
    printf("%s @ %#lx\n", info->dlpi_name, (unsigned long)info->dlpi_addr);
    return 0;
}

int main()
{
    dl_iterate_phdr(&callback, NULL);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取linux可执行文件加载地址(__builtin_return_address和addr2line) 的相关文章

随机推荐

  • 自定义验证器不显示错误消息

    我有一个要求 需要多个字段之一 使用自定义验证器 偶数会触发 返回 false 但不会显示错误消息并且表单会验证 我缺少什么 我尝试过使用和不使用 ValidationSummary Thanks
  • 更新 JList

    我现在制作了一个基于数组列表的 JList 并由 defaultlistmodel 填充 该列表会在连接到服务器时添加人员 但不会显示连接的人员或之后连接的人员 所以 我必须更新 JList 我的问题是 我应该更新什么 是否可以使用运行更新
  • 带标签的维基数据 SPARQL 查询不起作用

    我不明白为什么通过这个查询我无法获得运动和流派标签 SELECT DISTINCT item itemLabel value inception creatorLabel image group concat genreLabel sepa
  • 如何动态导入 python 模块函数?

    假设my function 位于 my apps views 我想导入my function动态地不使用类似的东西exec or eval 有什么办法可以实现这一点吗 我想做类似的事情 my function import func my
  • 如何在msbuild文件中给出相对路径?

    我正在编写一个 msbuild 文件来使用 galio 运行测试 现在 我需要给出
  • 如何在汇编中通过字符串进行索引

    给定变量 var1 db abcdefg NULL 我将如何执行循环来导航每个字母 在 C 中 您可以在循环内执行类似 var x 的操作 然后每次递增 x 有任何想法吗 在 C 和 C 中 字符串以 NUL 结尾 这意味着将 ASCII
  • 我可以向量化这个Python代码吗?

    我编写了这段 python 代码来获取标签的邻居 一组共享一些公共属性的像素 标签的邻居被定义为位于边界另一侧的其他标签 相邻标签共享边界 所以 我写的代码可以工作 但速度非常慢 segments It is a 2 dimensional
  • 删除 sourceSets.main.runtimeClasspath 中的 jar

    我的 gradle 中有这个 sourceSets main compileClasspath configurations provided runtimeClasspath configurations provided test co
  • 从选择框中删除重复条目

    我如何使用 jQuery 删除重复项
  • 如何制作在 iOS 上的 VLC 中播放的音乐文件的 URL?

    我想通过我的网站向 iPhone 和 iPad 用户提供 MP3 和其他文件格式 VLC 的 iOS 应用程序似乎符合要求 但他们说 Additionally third party websites and apps may includ
  • 从 VBA 项目中删除密码

    如何以编程方式从 Excel VBA 项目中删除 已知 密码 需要明确的是 我想从 VBA 项目中删除密码 而不是从工作簿或任何工作表中删除密码 删除 VBA 项目密码的另一种方法是 使用十六进制编辑器打开 xls 文件 即十六进制编辑ht
  • 如何调试 Captive Portal 中的浏览器?

    强制门户有一个浏览器 当您尝试连接到无线网络时 该浏览器有时会打开 有谁知道我该如何调试它 我已经尝试过的 我尝试运行模拟器 但模拟器无法打开门户 我尝试过将 iPhone 连接到我的 Mac 并使用 Safari 开发进行调试 但这仅在
  • 如何在雪豹上安装gem pg

    我需要在雪豹上安装 gem pg 因为我正在 Rails 代码库上运行 rake 我没有使用 postgres 这是我收到的错误 sudo gem install pg Password Sorry try again Password B
  • 自动映射器有什么用?

    What s 自动映射器 http www codeplex com AutoMapper for 它将如何帮助我处理域和控制器层 asp net mvc 也许一个例子会有所帮助 假设您有一个很好标准化的数据库模式 如下所示 Orders
  • Python——词法分析和标记化

    我希望加快我的发现过程 因为这是我第一次涉足词法分析领域 也许这甚至是一条错误的道路 首先 我将描述我的问题 我有非常大的属性文件 大约 1 000 个属性 经过提炼后 实际上只有大约 15 个重要属性 其余属性可以生成或很少更改 因此 例
  • 在加载时应用选择背景颜色?

    请查看以下链接以查看我的代码的运行情况 http codepen io DigitalSquid pen mAkuC http codepen io DigitalSquid pen mAkuC 如何使背景颜色出现在页面加载时 on win
  • MVC 模式中的“Hello World”

    在面试某家公司的时候 我被问到了这个问题 你知道哪些设计模式 然后我被告知基于 MVC 设计模式编写最简单的 hello world 应用程序 我想出了一个 JavaScript 程序 var arr a b c d this is an
  • 应用 pyspark ALS 的“recommendProductsForUsers”时出现 StackOverflow 错误(尽管可用 >300GB RAM 的集群)

    寻找专业知识来指导我解决以下问题 背景 我正在尝试使用受启发的基本 PySpark 脚本这 例子 https github com GoogleCloudPlatform spark recommendation engine blob m
  • Laravel 至少需要一个字段

    我有两个字段billable option and billable option yes 我想验证至少一个字段是必填字段 我努力了 this gt validate request billable option gt required
  • 获取linux可执行文件加载地址(__builtin_return_address和addr2line)

    我正在编写一些代码来存储每个内存分配的回溯 然后 我将这些列表写入文件以进行离线分析 在win32中我使用 AddressOfReturnAddress然后手动创建回溯 由于我使用的每次运行的地址都是随机的GetModuleInformat