[UBOOT] fix .rel.dyn relocations(u-boot-2011.09)

来源:互联网 发布:python 汉字转unicode 编辑:程序博客网 时间:2024/06/03 22:07
/*    ldrpc, _undefined_instruction//位置无关,_undefined_instruction基于PC计算_undefined_instruction: .word undefined_instruction//位置相关,undefined_instruction编译期间确定Disassembly of section .text:80800020 <_undefined_instruction>:80800020:       808001a0        .word   0x808001a0808001a0 <undefined_instruction>:808001a0:       e51fd154        ldr     sp, [pc, #-340] ; 80800054 <IRQ_STACK_START_IN>Disassembly of section .rel.dyn808648dc:       80800020        addhi   r0, r0, r0, lsr #32修复代码重定向之后某些位置相关的代码不能执行问题。uboot 在ld时,指定 -pie,生成的uboot会包含_rel_dyn段,_rel_dyn段(808648dc)的作用就是保存“保存函数(text)、常量(rodata)绝对地址(808001a0:undefined_instruction)”的地址(80800020)下面的代码就是遍历重定位的uboot的_rel_dyn段(还有dynsym段),将_rel_dyn段(808648dc)中的每一个地址(80800020)所指向的地址(808001a0)加上relocation offset80800020:       808001a0        .word   0x808001a0变为80800020:       808001a0+offset        .word   0x808001a0*/(uboot.dump1)ldrr0, _TEXT_BASE/* r0 <- Text base */ //r0=0x80800000subr9, r6, r0/* r9 <- relocation offset */ //r9=0x9FB39000 - 0x80800000=1F339000ldrr10, _dynsym_start_ofs/* r10 <- sym table ofs */ //r10=0x6d104(反汇编)addr10, r10, r0/* r10 <- sym table in FLASH */ //r10=0x8086D104,_dynsym_start在sdram中的真实地址(未重定位)ldrr2, _rel_dyn_start_ofs/* r2 <- rel dyn start ofs */ //r2=0x64854(反汇编)addr2, r2, r0/* r2 <- rel dyn start in FLASH */ //r2=0x80864854,_rel_dyn_start在sdram中的真实地址(未重定位)ldrr3, _rel_dyn_end_ofs/* r3 <- rel dyn end ofs */ //r3=0x6d104(反汇编)addr3, r3, r0/* r3 <- rel dyn end in FLASH */ //r3=0x8086D104,_rel_dyn_end在sdram中的真实地址=_dynsym_start(u-boot.lds)fixloop:ldrr0, [r2]/* r0 <- location to fix up, IN FLASH! */addr0, r0, r9/* r0 <- location to fix up in RAM */ldrr1, [r2, #4]andr7, r1, #0xffcmpr7, #23/* relative fixup? */beqfixrelcmpr7, #2/* absolute fixup? */beqfixabs/* ignore unknown type of fixup */bfixnextfixabs:/* absolute fix: set location to (offset) symbol value */movr1, r1, LSR #4/* r1 <- symbol index in .dynsym */addr1, r10, r1/* r1 <- address of symbol in table */ldrr1, [r1, #4]/* r1 <- symbol value */addr1, r1, r9/* r1 <- relocated sym addr */bfixnextfixrel:/* relative fix: increase location by offset */ldrr1, [r0]addr1, r1, r9fixnext:strr1, [r0]addr2, r2, #8/* each rel.dyn entry is 8 bytes */cmpr2, r3blofixloopbclear_bss_rel_dyn_start_ofs:.word __rel_dyn_start - _start_rel_dyn_end_ofs:.word __rel_dyn_end - _start_dynsym_start_ofs:.word __dynsym_start - _start/******************************************/ldrr0, _TEXT_BASE/* r0 <- Text base */    //r0=0x80800000subr9, r6, r0/* r9 <- relocation offset */   //r9=0x9FB39000 - 0x80800000=1F339000ldrr10, _dynsym_start_ofs/* r10 <- sym table ofs */   //r10=0x6d104(反汇编)addr10, r10, r0/* r10 <- sym table in FLASH */   //r10=0x8086D104,_dynsym_start在sdram中的真实地址(未重定位)ldrr2, _rel_dyn_start_ofs/* r2 <- rel dyn start ofs */   //r2=0x64854(反汇编)addr2, r2, r0/* r2 <- rel dyn start in FLASH */   //r2=0x80864854,_rel_dyn_start在sdram中的真实地址(未重定位)ldrr3, _rel_dyn_end_ofs/* r3 <- rel dyn end ofs */   //r3=0x6d104(反汇编)addr3, r3, r0/* r3 <- rel dyn end in FLASH */   //r3=0x8086D104,_rel_dyn_end在sdram中的真实地址=_dynsym_start(u-boot.lds)fixloop:ldrr0, [r2]/* r0 <- location to fix up, IN FLASH! */ //r0=[80864854]=80800020addr0, r0, r9/* r0 <- location to fix up in RAM */     //r0=80800020+1F339000=重定向后的80800020ldrr1, [r2, #4]  //r1=[80864854 + 4] =[80864858] = 0x00000017andr7, r1, #0xff     //r7=0x00000017&&0xff=0x17=23cmpr7, #23/* relative fixup? */beqfixrelcmpr7, #2/* absolute fixup? */beqfixabs/* ignore unknown type of fixup */bfixnextfixabs:/* absolute fix: set location to (offset) symbol value */movr1, r1, LSR #4/* r1 <- symbol index in .dynsym */addr1, r10, r1/* r1 <- address of symbol in table */ldrr1, [r1, #4]/* r1 <- symbol value */addr1, r1, r9/* r1 <- relocated sym addr */bfixnextfixrel:/* relative fix: increase location by offset */ldrr1, [r0]//r1=[80800020+1F339000]= 808001a0addr1, r1, r9//r1=808001a0+1F339000=重定向后的808001a0 undefined_instructionfixnext:strr1, [r0]//[80800020+1F339000]=808001a0+1F339000//把.word中的值加上了relocation offsetaddr2, r2, #8/* each rel.dyn entry is 8 bytes;8字节一个单元 */ //r2= 0x80864854 + 8=0x8086485ccmpr2, r3blofixloopbclear_bss/******************************************/fixloop:ldrr0, [r2]/* r0 <- location to fix up, IN FLASH! */ //r0=[0x8086485c]=80800024addr0, r0, r9/* r0 <- location to fix up in RAM */     //r0=80800024+1F339000=重定向后的80800024ldrr1, [r2, #4]  //r1=[0x8086485c + 4] =[80864860] = 0x00000017andr7, r1, #0xff     //r7=0x00000017&&0xff=0x17=23cmpr7, #23/* relative fixup? */beqfixrelcmpr7, #2/* absolute fixup? */beqfixabs/* ignore unknown type of fixup */bfixnextfixabs:/* absolute fix: set location to (offset) symbol value */movr1, r1, LSR #4/* r1 <- symbol index in .dynsym */addr1, r10, r1/* r1 <- address of symbol in table */ldrr1, [r1, #4]/* r1 <- symbol value */addr1, r1, r9/* r1 <- relocated sym addr */bfixnextfixrel:/* relative fix: increase location by offset */ldrr1, [r0]//r1=[80800024+1F339000]= 80800200addr1, r1, r9//r1=80800200+1F339000=重定向后的80800200 software_interrupt,位于textfixnext:strr1, [r0]//[80800024+1F339000]=80800200+1F339000//把.word中的值加上了relocation offsetaddr2, r2, #8/* each rel.dyn entry is 8 bytes;8字节一个单元 */ r2= 0x8086485c + 8=80864864cmpr2, r3blofixloopbclear_bss***//循环至r2=808649a4时,(uboot.dump_rel)fixloop:ldrr0, [r2]/* r0 <- location to fix up, IN FLASH! */ //r0=[808649a4]=808010ac 保存(test_func打印的字符串常量的地址,位于rodata)的Labeladdr0, r0, r9/* r0 <- location to fix up in RAM */     //r0=808010ac+1F339000=重定向后的808010acldrr1, [r2, #4]//r1=[808649a4 + 4] =[808649a8] = 0x00000017andr7, r1, #0xff   //r7=0x00000017&&0xff=0x17=23cmpr7, #23/* relative fixup? */beqfixrelcmpr7, #2/* absolute fixup? */beqfixabs/* ignore unknown type of fixup */bfixnextfixabs:/* absolute fix: set location to (offset) symbol value */movr1, r1, LSR #4/* r1 <- symbol index in .dynsym */addr1, r10, r1/* r1 <- address of symbol in table */ldrr1, [r1, #4]/* r1 <- symbol value */addr1, r1, r9/* r1 <- relocated sym addr */bfixnextfixrel:/* relative fix: increase location by offset */ldrr1, [r0]//r1=[808010ac+1F339000]= 80853f68addr1, r1, r9//r1=80853f68+1F339000=重定向后的80853f68 ----74736574 printf的参数:字符串常量,位于rodatafixnext:strr1, [r0]//[808010ac+1F339000]=80853f68+1F339000//把.word中的值加上了relocation offsetaddr2, r2, #8/* each rel.dyn entry is 8 bytes;8字节一个单元 */ //r2= 808649a8 + 8=808649b0cmpr2, r3blofixloopbclear_bss****//循环至r2=0x8086D104(__dynsym_start=_rel_dyn_end)时,(uboot.dump1)**//循环至r2=8086d118(__dynsym)时,(uboot.dump1)fixloop:ldrr0, [r2]/* r0 <- location to fix up, IN FLASH! */ //r0=[8086d118]=80800000 text_base=_startaddr0, r0, r9/* r0 <- location to fix up in RAM */     //r0=80800000+1F339000=重定向后的80800000ldrr1, [r2, #4]//r1=[8086d118 + 4] =[8086d11c] = 0x000000andr7, r1, #0xff   //r7=0x000000&&0xff=0x0=0cmpr7, #23/* relative fixup? */beqfixrelcmpr7, #2/* absolute fixup? */beqfixabs/* ignore unknown type of fixup */bfixnextfixabs:/* absolute fix: set location to (offset) symbol value */movr1, r1, LSR #4/* r1 <- symbol index in .dynsym */ //r1=0addr1, r10, r1/* r1 <- address of symbol in table */  //r1=0+0x8086D104=0x8086D104ldrr1, [r1, #4]/* r1 <- symbol value */            //r1=[8086d108]//not found in dumpaddr1, r1, r9/* r1 <- relocated sym addr */bfixnextfixrel:/* relative fix: increase location by offset */ldrr1, [r0]//r1=[808010ac+1F339000]= 80853f68addr1, r1, r9//r1=80853f68+1F339000=重定向后的80853f68 ----74736574 printf的参数:字符串常量,位于rodatafixnext:strr1, [r0]//[808010ac+1F339000]=80853f68+1F339000//把.word中的值加上了relocation offsetaddr2, r2, #8/* each rel.dyn entry is 8 bytes;8字节一个单元 */ r2= 808649a8 + 8=808649b0cmpr2, r3blofixloopbclear_bss

0 0
原创粉丝点击