5

问题场景:简单来说,我们是否有一个 Trace32 命令来从加载到目标的 ELF 文件中读取符号(及其内容)?我们有这种特殊情况,其中 ELF 文件的应用程序特定调试符号作为 ELF 中“.noload”部分的一部分,这意味着符号/内容是 ELF 文件的一部分(使用 readelf -a xxxx 读取时可用。 elf_file_name) 但不是最终生成的二进制映像的一部分,即在生成闪存到目标内存的 xxx.bin 时,ELF 文件中的“.noload”部分被剥离。

  • '.noload' 部分中的调试符号是静态分配的值,并且这些值在运行时不会更改。
  • 当我试图读取“.noload”部分的调试符号部分(编译成二进制文件并加载到 Trace32 之后)时,我看到 trace32 弹出窗口上标记了“MMU 失败”,这意味着 trace32 正在尝试从内存中读取符号内容,但是不可访问,因为“.noload”部分的符号部分根本没有加载,尽管它们已经映射了地址。

任何输入
- 我需要一个 trace32 命令的帮助,该命令可以直接从 ELF 文件中读取符号内容,而不是从目标内存中读取符号内容。
- 也不确定我是否可以在练习脚本中使用“readelf”?如果我们对上述查询没有任何解决方案,这方面有什么帮助吗?

4

1 回答 1

10

使用命令

Data.LOAD.Elf myfile.elf [<optional address offset>] /NoCODE

选项 /NoCODE 指示 TRACE32 仅从您的 ELF 加载调试符号,而不将任何代码加载到您的目标。您可以使用命令查看符号sYmbol.Browse

但是,如果您使用 TRACE32 将应用程序加载到目标,则不必先从 ELF 创建二进制文件。使用 TRACE32,您还可以将 ELF 的 PROGBITS 部分直接加载到目标。在这种情况下,您只需使用不带 /NoCODE 选项的 Data.LOAD.Elf 命令(启用闪存编程后)。

由于您使用的是 MMU,您可能希望使用 command 激活逻辑内存空间 ID SYStem.Option.MMUSPACES ON。然后加载你的符号

Data.LOAD.Elf myfile.elf <space-ID>:<offset> /NoCODE

其中“space-ID”与 MMU 用于任务的空间 ID 匹配,“offset”通常为零。

如果您在嵌入式 Linux 上调试应用程序,则应使用 Linux 的 TRACE32 OS 感知和 Linux 符号自动加载器为您将符号加载到正确的地址。

我认为没有任何理由应该在 TRACE32 中使用“readelf”。无论如何,您可以使用命令OS.AreaOS.Command.

于 2016-11-28T11:08:32.837 回答