diff options
Diffstat (limited to 'libexec/ld.so')
-rw-r--r-- | libexec/ld.so/alpha/rtld_machine.c | 18 | ||||
-rw-r--r-- | libexec/ld.so/amd64/rtld_machine.c | 15 | ||||
-rw-r--r-- | libexec/ld.so/arm/rtld_machine.c | 18 | ||||
-rw-r--r-- | libexec/ld.so/hppa/rtld_machine.c | 28 | ||||
-rw-r--r-- | libexec/ld.so/i386/rtld_machine.c | 15 | ||||
-rw-r--r-- | libexec/ld.so/loader.c | 6 | ||||
-rw-r--r-- | libexec/ld.so/mips64/rtld_machine.c | 40 | ||||
-rw-r--r-- | libexec/ld.so/powerpc/rtld_machine.c | 33 | ||||
-rw-r--r-- | libexec/ld.so/resolve.c | 40 | ||||
-rw-r--r-- | libexec/ld.so/resolve.h | 10 | ||||
-rw-r--r-- | libexec/ld.so/sparc/rtld_machine.c | 16 | ||||
-rw-r--r-- | libexec/ld.so/sparc64/rtld_machine.c | 16 |
12 files changed, 131 insertions, 124 deletions
diff --git a/libexec/ld.so/alpha/rtld_machine.c b/libexec/ld.so/alpha/rtld_machine.c index d64b1fd89cb..53067ec4f08 100644 --- a/libexec/ld.so/alpha/rtld_machine.c +++ b/libexec/ld.so/alpha/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.32 2005/09/16 23:19:41 drahn Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.33 2005/09/21 23:12:09 drahn Exp $ */ /* * Copyright (c) 1999 Dale Rahn @@ -98,7 +98,7 @@ _dl_md_reloc(elf_object_t *object, int rel, int relasz) ooff = _dl_find_symbol_bysym(object, ELF64_R_SYM(relas->r_info), &this, SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_NOTPLT, - sym->st_size, NULL); + sym, NULL); if (this == NULL) goto resolve_failed; *r_addr += ooff + this->st_value + relas->r_addend; @@ -123,7 +123,7 @@ _dl_printf("unaligned RELATIVE: %p type: %d %s 0x%lx -> 0x%lx\n", r_addr, case R_TYPE(JMP_SLOT): ooff = _dl_find_symbol(symn, &this, SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, - sym->st_size, object, NULL); + sym, object, NULL); if (this == NULL) goto resolve_failed; *r_addr = ooff + this->st_value + relas->r_addend; @@ -132,7 +132,7 @@ _dl_printf("unaligned RELATIVE: %p type: %d %s 0x%lx -> 0x%lx\n", r_addr, ooff = _dl_find_symbol_bysym(object, ELF64_R_SYM(relas->r_info), &this, SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_NOTPLT, - sym->st_size, NULL); + sym, NULL); if (this == NULL) goto resolve_failed; *r_addr = ooff + this->st_value + relas->r_addend; @@ -186,7 +186,7 @@ _dl_bind(elf_object_t *object, int reloff) addr = (Elf_Addr *)(object->load_offs + rela->r_offset); this = NULL; ooff = _dl_find_symbol(symn, &this, - SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym->st_size, + SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, NULL); if (this == NULL) { _dl_printf("lazy binding failed!\n"); @@ -231,13 +231,13 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->got_size = 0; this = NULL; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_size = ooff + this->st_value - object->got_addr; @@ -245,13 +245,13 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->plt_size = 0; this = NULL; ooff = _dl_find_symbol("__plt_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) plt_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__plt_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->plt_size = ooff + this->st_value - plt_addr; diff --git a/libexec/ld.so/amd64/rtld_machine.c b/libexec/ld.so/amd64/rtld_machine.c index 2dd82c91183..9bd9826e683 100644 --- a/libexec/ld.so/amd64/rtld_machine.c +++ b/libexec/ld.so/amd64/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.8 2005/09/16 23:19:41 drahn Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.9 2005/09/21 23:12:09 drahn Exp $ */ /* * Copyright (c) 2002,2004 Dale Rahn @@ -238,7 +238,7 @@ _dl_md_reloc(elf_object_t *object, int rel, int relsz) SYM_SEARCH_ALL|SYM_WARNNOTFOUND| ((type == R_TYPE(JUMP_SLOT))? SYM_PLT:SYM_NOTPLT), - sym->st_size, NULL); + sym, NULL); if (this == NULL) { resolve_failed: _dl_printf("%s: %s: can't resolve " @@ -261,18 +261,17 @@ resolve_failed: void *dstaddr = where; const void *srcaddr; const Elf_Sym *dstsym = sym, *srcsym = NULL; - size_t size = dstsym->st_size; Elf_Addr soff; soff = _dl_find_symbol(symn, &srcsym, SYM_SEARCH_OTHER|SYM_WARNNOTFOUND| ((type == R_TYPE(JUMP_SLOT)) ? SYM_PLT:SYM_NOTPLT), - size, object, NULL); + dstsym, object, NULL); if (srcsym == NULL) goto resolve_failed; srcaddr = (void *)(soff + srcsym->st_value); - _dl_bcopy(srcaddr, dstaddr, size); + _dl_bcopy(srcaddr, dstaddr, dstsym->st_size); continue; } @@ -354,7 +353,7 @@ _dl_bind(elf_object_t *object, int index) addr = (Elf_Word *)(object->load_offs + rel->r_offset); this = NULL; ooff = _dl_find_symbol(symn, &this, - SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym->st_size, + SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, NULL); if (this == NULL) { _dl_printf("lazy binding failed!\n"); @@ -406,13 +405,13 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->got_size = 0; this = NULL; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_size = ooff + this->st_value - object->got_addr; diff --git a/libexec/ld.so/arm/rtld_machine.c b/libexec/ld.so/arm/rtld_machine.c index 15d91736abf..b02306f7e2f 100644 --- a/libexec/ld.so/arm/rtld_machine.c +++ b/libexec/ld.so/arm/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.7 2005/09/16 23:19:42 drahn Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.8 2005/09/21 23:12:10 drahn Exp $ */ /* * Copyright (c) 2004 Dale Rahn @@ -239,7 +239,7 @@ _dl_md_reloc(elf_object_t *object, int rel, int relsz) SYM_SEARCH_ALL|SYM_WARNNOTFOUND| ((type == R_TYPE(JUMP_SLOT)) ? SYM_PLT : SYM_NOTPLT), - sym->st_size, NULL); + sym, NULL); if (this == NULL) { resolve_failed: _dl_printf("%s: %s: can't resolve " @@ -265,17 +265,16 @@ resolve_failed: void *dstaddr = where; const void *srcaddr; const Elf_Sym *dstsym = sym, *srcsym = NULL; - size_t size = dstsym->st_size; Elf_Addr soff; soff = _dl_find_symbol(symn, &srcsym, SYM_SEARCH_OTHER|SYM_WARNNOTFOUND|SYM_NOTPLT, - size, object, NULL); + dstsym, object, NULL); if (srcsym == NULL) goto resolve_failed; srcaddr = (void *)(soff + srcsym->st_value); - _dl_bcopy(srcaddr, dstaddr, size); + _dl_bcopy(srcaddr, dstaddr, dstsym->st_size); continue; } @@ -347,15 +346,13 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->got_size = 0; this = NULL; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, - object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, - object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_size = ooff + this->st_value - object->got_addr; @@ -409,8 +406,9 @@ _dl_bind(elf_object_t *object, int relidx) sym += ELF_R_SYM(rel->r_info); symn = object->dyn.strtab + sym->st_name; + this = NULL; ooff = _dl_find_symbol(symn, &this, - SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym->st_size, + SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, NULL); if (this == NULL) { _dl_printf("lazy binding failed!\n"); diff --git a/libexec/ld.so/hppa/rtld_machine.c b/libexec/ld.so/hppa/rtld_machine.c index a7005d41e05..da5602f748a 100644 --- a/libexec/ld.so/hppa/rtld_machine.c +++ b/libexec/ld.so/hppa/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.8 2005/09/16 23:19:42 drahn Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.9 2005/09/21 23:12:10 drahn Exp $ */ /* * Copyright (c) 2004 Michael Shalayeff @@ -152,18 +152,19 @@ _dl_md_reloc(elf_object_t *object, int rel, int relasz) if (type == RELOC_NONE) continue; - this = sym = object->dyn.symtab + ELF_R_SYM(rela->r_info); + sym = object->dyn.symtab + ELF_R_SYM(rela->r_info); sobj = object; symn = object->dyn.strtab + sym->st_name; pt = (Elf_Addr *)(rela->r_offset + loff); ooff = 0; + this = NULL; if (ELF_R_SYM(rela->r_info) && sym->st_name) { ooff = _dl_find_symbol_bysym(object, ELF_R_SYM(rela->r_info), &this, SYM_SEARCH_ALL|SYM_NOWARNNOTFOUND| ((type == RELOC_DIR32) ? SYM_NOTPLT : SYM_PLT), - sym->st_size, &sobj); + sym, &sobj); if (!this) { _dl_printf("%s: %s: can't resolve reference '%s'\n", _dl_progname, object->load_name, symn); @@ -234,21 +235,23 @@ _dl_md_reloc(elf_object_t *object, int rel, int relasz) break; case RELOC_COPY: + { + const Elf32_Sym *cpysrc = NULL; size = sym->st_size; - ooff = _dl_find_symbol(symn, &sym, + ooff = _dl_find_symbol(symn, &cpysrc, SYM_SEARCH_OTHER|SYM_WARNNOTFOUND|SYM_NOTPLT, - size, object, NULL); - if (sym) { - _dl_bcopy((void *)(ooff + sym->st_value), + sym, object, NULL); + if (cpysrc) { + _dl_bcopy((void *)(ooff + cpysrc->st_value), pt, sym->st_size); DL_DEB(("[%x]COPY: %s[%x]:%s -> %p[%x] in %s\n", - i, symn, ooff + sym->st_value, + i, symn, ooff + cpysrc->st_value, object->load_name, pt, sym->st_size, sobj->load_name)); } else DL_DEB(("[%x]COPY: no sym\n", i)); break; - + } default: DL_DEB(("[%x]UNKNOWN(%d): type=%d off=0x%lx " "addend=0x%lx rel=0x%x\n", i, type, @@ -278,13 +281,13 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->got_size = 0; this = NULL; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, object, NULL ); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL ); if (this != NULL) object->got_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_size = ooff + this->st_value - object->got_addr; @@ -344,8 +347,7 @@ _dl_bind(elf_object_t *object, int reloff) addr = (Elf_Addr *)(object->load_offs + rela->r_offset); this = NULL; ooff = _dl_find_symbol(symn, &this, - SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym->st_size, - object, &sobj); + SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj); if (this == NULL) { _dl_printf("lazy binding failed!\n"); *((int *)0) = 0; /* XXX */ diff --git a/libexec/ld.so/i386/rtld_machine.c b/libexec/ld.so/i386/rtld_machine.c index 6c891593490..d6b9c188868 100644 --- a/libexec/ld.so/i386/rtld_machine.c +++ b/libexec/ld.so/i386/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.17 2005/09/16 23:19:42 drahn Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.18 2005/09/21 23:12:10 drahn Exp $ */ /* * Copyright (c) 2002 Dale Rahn @@ -231,7 +231,7 @@ _dl_md_reloc(elf_object_t *object, int rel, int relsz) SYM_SEARCH_ALL|SYM_WARNNOTFOUND| ((type == R_TYPE(JUMP_SLOT))? SYM_PLT:SYM_NOTPLT), - sym->st_size, NULL); + sym, NULL); if (this == NULL) { resolve_failed: _dl_printf("%s: %s: can't resolve " @@ -260,7 +260,7 @@ resolve_failed: soff = _dl_find_symbol(symn, &srcsym, SYM_SEARCH_OTHER|SYM_WARNNOTFOUND| ((type == R_TYPE(JUMP_SLOT)) ? SYM_PLT:SYM_NOTPLT), - size, object, NULL); + sym, object, NULL); if (srcsym == NULL) goto resolve_failed; @@ -357,8 +357,7 @@ _dl_bind(elf_object_t *object, int index) addr = (Elf_Word *)(object->load_offs + rel->r_offset); this = NULL; ooff = _dl_find_symbol(symn, &this, - SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym->st_size, - object, NULL); + SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, NULL); if (this == NULL) { _dl_printf("lazy binding failed!\n"); *((int *)0) = 0; /* XXX */ @@ -408,15 +407,13 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->got_size = 0; this = NULL; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, - object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, - object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_size = ooff + this->st_value - object->got_addr; diff --git a/libexec/ld.so/loader.c b/libexec/ld.so/loader.c index ef92ae03fb6..5fe58a3f1e3 100644 --- a/libexec/ld.so/loader.c +++ b/libexec/ld.so/loader.c @@ -1,4 +1,4 @@ -/* $OpenBSD: loader.c,v 1.88 2005/09/19 02:31:04 drahn Exp $ */ +/* $OpenBSD: loader.c,v 1.89 2005/09/21 23:12:09 drahn Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -507,7 +507,7 @@ _dl_boot(const char **argv, char **envp, const long loff, long *dl_data) sym = NULL; ooff = _dl_find_symbol("atexit", &sym, SYM_SEARCH_ALL|SYM_NOWARNNOTFOUND|SYM_PLT, - 0, dyn_obj, &sobj); + NULL, dyn_obj, &sobj); if (sym == NULL) _dl_printf("cannot find atexit, destructors will not be run!\n"); else @@ -841,7 +841,7 @@ _dl_fixup_user_env(void) sym = NULL; ooff = _dl_find_symbol("environ", &sym, - SYM_SEARCH_ALL|SYM_NOWARNNOTFOUND|SYM_PLT, 0, &dummy_obj, NULL); + SYM_SEARCH_ALL|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, &dummy_obj, NULL); if (sym != NULL) *((char ***)(sym->st_value + ooff)) = _dl_so_envp; } diff --git a/libexec/ld.so/mips64/rtld_machine.c b/libexec/ld.so/mips64/rtld_machine.c index fde75a0bb4f..30acba90d3d 100644 --- a/libexec/ld.so/mips64/rtld_machine.c +++ b/libexec/ld.so/mips64/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.6 2005/09/16 23:19:42 drahn Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.7 2005/09/21 23:12:10 drahn Exp $ */ /* * Copyright (c) 1998-2004 Opsycon AB, Sweden. @@ -75,14 +75,12 @@ _dl_md_reloc(elf_object_t *object, int rel, int relsz) got_start = 0; got_end = 0; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, - object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) got_start = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, - object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) got_end = ooff + this->st_value; @@ -98,22 +96,28 @@ _dl_md_reloc(elf_object_t *object, int rel, int relsz) ooff = 0; sym = object->dyn.symtab; sym += ELF64_R_SYM(relocs->r_info); - this = sym; symn = object->dyn.strtab + sym->st_name; type = ELF64_R_TYPE(relocs->r_info); + this = NULL; if (ELF64_R_SYM(relocs->r_info) && !(ELF64_ST_BIND(sym->st_info) == STB_LOCAL && ELF64_ST_TYPE (sym->st_info) == STT_NOTYPE)) { ooff = _dl_find_symbol(symn, &this, SYM_SEARCH_ALL | SYM_NOWARNNOTFOUND | SYM_PLT, - sym->st_size, object, NULL); - if (!this && ELF64_ST_BIND(sym->st_info) == STB_GLOBAL) { - _dl_printf("%s: can't resolve reference '%s'\n", - _dl_progname, symn); - fails++; - } + sym, object, NULL); + + if (this == NULL) { + if (ELF32_ST_BIND(sym->st_info) == STB_GLOBAL) { + _dl_printf("%s: %s :can't resolve " + "reference '%s'\n", + _dl_progname, object->load_name, + symn); + fails++; + } + continue; + } } switch (ELF64_R_TYPE(relocs->r_info)) { @@ -215,15 +219,13 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->plt_size = 0; object->got_size = 0; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, - object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_start = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, - object, NULL); + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_size = ooff + this->st_value - object->got_start; @@ -239,7 +241,7 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) ooff = _dl_find_symbol(strt + symp->st_name, &this, SYM_SEARCH_ALL|SYM_NOWARNNOTFOUND|SYM_PLT, - symp->st_size, object, NULL); + symp, object, NULL); if (this) *gotp = this->st_value + ooff; } else @@ -249,7 +251,7 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) this = 0; ooff = _dl_find_symbol(strt + symp->st_name, &this, SYM_SEARCH_ALL|SYM_NOWARNNOTFOUND|SYM_PLT, - symp->st_size, object, NULL); + symp, object, NULL); if (this) *gotp = this->st_value + ooff; } else if (ELF64_ST_TYPE(symp->st_info) == STT_FUNC && @@ -259,7 +261,7 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) this = 0; ooff = _dl_find_symbol(strt + symp->st_name, &this, SYM_SEARCH_ALL|SYM_NOWARNNOTFOUND|SYM_PLT, - symp->st_size, object, NULL); + symp, object, NULL); if (this) *gotp = this->st_value + ooff; else diff --git a/libexec/ld.so/powerpc/rtld_machine.c b/libexec/ld.so/powerpc/rtld_machine.c index bb8d7eab9c1..edb3dd1aa56 100644 --- a/libexec/ld.so/powerpc/rtld_machine.c +++ b/libexec/ld.so/powerpc/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.36 2005/09/16 23:19:42 drahn Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.37 2005/09/21 23:12:11 drahn Exp $ */ /* * Copyright (c) 1999 Dale Rahn @@ -185,11 +185,10 @@ _dl_printf("object relocation size %x, numrela %x\n", sym = object->dyn.symtab; sym += ELF32_R_SYM(relas->r_info); - this = sym; symn = object->dyn.strtab + sym->st_name; ooff = 0; - + this = NULL; if (ELF32_R_SYM(relas->r_info) && !(ELF32_ST_BIND(sym->st_info) == STB_LOCAL && ELF32_ST_TYPE (sym->st_info) == STT_NOTYPE)) { @@ -197,12 +196,18 @@ _dl_printf("object relocation size %x, numrela %x\n", ELF32_R_SYM(relas->r_info), &this, SYM_SEARCH_ALL|SYM_NOWARNNOTFOUND| ((type == RELOC_JMP_SLOT) ? SYM_PLT:SYM_NOTPLT), - sym->st_size, NULL); + sym, NULL); + + if (this == NULL) { + if (ELF32_ST_BIND(sym->st_info) == STB_GLOBAL) { + _dl_printf("%s: %s :can't resolve " + "reference '%s'\n", + _dl_progname, object->load_name, + symn); - if (!this && ELF32_ST_BIND(sym->st_info) == STB_GLOBAL) { - _dl_printf("%s: %s :can't resolve reference '%s'\n", - _dl_progname, object->load_name, symn); - fails++; + fails++; + } + continue; } } @@ -380,7 +385,7 @@ _dl_printf(" symn [%s] val 0x%x\n", symn, val); src_loff = 0; src_loff = _dl_find_symbol(symn, &cpysrc, SYM_SEARCH_OTHER|SYM_NOWARNNOTFOUND| SYM_NOTPLT, - sym->st_size, object, NULL); + sym, object, NULL); if (cpysrc == NULL) { _dl_printf("symbol not found [%s] \n", symn); } else { @@ -448,14 +453,14 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->got_size = 0; this = NULL; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT|SYM_DLSYM, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT|SYM_DLSYM, NULL, object, NULL); if (this != NULL) object->got_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT|SYM_DLSYM, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT|SYM_DLSYM, NULL, object, NULL); if (this != NULL) object->got_size = ooff + this->st_value - object->got_addr; @@ -464,14 +469,14 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->plt_size = 0; this = NULL; ooff = _dl_find_symbol("__plt_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT|SYM_DLSYM, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT|SYM_DLSYM, NULL, object, NULL); if (this != NULL) plt_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__plt_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT|SYM_DLSYM, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT|SYM_DLSYM, NULL, object, NULL); if (this != NULL) object->plt_size = ooff + this->st_value - plt_addr; @@ -556,7 +561,7 @@ _dl_bind(elf_object_t *object, int reloff) r_addr = (Elf_Addr *)(object->load_offs + relas->r_offset); this = NULL; ooff = _dl_find_symbol(symn, &this, - SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym->st_size, + SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, NULL); if (this == NULL) { _dl_printf("lazy binding failed!\n"); diff --git a/libexec/ld.so/resolve.c b/libexec/ld.so/resolve.c index d79362cf0de..1a39efab9b0 100644 --- a/libexec/ld.so/resolve.c +++ b/libexec/ld.so/resolve.c @@ -1,4 +1,4 @@ -/* $OpenBSD: resolve.c,v 1.31 2005/09/19 21:08:43 kurt Exp $ */ +/* $OpenBSD: resolve.c,v 1.32 2005/09/21 23:12:09 drahn Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -211,7 +211,7 @@ int _dl_symcachestat_lookups; Elf_Addr _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, - const Elf_Sym **ref, int flags, int req_size, const elf_object_t **pobj) + const Elf_Sym **this, int flags, const Elf_Sym *ref_sym, const elf_object_t **pobj) { Elf_Addr ret; const Elf_Sym *sym; @@ -227,7 +227,7 @@ _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, _dl_symcachestat_hits++; sobj = _dl_symcache[symidx].obj; - *ref = _dl_symcache[symidx].sym; + *this = _dl_symcache[symidx].sym; if (pobj) *pobj = sobj; return sobj->load_offs; @@ -237,14 +237,14 @@ _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, sym += symidx; symn = req_obj->dyn.strtab + sym->st_name; - ret = _dl_find_symbol(symn, ref, flags, req_size, req_obj, &sobj); + ret = _dl_find_symbol(symn, this, flags, ref_sym, req_obj, &sobj); if (pobj) *pobj = sobj; if ((_dl_symcache != NULL) && (symidx < req_obj->nchains)) { - _dl_symcache[symidx].sym = *ref; + _dl_symcache[symidx].sym = *this; _dl_symcache[symidx].obj = sobj; _dl_symcache[symidx].flags = flags; } @@ -253,8 +253,9 @@ _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, } Elf_Addr -_dl_find_symbol(const char *name, const Elf_Sym **ref, - int flags, int req_size, elf_object_t *req_obj, const elf_object_t **pobj) +_dl_find_symbol(const char *name, const Elf_Sym **this, + int flags, const Elf_Sym *ref_sym, elf_object_t *req_obj, + const elf_object_t **pobj) { const Elf_Sym *weak_sym = NULL; unsigned long h = 0; @@ -273,7 +274,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, } if (req_obj->dyn.symbolic) - if (_dl_find_symbol_obj(req_obj, name, h, flags, ref, &weak_sym, + if (_dl_find_symbol_obj(req_obj, name, h, flags, this, &weak_sym, &weak_object)) { object = req_obj; found = 1; @@ -281,20 +282,20 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, } if (flags & SYM_SEARCH_OBJ) { - if (_dl_find_symbol_obj(req_obj, name, h, flags, ref, + if (_dl_find_symbol_obj(req_obj, name, h, flags, this, &weak_sym, &weak_object)) { object = req_obj; found = 1; } } else if (flags & SYM_DLSYM) { - if (_dl_find_symbol_obj(req_obj, name, h, flags, ref, + if (_dl_find_symbol_obj(req_obj, name, h, flags, this, &weak_sym, &weak_object)) { object = req_obj; found = 1; } if (weak_object != NULL && found == 0) { object=weak_object; - *ref = weak_sym; + *this = weak_sym; found = 1; } /* search dlopened obj and all children */ @@ -303,7 +304,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, TAILQ_FOREACH(n, &req_obj->load_object->dload_list, next_sib) { if (_dl_find_symbol_obj(n->data, name, h, - flags, ref, + flags, this, &weak_sym, &weak_object)) { object = n->data; found = 1; @@ -339,7 +340,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, (m->data == req_obj)) continue; if (_dl_find_symbol_obj(m->data, name, h, flags, - ref, &weak_sym, &weak_object)) { + this, &weak_sym, &weak_object)) { object = m->data; found = 1; goto found; @@ -351,7 +352,7 @@ _dl_find_symbol(const char *name, const Elf_Sym **ref, found: if (weak_object != NULL && found == 0) { object=weak_object; - *ref = weak_sym; + *this = weak_sym; found = 1; } @@ -363,8 +364,9 @@ found: return (0); } - if (req_size != (*ref)->st_size && req_size != 0 && - (ELF_ST_TYPE((*ref)->st_info) != STT_FUNC)) { + if (ref_sym != NULL && ref_sym->st_size != 0 && + (ref_sym->st_size != (*this)->st_size) && + (ELF_ST_TYPE((*this)->st_info) != STT_FUNC) ) { _dl_printf("%s:%s: %s : WARNING: " "symbol(%s) size mismatch, relink your program\n", _dl_progname, req_obj->load_name, @@ -379,7 +381,7 @@ found: int _dl_find_symbol_obj(elf_object_t *object, const char *name, unsigned long hash, - int flags, const Elf_Sym **ref, const Elf_Sym **weak_sym, + int flags, const Elf_Sym **this, const Elf_Sym **weak_sym, elf_object_t **weak_object) { const Elf_Sym *symt = object->dyn.symtab; @@ -400,7 +402,7 @@ _dl_find_symbol_obj(elf_object_t *object, const char *name, unsigned long hash, continue; symn = strt + sym->st_name; - if (sym != *ref && _dl_strcmp(symn, name)) + if (sym != *this && _dl_strcmp(symn, name)) continue; /* allow this symbol if we are referring to a function @@ -417,7 +419,7 @@ _dl_find_symbol_obj(elf_object_t *object, const char *name, unsigned long hash, } if (ELF_ST_BIND(sym->st_info) == STB_GLOBAL) { - *ref = sym; + *this = sym; return 1; } else if (ELF_ST_BIND(sym->st_info) == STB_WEAK) { if (!*weak_sym) { diff --git a/libexec/ld.so/resolve.h b/libexec/ld.so/resolve.h index 7ca2bb65b14..2930fd9fbb9 100644 --- a/libexec/ld.so/resolve.h +++ b/libexec/ld.so/resolve.h @@ -1,4 +1,4 @@ -/* $OpenBSD: resolve.h,v 1.38 2005/09/17 03:02:37 drahn Exp $ */ +/* $OpenBSD: resolve.h,v 1.39 2005/09/21 23:12:09 drahn Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -154,10 +154,12 @@ elf_object_t *_dl_tryload_shlib(const char *libname, int type, int flags); int _dl_md_reloc(elf_object_t *object, int rel, int relsz); void _dl_md_reloc_got(elf_object_t *object, int lazy); -Elf_Addr _dl_find_symbol(const char *name, const Elf_Sym **ref, - int flags, int sym_size, elf_object_t *object, const elf_object_t **pobj); +Elf_Addr _dl_find_symbol(const char *name, const Elf_Sym **this, + int flags, const Elf_Sym *ref_sym, elf_object_t *object, + const elf_object_t **pobj); Elf_Addr _dl_find_symbol_bysym(elf_object_t *req_obj, unsigned int symidx, - const Elf_Sym **ref, int flags, int req_size, const elf_object_t **pobj); + const Elf_Sym **ref, int flags, const Elf_Sym *ref_sym, + const elf_object_t **pobj); /* * defines for _dl_find_symbol() flag field, three bits of meaning * myself - clear: search all objects, set: search only this object diff --git a/libexec/ld.so/sparc/rtld_machine.c b/libexec/ld.so/sparc/rtld_machine.c index 713fcc86289..9e41e4aa401 100644 --- a/libexec/ld.so/sparc/rtld_machine.c +++ b/libexec/ld.so/sparc/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.24 2005/09/16 23:19:43 drahn Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.25 2005/09/21 23:12:11 drahn Exp $ */ /* * Copyright (c) 1999 Dale Rahn @@ -245,7 +245,7 @@ _dl_md_reloc(elf_object_t *object, int rel, int relasz) SYM_SEARCH_ALL|SYM_WARNNOTFOUND| ((type == R_TYPE(JMP_SLOT)) ? SYM_PLT : SYM_NOTPLT), - sym->st_size, NULL); + sym, NULL); if (this == NULL) { resolve_failed: _dl_printf("%s: %s: can't resolve " @@ -270,7 +270,7 @@ resolve_failed: soff = _dl_find_symbol(symn, &srcsym, SYM_SEARCH_OTHER|SYM_WARNNOTFOUND| ((type == R_TYPE(JMP_SLOT)) ? SYM_PLT : SYM_NOTPLT), - size, object, NULL); + dstsym, object, NULL); if (srcsym == NULL) goto resolve_failed; @@ -330,7 +330,7 @@ _dl_bind(elf_object_t *object, int reloff) addr = (Elf_Addr *)(object->load_offs + rela->r_offset); this = NULL; ooff = _dl_find_symbol(symn, &this, - SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym->st_size, + SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, NULL); if (this == NULL) { _dl_printf("lazy binding failed!\n"); @@ -403,14 +403,14 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->got_size = 0; this = NULL; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_size = ooff + this->st_value - object->got_addr; @@ -419,14 +419,14 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->plt_size = 0; this = NULL; ooff = _dl_find_symbol("__plt_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) plt_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__plt_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->plt_size = ooff + this->st_value - plt_addr; diff --git a/libexec/ld.so/sparc64/rtld_machine.c b/libexec/ld.so/sparc64/rtld_machine.c index 92c92db08ac..78b6db69b64 100644 --- a/libexec/ld.so/sparc64/rtld_machine.c +++ b/libexec/ld.so/sparc64/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.35 2005/09/16 23:19:43 drahn Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.36 2005/09/21 23:12:11 drahn Exp $ */ /* * Copyright (c) 1999 Dale Rahn @@ -266,7 +266,7 @@ _dl_md_reloc(elf_object_t *object, int rel, int relasz) SYM_SEARCH_ALL|SYM_WARNNOTFOUND| ((type == R_TYPE(JMP_SLOT)) ? SYM_PLT : SYM_NOTPLT), - sym->st_size, NULL); + sym, NULL); if (this == NULL) { resolve_failed: _dl_printf("%s: %s: can't resolve " @@ -294,7 +294,7 @@ resolve_failed: soff = _dl_find_symbol(symn, &srcsym, SYM_SEARCH_OTHER|SYM_WARNNOTFOUND|SYM_NOTPLT, - size, object, NULL); + dstsym, object, NULL); if (srcsym == NULL) goto resolve_failed; @@ -622,7 +622,7 @@ _dl_bind(elf_object_t *object, int index) addr = (Elf_Word *)(object->load_offs + rela->r_offset); this = NULL; ooff = _dl_find_symbol(symn, &this, - SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym->st_size, + SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, NULL); if (this == NULL) { _dl_printf("lazy binding failed!\n"); @@ -696,14 +696,14 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->got_size = 0; this = NULL; ooff = _dl_find_symbol("__got_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__got_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->got_size = ooff + this->st_value - object->got_addr; @@ -712,14 +712,14 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) object->plt_size = 0; this = NULL; ooff = _dl_find_symbol("__plt_start", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) plt_addr = ooff + this->st_value; this = NULL; ooff = _dl_find_symbol("__plt_end", &this, - SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, 0, + SYM_SEARCH_OBJ|SYM_NOWARNNOTFOUND|SYM_PLT, NULL, object, NULL); if (this != NULL) object->plt_size = ooff + this->st_value - plt_addr; |