diff options
| author | Marcel Moolenaar <marcel@FreeBSD.org> | 2002-08-20 00:24:33 +0000 |
|---|---|---|
| committer | Marcel Moolenaar <marcel@FreeBSD.org> | 2002-08-20 00:24:33 +0000 |
| commit | ecfdc2e0cdfbc23db829b838e0d33c182aee6455 (patch) | |
| tree | 3a28efd10af7305f61e2290cc4c3ca60ff25ef56 /libexec/rtld-elf | |
| parent | 4642178fcc602dc18b74b167f5438ed2a2a3fba8 (diff) | |
Notes
Diffstat (limited to 'libexec/rtld-elf')
| -rw-r--r-- | libexec/rtld-elf/ia64/reloc.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/libexec/rtld-elf/ia64/reloc.c b/libexec/rtld-elf/ia64/reloc.c index 5a054c851aad..ea58f079c362 100644 --- a/libexec/rtld-elf/ia64/reloc.c +++ b/libexec/rtld-elf/ia64/reloc.c @@ -170,6 +170,36 @@ reloc_non_plt_obj(Obj_Entry *obj_rtld, Obj_Entry *obj, const Elf_Rela *rela, break; } + case R_IA64_IPLTLSB: { + /* + * Relocation typically used to populate C++ virtual function + * tables. It creates a 128-bit function descriptor at the + * specified memory address. + */ + const Elf_Sym *def; + const Obj_Entry *defobj; + struct fptr *fptr; + Elf_Addr target, gp; + + def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, + false, cache); + if (def == NULL) + return -1; + + if (def->st_shndx != SHN_UNDEF) { + target = (Elf_Addr)(defobj->relocbase + def->st_value); + gp = (Elf_Addr)defobj->pltgot; + } else { + target = 0; + gp = 0; + } + + fptr = (void*)where; + store64(&fptr->target, target); + store64(&fptr->gp, gp); + break; + } + default: _rtld_error("%s: Unsupported relocation type %d" " in non-PLT relocations\n", obj->path, |
