lds文件代码段的排放

在自己写简单BootLoader时发现了一个问题,lds文件中未指定.text段时各文件的存放顺序,但是u-boot内的lds有指定text段最开始要存放start.o。

网上查了很久未指定.text段时各文件的存放顺序,直到论坛上有个人回答了我。

makefile中的objs顺序代表了编译顺序。

带着疑问我做了几个试验。

 

原先的makefile和lds文件内容

CC      = arm-linux-gcc
LD      = arm-linux-ld
AR      = arm-linux-ar
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump


CFLAGS 		:= -Wall -O2
CPPFLAGS   	:= -nostdinc -nostdlib -fno-builtin

objs :=start.o init.o boot.o

boot.bin :$(objs)
	${LD} -Tboot.lds -o boot.elf $^ 
	${OBJCOPY} -O binary -S boot.elf $@ 
	${OBJDUMP} -D -m arm boot.elf >boot.dis
	
%.o:%.c
	${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%.o:%.S
	${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

clean:
	rm -f *.o *.bin *.dis *.elf

 

SECTIONS{
     . = 0x33f80000; 	/*链接地址*/
     .text : {*(.text)} 	/*代码段*/

     . = ALIGN(4); 	/*下一段的起始地址向4取整*/
     .rodata : {*(.rodata*)} 	/*只读数据段*/

      . = ALIGN(4);	
      .data : {*(.data)}	/*数据段*/

      . = ALIGN(4);	
      __bss_start = .;	/*bss段起始地址设为当前地址*/
      .bss : {*(.bss) *(COMMON) }	/*bss段 以及通用符号段*/
      __bss_end = .;	

}

 

1)修改makefile文件的obj依赖顺序

objs := init.o start.o  boot.o 

 

//make时输出信息如下
arm-linux-gcc -nostdinc -nostdlib -fno-builtin -Wall -O2 -c -o init.o init.c
arm-linux-gcc -nostdinc -nostdlib -fno-builtin -Wall -O2 -c -o start.o start.S
arm-linux-gcc -nostdinc -nostdlib -fno-builtin -Wall -O2 -c -o boot.o boot.c
arm-linux-ld -Tboot.lds -o boot.elf init.o start.o boot.o 
arm-linux-objcopy -O binary -S boot.elf boot.bin 
arm-linux-objdump -D -m arm boot.elf >boot.dis

可以通过编译,但是烧录进板子无法启动内核

 

2)在修改完obj依赖顺序的基础上修改lds文件指定存放顺序

SECTIONS{
     . = 0x33f80000; 	/*链接地址*/
    .text : {
            start.o (.text) //指定start.o放在代码段最开始
            *(.text)
            } 	/*代码段*/

     . = ALIGN(4); 	/*下一段的起始地址向4取整*/
     .rodata : {*(.rodata*)} 	/*只读数据段*/

      . = ALIGN(4);	
      .data : {*(.data)}	/*数据段*/

      . = ALIGN(4);	
      __bss_start = .;	/*bss段起始地址设为当前地址*/
      .bss : {*(.bss) *(COMMON) }	/*bss段 以及通用符号段*/
      __bss_end = .;	

}

可以通过编译且烧录后可以正常启动内核

 

结论确实如论坛这位老师所说的一样,不过我感觉可以引申为:当代码段未指定存放顺序时,代码段存放顺序按编译时的链接顺序存放

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值