链接相关的一个问题
本文是原「蜗窝讨论区」的历史存档(2017-01-13),来自版块「Linux kernel技术问答」,共 6 帖。讨论区已停止服务,此处仅供查阅。
链接脚本如下: . = 0x1400000;
.Reset = .;
. = ALIGN(4);
.text : {
*(.text)
. = ALIGN(4);
}
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
__bss_end = .;
section布局如下: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 01400000 008000 00ff90 00 AX 0 0 32 [ 2] .rodata PROGBITS 0140ff90 017f90 000c8f 00 A 0 0 4 [ 3] .rodata.str1.1 PROGBITS 01410c1f 018c1f 000624 01 AMS 0 0 1 [ 4] .data PROGBITS 01411244 019244 0002ac 00 WA 0 0 4 [ 5] .bss NOBITS 01414000 0194f0 225554 00 WA 0 0 16384 [ 6] .ARM.attributes ARM_ATTRIBUTES 00000000 0194f0 000030 00 0 0 1 [ 7] .shstrtab STRTAB 00000000 019520 000053 00 0 0 1 [ 8] .symtab SYMTAB 00000000 019704 0043e0 10 9 651 4 [ 9] .strtab STRTAB 00000000 01dae4 001f1d 00 0 0 1
请教各位: 为什么bss段没有连着data段,而是空了很多?
wpch315 写道: 链接脚本如下: . = 0x1400000;
.Reset = .;
. = ALIGN(4);
.text : {
*(.text)
. = ALIGN(4);
}
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
__bss_end = .;
section布局如下: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 01400000 008000 00ff90 00 AX 0 0 32 [ 2] .rodata PROGBITS 0140ff90 017f90 000c8f 00 A 0 0 4 [ 3] .rodata.str1.1 PROGBITS 01410c1f 018c1f 000624 01 AMS 0 0 1 [ 4] .data PROGBITS 01411244 019244 0002ac 00 WA 0 0 4 [ 5] .bss NOBITS 01414000 0194f0 225554 00 WA 0 0 16384 [ 6] .ARM.attributes ARM_ATTRIBUTES 00000000 0194f0 000030 00 0 0 1 [ 7] .shstrtab STRTAB 00000000 019520 000053 00 0 0 1 [ 8] .symtab SYMTAB 00000000 019704 0043e0 10 9 651 4 [ 9] .strtab STRTAB 00000000 01dae4 001f1d 00 0 0 1
请教各位: 为什么bss段没有连着data段,而是空了很多?
看着确实奇怪。。。 你能把完整的lds以及编译命令、编译过程贴一下吗? 我怀疑上面给出的lds不是编译时所使用的。
lds文件: OUTPUT_FORMAT("elf32-littlearm") OUTPUT_ARCH(arm)
ENTRY(Reset)
SECTIONS {
. = 0x1400000;
.Reset = .;
. = ALIGN(4);
.text : {
*(.text)
. = ALIGN(4);
}
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
__bss_end = .;
}
主要编译过程: LIB_DIRS = /arm-2012.03/lib/gcc/arm-none-linux-gnueabi/4.6.3/ CFLAGS = -mcpu=arm926ej-s -mtune=arm926ej-s -g -Os -nostdlib -fno-builtin -Wall LDFLAGS = -nostdlib -format elf32-littlearm -T $(TOPDIR)/startup.lds -L $(LIB_DIRS) AS = $(CROSS_COMPILE)as $(AFLAGS) LD = $(CROSS_COMPILE)ld $(LDFLAGS) CC = $(CROSS_COMPILE)gcc $(CFLAGS) STRIP = $(CROSS_COMPILE)strip -R .note -R .comment -S "$(LOADER).bin" : $(OBJS) @echo assembly/compile done. linking. @$(LD) -o "$(LOADER)-elf32" $(OBJECTS) $(LIBS) -Map "$(LOADER).map" @echo linking done. strip. @$(STRIP) "$(LOADER)-elf32" -o "$(LOADER)-elf32-stripped" @echo strip done. objcopy. @$(OBJCOPY) "$(LOADER)-elf32" "$(LOADER).bin" @echo Build Successful!
lds文件是起作用的,地址只在那里面设置了,一开始没有注意到这个问题,是因为发现有的时候代码会不运行,随便加点指令又可以运行了,手上没有调试器,不知道出问题的时候代码运行到哪里,然后查看ELF文件发现这个情况,但是也不确定这个跟代码不运行有没有关系
去代码中查一下__bss_start 的值吧,我怀疑bss的addr没有意义(只能这样解释了)。
我查看过__bss_start的值 __bss_start = .放在.bss : { (.bss) }的外面,__bss_start = 014114F0, __bss_start = .放在.bss : { (.bss) }的里面,__bss_start = 01414000,
关键是代码有的时候正常运行,有的时候就跑飞,逻辑没有问题,只能怀疑是编译的问题,实在是蛋疼
bss的问题搞清楚了, attribute((aligned(0x4000))) unsigned int _mmuSectionTable[4096];导致16K对齐
但是代码跑飞的问题还是不清楚
