home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 August - Disc 3 / chip_20018103_hu.iso / amiga / chiputil / gg / loadelfwos.lha / LoadElfWOS.lzx / src / relocelf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-11-30  |  1.7 KB  |  66 lines

  1. #include "error.h"
  2. #include "relocelf.h"
  3. #include "elf/common.h"
  4. #include "elf/relocs.h"
  5. #include "elf/external.h"
  6.  
  7. int reloc_elfobj(PElfObject *obj)
  8. {
  9.     int i,j;
  10.     unsigned long temp;
  11.     unsigned short *sptr;
  12.     unsigned long *lptr;
  13.     for(i=0;i<obj->sectcnt;i++)
  14.         if(obj->sections[i].type==SHT_RELA)
  15.         {
  16.             Elf32_External_Rela *relocptr=(Elf32_External_Rela *)obj->sections[i].elfadr;
  17.             char *targetptr=(char *)obj->sections[obj->sections[i].info].virtadr;
  18.             for(j=0;j<obj->sections[i].size/sizeof(Elf32_External_Rela);j++)
  19.             {
  20.                 switch(ELF32_R_TYPE(relocptr[j].r_info))
  21.                 {
  22.  
  23.     case R_PPC_ADDR32:
  24.         lptr=(unsigned long *)&targetptr[relocptr[j].r_offset];
  25.         temp=obj->symbols[ELF32_R_SYM(relocptr[j].r_info)].value;
  26.         temp+=relocptr[j].r_addend;
  27.         *lptr=temp;
  28.         break;
  29.         
  30.  
  31.     case R_PPC_REL24:
  32.         lptr=(unsigned long *)&targetptr[relocptr[j].r_offset];
  33.         temp=obj->symbols[ELF32_R_SYM(relocptr[j].r_info)].value-(unsigned long)lptr;
  34.         temp+=relocptr[j].r_addend;
  35.         *lptr=((*lptr)&0xfc000003)|(temp&0x3fffffc);
  36.         break;
  37.         
  38.  
  39.     case R_PPC_ADDR16_LO:
  40.         sptr=(unsigned short *)&targetptr[relocptr[j].r_offset];
  41.         temp=obj->symbols[ELF32_R_SYM(relocptr[j].r_info)].value;
  42.         temp+=relocptr[j].r_addend;
  43.         *sptr=temp&0xffff;
  44.         break;
  45.  
  46.     case R_PPC_ADDR16_HA:
  47.         sptr=(unsigned short *)&targetptr[relocptr[j].r_offset];
  48.         temp=obj->symbols[ELF32_R_SYM(relocptr[j].r_info)].value;
  49.         temp+=relocptr[j].r_addend;
  50.         *sptr=temp>>16;
  51.         if((temp&0x8000)!=0L)
  52.             *sptr+=1;
  53.         break;
  54.  
  55.     default:
  56.         error_printf("Unknown Reloc-Type : %i, %s in Section %s !",ELF32_R_TYPE(relocptr[j].r_info),
  57.                         obj->symbols[ELF32_R_SYM(relocptr[j].r_info)].name,
  58.                         obj->sections[i].name);
  59.         return 0L;
  60.                 }
  61.             }
  62.         }
  63.  
  64.     return 1L;
  65. }
  66.