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

在使用GCC编译时,如何在代码中获取映像基址?,gcc,linker,embedded,Gcc,Linker,Embedded,我正在用GCC做嵌入式编程。如何在C代码中获取图像基址 另外,我知道我可以在链接器脚本中设置一个变量。但是,有没有其他方法可以在不修改脚本的情况下实现它呢 提前感谢。如果我正确理解了您的问题,您不想显式设置基址,但想知道作为输出的一部分,基址设置为什么 通过将参数传递给链接器,可以在编译过程中生成映射文件。例如: gcc -Wall -o hello_world.exe -Wl,-Map,hello_world.map hello_world.c 相关部分为-Wl,-Map,hello\u w

我正在用GCC做嵌入式编程。如何在C代码中获取图像基址

另外,我知道我可以在链接器脚本中设置一个变量。但是,有没有其他方法可以在不修改脚本的情况下实现它呢


提前感谢。

如果我正确理解了您的问题,您不想显式设置基址,但想知道作为输出的一部分,基址设置为什么

通过将参数传递给链接器,可以在编译过程中生成映射文件。例如:

gcc -Wall -o hello_world.exe -Wl,-Map,hello_world.map hello_world.c
相关部分为
-Wl,-Map,hello\u world.Map
意味着您将
-Map
选项传递给链接器,并告诉它生成文件
hello\u 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

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

如果有散点文件,可以很容易地引用不同的区域。 假设您希望引用分散文件中作为代码基础的文本部分:


extern uint32\u t Image$$TEXT$$Base

谢谢您的回答。我想在程序代码中使用基址,例如从(Image\u base)
读取代码。因为我在做嵌入式编程,没有标准的链接器脚本。我想知道是否有一个“标准变量”指向它。@Grissiom我不知道该怎么做。但是位置不应该改变。不,在某些情况下可能会改变。例如,引导加载程序可能会根据配置将fw加载到不同的地址。