1. 产生原因:
1)switch语法;
2)初始化数据:
int data[8] = {1, 2 , 3};
3) printf("xxx. %d", x); -> 与 section: .rodata.str1.4 相关, OPT=-O2
2. 通常存储与.text, 如果cpu 不能load .text段的数据,就要存储与别的段。如 .data:
MEMORY
{
flash : ORIGIN = @core_code_base@, LENGTH = @core_code_size@
ram : ORIGIN = 0x00000000, LENGTH = @core_code_size@
}
SECTIONS
{
.text :
{
*(.text)
} > flash
.bss :
{
*(.bss)
} > ram
.data :
{
*(.data)
*(.rodata)
} > ram
}
3. 如果.rodata不存于.text, 系统boot时,需要load 数据至对应的.rodata段空间,可查map:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 03a00000 004000 0464f4 00 AX 0 0 16
[ 2] .rodata.str1.4 PROGBITS 03a464f4 04a4f4 0187c8 01 AMS 0 0 4
[ 3] .bss NOBITS 00000000 001000 002a88 00 WA 0 0 8
[ 4] .data PROGBITS 00002a88 003a88 0004e0 00 WA 0 0 4
[ 5] .comment PROGBITS 00000000 062cbc 000011 01 MS 0 0 1
[ 6] .symtab SYMTAB 00000000 062cd0 003590 10 7 207 4
[ 7] .strtab STRTAB 00000000 066260 00420e 00 0 0 1
[ 8] .shstrtab STRTAB 00000000 06a46e 000044 00 0 0 1
4. 几个超有用的工具:
#: ld $(LDFLAG) -T ld_script -Map out_map -o out.exe LIBS
#: objcopy --only-section .data -O binary elf_file out.data.bin //输出文件可以用于.rodata初始化
#: objcopy --only-section .text -O binary elf_file out.text.bin
#: objdump -Mno-aliases,numeric -d elf_file > elf_file.od
#: readelf -a elf_file > elf_file.elf.txt