This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM6442:如何为 Processore SDK 生成具有.debug_frame /.eh_frame 的 U‑引导 ELF

Guru**** 2936100 points

Other Parts Discussed in Thread: AM6442

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1655335/am6442-how-to-generate-u-boot-elf-with-debug_frame-eh_frame-for-processore-sdk

器件型号: AM6442

对于 U-Boot 专家:

我想调试使用 JTAG-ICE 为 AM64x(例如 AM6442)生成的 U-Boot ELF 二进制文件的 C 语言源代码。 为此、ELF 二进制文件需要包含调试段.debug_frame 和.eh_frame。
Processor SDK 的默认生成环境(例如,10.00.07.04)会删除这些调试部分、因此请告诉我在哪里进行必要的更改。 如果我不小心改变了生成环境,生成本身就会失败。
感谢你的帮助。
注意:此问题与下面帖子中的第一个问题相同、但问题在该帖子的中间位置发生了变化、因此我将其单独发布。
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1640872/am6442-how-to-generate-u-boot-elf-with-debug_frame-eh_frame-for-am6442-ti-sdk-10-00-07-04

 

此致、

Goki Ito

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ito-San:

    正如我在之前的 e2e 主题中所述、该查询似乎是 U-Boot 通用、而不是特定于 TI 处理器。 我们通常不会更改/修补 U-Boot 编译系统、也没有处理此特定查询的经验。 但以下是 AI 工具的答案、希望能有所帮助。

    =====

    生成具有 .debug_frame / .eh_frame 段的 U-Boot ELF

    快速澄清

    ELF 在此处指 可执行和可链接格式 (非极低频率)。 .debug_frame.eh_frame 各节提供了调试器(例如 GDB 或 CCS)进行堆栈展开和正确局部变量显示所需的调用帧信息。

    核心问题

    使用 GCC 编译并使用 --gc-sections 链接器标志(在包括 U-Boot 的嵌入式构建中常见)时、链接器会对该 .eh_frame 段进行垃圾收集、因为它看起来未被引用。 这会剥离调试器需要的调用帧数据 1

    见解

    选项 A:强制 .debug_frame 生成(建议用于 U-Boot)

    -fno-exceptions 编译器标志添加到编译中:

            CFLAGS += -fno-exceptions

    这会强制 GCC 在 .debug_frame 段(dwarf debug info 的一部分)中发出调用帧信息 .eh_frame、而不是。 该 .debug_frame 部分 --gc-sections 被删除、因此它能够承受链路步骤。

    U-Boot 是不使用 C++异常的 C 代码、这 -fno-exceptions 是安全的、并且可能已经隐含在了里面。

    选项 B:保留 .eh_frame 在链接器脚本中

    如果您 .eh_frame 特别需要(例如,对于运行时展开)、请修改链接器脚本以显式保留它:

            .eh_frame : {
                KEEP(*(.eh_frame))
            } > MEMORY_REGION

    --gc-sections 在调试构建期间从链接器标志中删除或删除 1.

    选项 C:确保生成展开表

    添加以下编译器标志以保证回溯表发射:

            CFLAGS += -g -fasynchronous-unwind-tables -fno-omit-frame-pointer

    TI SDK U-Boot 构建版

    在 TI 的 Processor SDK 中、U-Boot 通常通过顶级 Makefile 或 Yocto 配方构建。 要注入这些标志、请执行以下操作:

    • 直接构建:编辑 U-Boot Makefile 或通过 KCFLAGS以下方式传递:
      make KCFLAGS="-fno-exceptions -fasynchronous-unwind-tables" u-boot
    • CCS 工程-fno-exceptions 在 Build→GNU Compiler→Language settings 1 下添加

    验证

    构建后、确认该部分存在:

            arm-none-eabi-readelf -S u-boot | grep -E "debug_frame|eh_frame"

    知识差距

    可用的文档不涵盖这些标志的 U-Boot 特定 Makefile 集成详细信息。 以上答案基于在 AM64x Cortex-A53 版本上确认的通用 GCC 机制。 您的具体结果可能因以下因素而异:

    • U-Boot 版本和目标架构
    • 无论您是构建 SPL 还是完整 U-Boot
    • 映像流水线 (ELF→RPRC→appimage) 是否保留调试段