了解GCC生成的地图文件

时间:2015-04-01 17:11:53

标签: c gcc linker msp430

我正在尝试编写一个解析GCC生成的.map文件的脚本,并帮助我弄清楚各种库的内存在内存中是什么。 (Github repository of what I have so far

我试图了解以下内容/应该如何阅读:

.debug_line     0x00000000     0x67b1
 *(.debug_line .debug_line.* .debug_line_end)
 .debug_line    0x00000000      0x105 /opt/ti/gcc/bin/../lib/gcc/msp430-elf/4.9.1/../../../../msp430-elf/lib/crt0.o
 .debug_line    0x00000105      0x4b5 CMakeFiles/firmware-msp430f5529.elf.dir/main.c.obj
 .debug_line.text.bc_printf.constprop.1
                0x000005ba       0x23 CMakeFiles/firmware-msp430f5529.elf.dir/main.c.obj
 .debug_line.text.deferred_exec
                0x000005dd       0x60 CMakeFiles/firmware-msp430f5529.elf.dir/main.c.obj
 .debug_line.text.startup.main
                0x0000063d       0xfc CMakeFiles/firmware-msp430f5529.elf.dir/main.c.obj
 .debug_line_end
                0x00000739        0x0 CMakeFiles/firmware-msp430f5529.elf.dir/main.c.obj

我一直在假设第一行没有缩进,是某种节标题,地址(0x0000000)以某种方式与应该写入节内容的位置有关。 0x00000000以某种方式导致内容被丢弃。

缩进行(以.debug_line开头的行)也有一个地址。当符号将被写入二进制时,这些地址是绝对的。

.text           0x000048d8     0x3312
                0x000048d8                . = ALIGN (0x2)
 *(.lower.text.* .lower.text)
                0x000048d8                . = ALIGN (0x2)
 *(.text .stub .text.* .gnu.linkonce.t.* .text:*)
 .text          0x000048d8       0xa4 /opt/ti/gcc/bin/../lib/gcc/msp430-elf/4.9.1/crtbegin.o
 .text.bc_printf.constprop.1
                0x0000497c       0x1a CMakeFiles/firmware-msp430f5529.elf.dir/main.c.obj

如何调整节标题中的地址,或者应该调用第一行的地址,如何转换为实际符号中的地址等等?即,0x00000000如何导致符号被丢弃(即使它们包含的地址确实可能是有效的可写位置)

以*开头的缩进行是什么意思,即*(.debug_line .debug_line.* .debug_line_end)是什么意思?我非常肯定这一行对于定义第一个片段中第二行最后一行的处理至关重要,因为.debug_line_end并不是以类似于.debug_line在第一行中的方式自行定义的.debug_line_end的片段。但我似乎无法找到对文件结构的任何引用。

通过这些答案,我希望能够了解以下代码段中.eh_frame的解析方式。如果有必要,我可以发布完整的地图文件,但我怀疑所需的所有信息都以某种方式编码在代码段中,并且只在顶部和底部的几行内编码。

.rodata         0x00004400      0x464
                0x00004400                . = ALIGN (0x2)
 *(.plt)
                0x00004400                . = ALIGN (0x2)
 *(.lower.rodata.* .lower.rodata)
                0x00004400                . = ALIGN (0x2)
 *(.rodata .rodata.* .gnu.linkonce.r.* .const .const:*)
 .rodata        0x00004400       0x11 CMakeFiles/firmware-msp430f5529.elf.dir/main.c.obj
 *fill*         0x00004411        0x1
 .rodata.tUsbRequestList
                0x00004412      0x15c ../peripherals/USB_config/libusb-config-msp430f5529.a(descriptors.c.obj)
                0x00004412                tUsbRequestList
 .rodata.stUsbHandle
                0x0000456e       0x40 ../peripherals/USB_config/libusb-config-msp430f5529.a(descriptors.c.obj)
                0x0000456e                stUsbHandle
 .rodata.report_desc_HID0
                0x000045ae       0x24 ../peripherals/USB_config/libusb-config-msp430f5529.a(descriptors.c.obj)
                0x000045ae                report_desc_HID0
 .rodata.abromStringDescriptor
                0x000045d2      0x146 ../peripherals/USB_config/libusb-config-msp430f5529.a(descriptors.c.obj)
                0x000045d2                abromStringDescriptor
 .rodata.abromConfigurationDescriptorGroup
                0x00004718       0xef ../peripherals/USB_config/libusb-config-msp430f5529.a(descriptors.c.obj)
                0x00004718                abromConfigurationDescriptorGroup
 .rodata.abromDeviceDescriptor
                0x00004807       0x12 ../peripherals/USB_config/libusb-config-msp430f5529.a(descriptors.c.obj)
                0x00004807                abromDeviceDescriptor
 *fill*         0x00004819        0x1
 .rodata.report_desc_size
                0x0000481a        0x2 ../peripherals/USB_config/libusb-config-msp430f5529.a(descriptors.c.obj)
                0x0000481a                report_desc_size
 .rodata        0x0000481c       0x11 ../subsystem/libcontrol-iface-msp430f5529.a(control_iface.c.obj)
 *fill*         0x0000482d        0x1
 .rodata.GPIO_PORT_TO_BASE
                0x0000482e       0x1c ../peripherals/driverlib/MSP430F5xx_6xx/libdriverlib-msp430f5529.a(gpio.c.obj)
 .rodata        0x0000484a        0x7 ../lib/libprintf-msp430f5529.a(printf.c.obj)
 *(.rodata1)
 *(.eh_frame_hdr)
 *(.eh_frame)
 *fill*         0x00004851        0x3
 .eh_frame      0x00004854        0x0 /opt/ti/gcc/bin/../lib/gcc/msp430-elf/4.9.1/crtbegin.o

0 个答案:

没有答案