- 积分
- 1
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
大家好,我最近在贵FTP上下了你们的ELF Loader,对ELF格式比较感兴趣,对elfloader.cpp中的PT_DYNAMIC段不是很了解,PT_DYNAMIC是用来重定位的吧?这个段中只对DT_REL进行了解析,在解析DT_REL的时候ELF32_R_TYPE()得到值(例如R_ARM_RABS32)具体什么意思?现在疑惑的是我们这个Loader所加载的ELF程序是编译时系统库采用静态的还是动态的?(感觉应该是动态的,因为处理了DT_RET)但是对PT_DYNAMIC段为什么只处理DT_REL,处理DT_REL时只处理了R_ARM_RABS32,R_ARM_ABS32,R_ARM_RELATIVE这几个类型,对系统的函数和全局变量是怎么重定位的呢(好像没有看到GOT和PLT)?
把不理解的一段拷过来请大家指点:
m=0;
//выполним релокацию REL
if (dyn[DT_RELSZ]!=0) {
while (m*sizeof(Elf32_Rel)<dyn[DT_RELSZ]){
#ifdef wintel
cout<<"rel: of="<<hex<<((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_offset
<<" , sym_idx="<<ELF32_R_SYM(((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_info)
<<" , rel_type="<<dec<<(int) ELF32_R_TYPE(((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_info)<<endl;
#endif
Elf32_Word ri=ELF32_R_TYPE(((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_info);
if (ri!=R_ARM_RBASE)
{
if (ri==R_ARM_RABS32)
{
*((long*)(base+((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_offset))+=(long)base-minadr;
}
else
switch(ri){
case R_ARM_NONE: break; // пустой релокейшен
case R_ARM_ABS32:
#ifdef wintel
cout << "base="<<hex<<(long)base<< endl;
cout << "of="<<hex<<((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_offset-minadr<<endl;
#endif
*((long*)(base+((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_offset-minadr))+=(long)base;
break;
case R_ARM_RELATIVE: // вообще говоря не minadr а начало сегмента содержащего символ
*((long*)(base+((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_offset-minadr))+=(long)base-minadr;
break; // ignore
// case R_ARM_RABS32:
// *((long*)(base+((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_offset))+=(long)base-minadr;
// break;
// case R_ARM_RBASE: break;
default: //неизвестный тип релокации
#ifdef wintel
cout << "Invalid reloc type: " <<dec<<(unsigned)ELF32_R_TYPE(((Elf32_Rel *)(reloc+dyn[DT_REL]-phdrs[n].p_vaddr))[m].r_info) << endl;
#else
fclose(fin, &iError);
#endif
mfree(base);
mfree(reloc);
return -13;
}
请指教,多谢! |
|