【问题标题】:How to get the image base address in the code when compiling with GCC?使用GCC编译时如何获取代码中的镜像基地址?
【发布时间】:2013-07-11 09:41:51
【问题描述】:

我正在使用 GCC 进行嵌入式编程。如何在 C 代码中获取图像基地址?

附:我知道我可以在链接器脚本中设置一个变量。但是有没有其他方法可以不用修改脚本来实现呢?

提前致谢。

【问题讨论】:

    标签: gcc linker embedded


    【解决方案1】:

    如果我正确理解您的问题,您不想明确设置基地址,但您想知道作为输出的一部分设置的基地址。

    您可以通过将参数传递给链接器来生成映射文件作为编译的一部分。例如:

    gcc -Wall -o hello_world.exe -Wl,-Map,hello_world.map hello_world.c
    

    相关部分是-Wl,-Map,hello_world.map,这意味着您将-Map 选项传递给链接器并告诉它生成文件hello_world.map

    结果输出中包含大量信息,但您会寻找如下部分:

    Linker script and memory map
    
                0x00400000                __image_base__ = 0x400000
                0x00000000                __dll__ = 0x0
                0x00400000                ___ImageBase = 0x400000
                0x00001000                __section_alignment__ = 0x1000
                0x00000200                __file_alignment__ = 0x200
                0x00000004                __major_os_version__ = 0x4
                0x00000000                __minor_os_version__ = 0x0
                0x00000001                __major_image_version__ = 0x1
                0x00000000                __minor_image_version__ = 0x0
                0x00000004                __major_subsystem_version__ = 0x4
                0x00000000                __minor_subsystem_version__ = 0x0
                0x00000003                __subsystem__ = 0x3
                0x00200000                __size_of_stack_reserve__ = 0x200000
                0x00001000                __size_of_stack_commit__ = 0x1000
                0x00100000                __size_of_heap_reserve__ = 0x100000
                0x00001000                __size_of_heap_commit__ = 0x1000
                0x00000000                __loader_flags__ = 0x0
                0x00008000                __dll_characteristics__ = 0x8000
    

    图像的基地址以及堆栈、堆(如果有的话)和所有函数的位置都应该清晰可见。

    【讨论】:

    • 感谢您的回答。我想在程序代码中使用基地址,例如read_the_code_from(Image_Base)。因为我正在做嵌入式编程并且没有标准的链接器脚本。我想知道有一个“标准变量”指向它。
    • @Grissiom 我不知道怎么做。但位置不应该真的改变。
    • 不,它可能会在某些情况下发生变化。例如,引导加载程序可能会根据配置将 fw 加载到不同的地址。
    【解决方案2】:

    如果您有分散文件,您可以轻松引用不同的区域。 想象一下,您想引用作为代码基础的分散文件的 TEXT 部分:

    extern uint32_t Image$$TEXT$$Base;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2011-10-22
      • 2011-09-29
      相关资源
      最近更新 更多