如何在使用GCC编译时获取代码中的映像基址?

时间:2013-07-11 09:41:52

标签: gcc linker embedded

我正在使用GCC进行嵌入式编程。我怎样才能在C代码中获得图像基地址?

P.S。我知道我可以在链接器脚本中设置一个变量。但有没有其他方法可以实现它而无需修改脚本?

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

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

图像的基本地址应该清晰可见,堆栈的位置,堆(如果有的话)以及所有功能。

答案 1 :(得分:0)

如果你有一个分散文件,你可以很容易地引用不同的区域。 假设您想引用作为代码基础的分散文件的 TEXT 部分:

extern uint32_t Image$$TEXT$$Base;

相关问题