aboutsummaryrefslogtreecommitdiff
path: root/libexec/rtld-elf
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2002-08-20 00:24:33 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2002-08-20 00:24:33 +0000
commitecfdc2e0cdfbc23db829b838e0d33c182aee6455 (patch)
tree3a28efd10af7305f61e2290cc4c3ca60ff25ef56 /libexec/rtld-elf
parent4642178fcc602dc18b74b167f5438ed2a2a3fba8 (diff)
Notes
Diffstat (limited to 'libexec/rtld-elf')
-rw-r--r--libexec/rtld-elf/ia64/reloc.c30
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,