我正在使用 GCC 进行嵌入式编程。如何在 C 代码中获取图像基地址?
PS 我知道我可以在链接器脚本中设置一个变量。但是有没有其他方法可以实现它而无需修改脚本?
提前致谢。
如果我正确理解您的问题,您不想明确设置基地址,但您想知道基地址设置为输出的一部分。
您可以通过将参数传递给链接器来生成映射文件作为编译的一部分。例如:
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
图像的基地址以及堆栈、堆(如果有的话)和所有函数的位置应该清晰可见。
如果你有一个分散文件,你可以很容易地引用不同的区域。想象一下,您想引用作为代码基础的分散文件的 TEXT 部分:
extern uint32_t Image$$TEXT$$Base;