PERFORCE change 140737 for review
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Sun Apr 27 17:43:40 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=140737
Change 140737 by gonzo at gonzo_jeeves on 2008/04/27 17:43:15
o Looks like handler for R_MIPS_REL32 brought by CS 137942
is broken for tradmips. Code from NetBSD's
libexec/ld.elf_so/arch/mips/mips_reloc.c works just fine.
Affected files ...
.. //depot/projects/mips2-jnpr/src/libexec/rtld-elf/mips/reloc.c#6 edit
Differences ...
==== //depot/projects/mips2-jnpr/src/libexec/rtld-elf/mips/reloc.c#6 (text+ko) ====
@@ -258,31 +258,23 @@
case R_TYPE(REL32):
/* 32-bit PC-relative reference */
def = obj->symtab + symnum;
- tmp = load_ptr(where);
- if (tmp == 0) {
- def = find_symdef(symnum, obj, &defobj, false, NULL);
- if (def == NULL) {
- dbg("Warning5, cant find symbole %d:%s", (int)symnum,
- obj->strtab + obj->symtab[symnum].st_name);
- } else {
- tmp = def->st_value + (Elf_Addr)defobj->relocbase;
- dbg("Correctiong symnum:%d:%s to addr:%x", (int)symnum,
- obj->strtab + obj->symtab[symnum].st_name,
- (u_int32_t)tmp
- );
- }
+ if (symnum >= obj->gotsym) {
+ tmp = load_ptr(where);
+ tmp += got[obj->local_gotno + symnum - obj->gotsym];
+ store_ptr(where, tmp);
+ break;
} else {
- tmp += (Elf_Addr)obj->relocbase;
+ tmp = load_ptr(where);
+
+ if (def->st_info ==
+ ELF_ST_INFO(STB_LOCAL, STT_SECTION)
+ )
+ tmp += (Elf_Addr)def->st_value;
+
+ tmp += (Elf_Addr)obj->relocbase;
+ store_ptr(where, tmp);
}
- store_ptr(where, tmp);
- if (tmp == (Elf_Addr)obj->relocbase) {
- dbg("rel sym %p falls on relocbase symidx:%x symbol:%s", rel,
- (uint32_t)ELF_R_SYM(rel->r_info),
- obj->strtab + obj->symtab[symnum].st_name
- );
- }
break;
-
default:
dbg("sym = %lu, type = %lu, offset = %p, "
"contents = %p, symbol = %s",
More information about the p4-projects
mailing list