svn commit: branches/uClibc-nptl/ldso/ldso/x86_64

sjhill at uclibc.org sjhill at uclibc.org
Sat Jan 14 19:18:53 UTC 2006


Author: sjhill
Date: 2006-01-14 11:18:52 -0800 (Sat, 14 Jan 2006)
New Revision: 13316

Log:
Merge from trunk.


Added:
   branches/uClibc-nptl/ldso/ldso/x86_64/resolve.S

Modified:
   branches/uClibc-nptl/ldso/ldso/x86_64/
   branches/uClibc-nptl/ldso/ldso/x86_64/dl-debug.h
   branches/uClibc-nptl/ldso/ldso/x86_64/elfinterp.c


Changeset:

Property changes on: branches/uClibc-nptl/ldso/ldso/x86_64
___________________________________________________________________
Name: svn:ignore
   + *.os
*.oS


Modified: branches/uClibc-nptl/ldso/ldso/x86_64/dl-debug.h
===================================================================
--- branches/uClibc-nptl/ldso/ldso/x86_64/dl-debug.h	2006-01-14 10:18:12 UTC (rev 13315)
+++ branches/uClibc-nptl/ldso/ldso/x86_64/dl-debug.h	2006-01-14 19:18:52 UTC (rev 13316)
@@ -30,7 +30,10 @@
  */
 
 static const char *_dl_reltypes_tab[] = {
-	[0] "R_X86_64_NONE",     "R_X86_64_64",       "R_X86_64_PC32",     "R_X86_64_GOT32",
-	[4] "R_X86_64_PLT32",    "R_X86_64_COPY",     "R_X86_64_GLOB_DAT", "R_X86_64_JUMP_SLOT",
-	[8] "R_X86_64_RELATIVE", "R_X86_64_GOTPCREL", "R_X86_64_32"
+	[ 0] "R_X86_64_NONE",     "R_X86_64_64",       "R_X86_64_PC32",     "R_X86_64_GOT32",
+	[ 4] "R_X86_64_PLT32",    "R_X86_64_COPY",     "R_X86_64_GLOB_DAT", "R_X86_64_JUMP_SLOT",
+	[ 8] "R_X86_64_RELATIVE", "R_X86_64_GOTPCREL", "R_X86_64_32",       "R_X86_64_32S",
+	[12] "R_X86_64_16",       "R_X86_64_PC16",     "R_X86_64_8",        "R_X86_64_PC8",
+	[16] "R_X86_64_DTPMOD64", "R_X86_64_DTPOFF64", "R_X86_64_TPOFF64",  "R_X86_64_TLSGD",
+	[20] "R_X86_64_TLSLD",    "R_X86_64_DTPOFF32", "R_X86_64_GOTTPOFF", "R_X86_64_TPOFF32"
 };

Modified: branches/uClibc-nptl/ldso/ldso/x86_64/elfinterp.c
===================================================================
--- branches/uClibc-nptl/ldso/ldso/x86_64/elfinterp.c	2006-01-14 10:18:12 UTC (rev 13315)
+++ branches/uClibc-nptl/ldso/ldso/x86_64/elfinterp.c	2006-01-14 19:18:52 UTC (rev 13316)
@@ -165,6 +165,7 @@
 	int reloc_type;
 	int symtab_index;
 	char *symname;
+	ElfW(Sym) *sym;
 	ElfW(Addr) *reloc_addr;
 	ElfW(Addr) symbol_addr;
 #if defined (__SUPPORT_LD_DEBUG__)
@@ -174,8 +175,9 @@
 	reloc_addr = (ElfW(Addr)*)(tpnt->loadaddr + (unsigned long)rpnt->r_offset);
 	reloc_type = ELF_R_TYPE(rpnt->r_info);
 	symtab_index = ELF_R_SYM(rpnt->r_info);
+	sym = &symtab[symtab_index];
 	symbol_addr = 0;
-	symname = strtab + symtab[symtab_index].st_name;
+	symname = strtab + sym->st_name;
 
 	if (symtab_index) {
 		symbol_addr = (ElfW(Addr))_dl_find_hash(symname, scope, tpnt,
@@ -185,7 +187,7 @@
 		 * might have been intentional.  We should not be linking local
 		 * symbols here, so all bases should be covered.
 		 */
-		if (unlikely(!symbol_addr && ELF_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK)) {
+		if (unlikely(!symbol_addr && ELF_ST_BIND(sym->st_info) != STB_WEAK)) {
 			_dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname);
 			_dl_exit(1);
 		};
@@ -209,7 +211,7 @@
 
 		case R_X86_64_GLOB_DAT:
 		case R_X86_64_JUMP_SLOT:
-			*reloc_addr = symbol_addr;
+			*reloc_addr = symbol_addr + rpnt->r_addend;
 			break;
 
 		/* handled by elf_machine_relative()
@@ -217,33 +219,33 @@
 			*reloc_addr = map->l_addr + rpnt->r_addend;
 			break;
 		*/
-#if 0
 		case R_X86_64_DTPMOD64:
+			*reloc_addr = 1;
 			break;
 		case R_X86_64_DTPOFF64:
-			*reloc_addr = symbol_addr + rpnt->r_addend;
+			*reloc_addr = sym->st_value + rpnt->r_addend;
 			break;
 		case R_X86_64_TPOFF64:
-			*reloc_addr = symbol_addr + rpnt->r_addend;
+			*reloc_addr = sym->st_value + rpnt->r_addend - symbol_addr;
 			break;
 		case R_X86_64_32:
-			*reloc_addr = symbol_addr + rpnt->r_addend;
+			*(unsigned int *) reloc_addr = symbol_addr + rpnt->r_addend;
+			/* XXX: should check for overflow eh ? */
 			break;
 
-#endif
 		case R_X86_64_COPY:
 			if (symbol_addr) {
 #if defined (__SUPPORT_LD_DEBUG__)
 				if (_dl_debug_move)
 					_dl_dprintf(_dl_debug_file,
 						    "\t%s move %d bytes from %x to %x\n",
-						    symname, symtab[symtab_index].st_size,
+						    symname, sym->st_size,
 						    symbol_addr, reloc_addr);
 #endif
 
 				_dl_memcpy((char *)reloc_addr,
 					   (char *)symbol_addr,
-					   symtab[symtab_index].st_size);
+					   sym->st_size);
 			} else
 				_dl_dprintf(_dl_debug_file, "no symbol_addr to copy !?\n");
 			break;
@@ -261,7 +263,6 @@
 	return 0;
 }
 
-#if 0
 static int
 _dl_do_lazy_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope,
 		  ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab)
@@ -288,7 +289,7 @@
 		case R_X86_64_NONE:
 			break;
 		case R_X86_64_JUMP_SLOT:
-			*reloc_addr = tpnt->loadaddr + symtab[symtab_index].st_value;
+			*reloc_addr += (unsigned long)tpnt->loadaddr;
 			break;
 		default:
 			_dl_exit(1);
@@ -302,17 +303,13 @@
 
 	return 0;
 }
-#endif
 
 void
 _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt,
 				      unsigned long rel_addr,
 				      unsigned long rel_size)
 {
-	_dl_parse_relocation_information(rpnt, rel_addr, rel_size);
-/*	jump slot isnt working
 	(void)_dl_parse(rpnt->dyn, NULL, rel_addr, rel_size, _dl_do_lazy_reloc);
-*/
 }
 
 int

Copied: branches/uClibc-nptl/ldso/ldso/x86_64/resolve.S (from rev 13245, trunk/uClibc/ldso/ldso/x86_64/resolve.S)




More information about the uClibc-cvs mailing list