gpt4 book ai didi

c - 针对 PowerPC 的 GCC C/C++ 交叉分析实现问题

转载 作者:行者123 更新时间:2023-11-30 15:53:58 30 4
gpt4 key购买 nike

我正在尝试实现 gcc 分析。

我正在使用带有 PowerPC 的嵌入式环境 eCos。我用 C 编程。

当我使用 -pg 开关进行编译和链接时,我发现符号 _mcount 未定义。

我意识到我需要实现这个函数,因为它是特定于目标的。

_mcount 函数有什么要求?

它必须保存和恢复所有寄存器,我是否正确?是否有任何特殊寄存器必须与标准 32 位寄存器一起保存和恢复?

我看到评论指出 _mcount 必须在禁用中断的情况下调用,或者 _mcount 在记录调用树数据之前是否禁用中断?

我的 PowerPC 是 8245。这是 603e 系列处理器。

我使用 GCC 4.6.1 作为 powerpc-eabi 构建的交叉编译器。

下面是 gcc 生成的 _mcount 调用的示例。正在分析的函数的第一条指令是显示的第一行:

100b40:       7c 08 02 a6     mflr    r0
100b44: 3d 80 00 23 lis r12,35
100b48: 90 01 00 04 stw r0,4(r1)
100b4c: 38 0c 82 a8 addi r0,r12,-32088
100b50: 48 05 19 25 bl 152474 <_mcount>
100b54: 94 21 ff 88 stwu r1,-120(r1)
100b58: 7c 08 02 a6 mflr r0
100b5c: 90 01 00 7c stw r0,124(r1)
100b60: 93 e1 00 74 stw r31,116(r1)
100b64: 7c 3f 0b 78 mr r31,r1

由编译器开关-pg创建的代码执行以下操作。

  • 1) 调用者的地址通过两条指令 mflr r0stw r0,4(r1) 存储在堆栈中。
  • 2) 刚刚输入的函数地址被存储在r0中,有两条指令lis r12,35addi r0,r12,-32088

因此,当调用_mcount时,r0包含输入的函数地址,4(r1)包含调用者的程序计数器。这对信息被存储并用于创建调用图。

这些信息是我通过阅读 gcc 源代码 gcc/libffi/src/powerpc/asm.h 找到的。

我仍然不确定 _mcount 预计会返回什么。看起来它必须恢复 LR,这样 _mcount 就不能使用 blr,它必须从 (4)r1 恢复 LR 并使用跳转指令而不是 blr 返回到 bl _mcount 之后的指令。这有道理吗?

最佳答案

关于c - 针对 PowerPC 的 GCC C/C++ 交叉分析实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13406377/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com