[BACK]Return to mdreloc.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / libexec / ld.elf_so / arch / sh3

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/libexec/ld.elf_so/arch/sh3/mdreloc.c between version 1.1 and 1.2

version 1.1, 2002/09/05 15:38:30 version 1.2, 2002/09/05 18:25:47
Line 10  _rtld_setup_pltgot(const Obj_Entry *obj)
Line 10  _rtld_setup_pltgot(const Obj_Entry *obj)
         obj->pltgot[1] = (Elf_Addr) obj;          obj->pltgot[1] = (Elf_Addr) obj;
         obj->pltgot[2] = (Elf_Addr) &_rtld_bind_start;          obj->pltgot[2] = (Elf_Addr) &_rtld_bind_start;
 }  }
   
   int
   _rtld_relocate_nonplt_object(obj, rela, dodebug)
           Obj_Entry *obj;
           const Elf_Rela *rela;
           bool dodebug;
   {
           Elf_Addr        *where = (Elf_Addr *)(obj->relocbase + rela->r_offset);
           const Elf_Sym   *def;
           const Obj_Entry *defobj;
           Elf_Addr         tmp;
   
           switch (ELF_R_TYPE(rela->r_info)) {
   
           case R_TYPE(NONE):
                   break;
   
   #if 1 /* XXX should not occur */
           case R_TYPE(GOT32):
                   def = _rtld_find_symdef(rela->r_info, obj, &defobj, false);
                   if (def == NULL)
                           return -1;
   
                   tmp = (Elf_Addr)(defobj->relocbase + def->st_value +
                       rela->r_addend);
                   if (*where != tmp)
                           *where = tmp;
                   rdbg(dodebug, ("GOT32 %s in %s --> %p in %s",
                       defobj->strtab + def->st_name, obj->path,
                       (void *)*where, defobj->path));
                   break;
   
           case R_TYPE(REL32):
                   def = _rtld_find_symdef(rela->r_info, obj, &defobj, false);
                   if (def == NULL)
                           return -1;
   
                   *where += (Elf_Addr)(defobj->relocbase + def->st_value +
                       rela->r_addend) - (Elf_Addr)where;
                   rdbg(dodebug, ("PC32 %s in %s --> %p in %s",
                       defobj->strtab + def->st_name, obj->path,
                       (void *)*where, defobj->path));
                   break;
   #endif
   
           case R_TYPE(DIR32):
                   def = _rtld_find_symdef(rela->r_info, obj, &defobj, false);
                   if (def == NULL)
                           return -1;
   
                   *where += (Elf_Addr)(defobj->relocbase + def->st_value +
                       rela->r_addend);
                   rdbg(dodebug, ("32 %s in %s --> %p in %s",
                       defobj->strtab + def->st_name, obj->path,
                       (void *)*where, defobj->path));
                   break;
   
           case R_TYPE(GLOB_DAT):
                   def = _rtld_find_symdef(rela->r_info, obj, &defobj, false);
                   if (def == NULL)
                           return -1;
   
                   tmp = (Elf_Addr)(defobj->relocbase + def->st_value) +
                       rela->r_addend;
                   if (*where != tmp)
                           *where = tmp;
                   rdbg(dodebug, ("GLOB_DAT %s in %s --> %p in %s",
                       defobj->strtab + def->st_name, obj->path,
                       (void *)*where, defobj->path));
                   break;
   
           case R_TYPE(RELATIVE):
                   if (rela->r_addend)
                           *where = (Elf_Addr)obj->relocbase + rela->r_addend;
                   else
                           *where += (Elf_Addr)obj->relocbase;
                   rdbg(dodebug, ("RELATIVE in %s --> %p", obj->path,
                       (void *)*where));
                   break;
   
           case R_TYPE(COPY):
                   /*
                    * These are deferred until all other relocations have
                    * been done.  All we do here is make sure that the COPY
                    * relocation is not in a shared library.  They are allowed
                    * only in executable files.
                    */
                   if (!obj->mainprog) {
                           _rtld_error(
                           "%s: Unexpected R_COPY relocation in shared library",
                               obj->path);
                           return -1;
                   }
                   rdbg(dodebug, ("COPY (avoid in main)"));
                   break;
   
           default:
                   def = _rtld_find_symdef(rela->r_info, obj, &defobj, true);
                   rdbg(dodebug, ("sym = %lu, type = %lu, offset = %p, "
                       "addend = %p, contents = %p, symbol = %s",
                       (u_long)ELF_R_SYM(rela->r_info),
                       (u_long)ELF_R_TYPE(rela->r_info),
                       (void *)rela->r_offset, (void *)rela->r_addend,
                       (void *)*where,
                       def ? defobj->strtab + def->st_name : "??"));
                   _rtld_error("%s: Unsupported relocation type %ld "
                       "in non-PLT relocations\n",
                       obj->path, (u_long) ELF_R_TYPE(rela->r_info));
                   return -1;
           }
           return 0;
   }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

CVSweb <webmaster@jp.NetBSD.org>