Date: Fri, 26 Apr 2002 02:00:56 -0700 From: Marcel Moolenaar <marcel@xcllnt.net> To: arch@FreeBSD.org Subject: RTLD fix: part 2: ld-elf.so Message-ID: <20020426090056.GA43410@athlon.pn.xcllnt.net>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Gang,
Part 2 of the RTLD fix.
Tested on: alpha, ia64
Compiles on: i386
Please review,
--
Marcel Moolenaar USPA: A-39004 marcel@xcllnt.net
[-- Attachment #2 --]
Index: rtld.c
===================================================================
RCS file: /home/ncvs/src/libexec/rtld-elf/rtld.c,v
retrieving revision 1.63
diff -u -r1.63 rtld.c
--- rtld.c 2 Apr 2002 02:19:02 -0000 1.63
+++ rtld.c 26 Apr 2002 08:52:02 -0000
@@ -854,20 +854,27 @@
ref = refobj->symtab + symnum;
name = refobj->strtab + ref->st_name;
- hash = elf_hash(name);
defobj = NULL;
- /* Handle STT_SECTION specially. */
- if (ELF_ST_TYPE(ref->st_info) == STT_SECTION) {
- if (ELF_ST_BIND(ref->st_info) != STB_LOCAL ||
- ref->st_shndx != symnum) {
+ /*
+ * We don't have to do a full scale lookup if the symbol is local.
+ * We know it will bind to the instance in this load module; to
+ * which we already have a pointer (ie ref). By not doing a lookup,
+ * we not only improve performance, but it also avoids unresolvable
+ * symbols when local symbols are not in the hash table. This has
+ * been seen with the ia64 toolchain.
+ */
+ if (ELF_ST_BIND(ref->st_info) != STB_LOCAL) {
+ if (ELF_ST_TYPE(ref->st_info) == STT_SECTION) {
_rtld_error("%s: Bogus symbol table entry %lu", refobj->path,
symnum);
}
+ hash = elf_hash(name);
+ def = symlook_default(name, hash, refobj, &defobj, in_plt);
+ } else {
def = ref;
defobj = refobj;
- } else
- def = symlook_default(name, hash, refobj, &defobj, in_plt);
+ }
/*
* If we found no definition and the reference is weak, treat the
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020426090056.GA43410>
