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