caddr_t _rtld_bind(const Obj_Entry *obj, Elf_Word reloff) { const Elf_Rel *rel = obj->pltrel + reloff; Elf_Addr new_value = 0; /* XXX gcc */ _rtld_shared_enter(); int err = _rtld_relocate_plt_object(obj, rel, &new_value); if (err) _rtld_die(); _rtld_shared_exit(); return (caddr_t)new_value; }
_Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc, int * pcount) { const Obj_Entry *obj; _Unwind_Ptr start = NULL; int count = 0; dbg(("__gnu_Unwind_Find_exidx")); _rtld_shared_enter(); vaddr_t va = (vaddr_t)pc; for (obj = _rtld_objlist; obj != NULL; obj = obj->next) { /* * If the address we are looking for is inside this object, * we've found the object to inspect. */ if ((vaddr_t)obj->mapbase <= va && va < (vaddr_t)obj->mapbase + obj->mapsize) break; } /* * If we found an object and it has some exception data, we * need to see if the address matches a PT_LOAD section. */ if (obj != NULL && obj->exidx_start != NULL) { va -= (vaddr_t)obj->relocbase; const Elf_Phdr *ph = obj->phdr; const Elf_Phdr * const phlimit = ph + obj->phsize / sizeof(*ph); for (; ph < phlimit; ph++) { if (ph->p_type == PT_LOAD && ph->p_vaddr <= va && va < ph->p_vaddr + ph->p_memsz) { count = obj->exidx_sz / 8; start = obj->exidx_start; break; } } } _rtld_shared_exit(); /* * deal with the return values. */ *pcount = count; return start; }
caddr_t _rtld_bind(Elf_Word a0, Elf_Addr a1, Elf_Addr a2, Elf_Addr a3) { Elf_Addr *got = (Elf_Addr *)(a2 - 0x7ff0); const Obj_Entry *obj = (Obj_Entry *)(got[1] & GOT1_MASK); Elf_Addr new_value = 0; /* XXX gcc */ int err; _rtld_shared_enter(); err = _rtld_relocate_plt_object(obj, a0, &new_value); if (err) _rtld_die(); _rtld_shared_exit(); return (caddr_t)new_value; }
caddr_t _rtld_bind(const Obj_Entry *obj, Elf_Word reloff) { const Elf_Rela *rela = (const Elf_Rela *)((const uint8_t *)obj->pltrela + reloff); Elf_Addr result; int err; result = 0; /* XXX gcc */ _rtld_shared_enter(); err = _rtld_relocate_plt_object(obj, rela, &result); if (err) _rtld_die(); _rtld_shared_exit(); return (caddr_t)result; }