Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
_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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}