【问题标题】:Finding address of a C struct inside an ELF file compatible to ARM Architecture在与 ARM 体系结构兼容的 ELF 文件中查找 C 结构的地址
【发布时间】:2013-10-07 06:43:36
【问题描述】:

在我的项目中,我定义了:(这不是真正的代码 - 用于抽象目的)

typedef struct {
...
} my_struct;

在我声明的某个 C 文件中:

my_struct my_struct_inst;

在其他 2 个 C 文件中,我通过声明使用该结构:

extern my_struct my_struct_inst;

并使用了它的内容。

我使用 RVCT2.2 将该代码编译到 ARM 并试图找到该结构的地址:

1) 内存何时分配给 my_struct_inst?在编译时间?在运行时?

2) 在反汇编中,我可以看到在.FLASH_RAM 部分(可能属于此类数据的位置)有一些参考,例如: my_struct_inst % 0x190 我通过 IDA 得到了它。这是什么意思? (该结构实例将从.FLASH_RAM 部分开头的偏移量 0x190 开始?)

3) 当我写 my_struct_inst.some_member 时,实际地址(结构实际位于内存中的位置)是如何被访问的(我应该阅读一些 ABI 文档吗?)

【问题讨论】:

  • 写一些 C 语言“&my_struct_inst”,编译成汇编并查看代码。
  • 你的意思是在运行时打印实例的地址吗?
  • 这就是我的意思。我认为这回答了 3),但也许我误解了你的问题。
  • my_struct_inst % 0x190 表示my_struct_inst的大小为0x190字节,其内容未初始化。
  • 谢谢@IgorSkochinsky-您的意思是Jitesh回答时在编译时分配了0x190字节? (所以在精灵本身有 0x190 字节为它保留?或者它只是一个说 my_struct_inst 有 0x190 字节的 enrty,如果它会被使用,内存将在运行时分配给它?)

标签: c arm elf abi


【解决方案1】:

结构的内存将在编译时分配。

地址将由您的链接描述文件定义。要查看结构的地址(假设它是一个全局变量),您将需要生成的 ELF 文件(我们称之为 a.elf,在本例中)。然后运行:

arm-eabi-objdump -t a.elf | grep my_struct_inst

Objdump "-t" 将列出所有全局符号及其地址和它所属的部分。您可以用您拥有的任何交叉编译的 objdump 替换“objdump”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2020-07-31
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多