|  | @@ -156,6 +156,7 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
 | 
											
												
													
														|  |  	unsigned long symbol_addr;
 |  |  	unsigned long symbol_addr;
 | 
											
												
													
														|  |  	int reloc_type, symtab_index;
 |  |  	int reloc_type, symtab_index;
 | 
											
												
													
														|  |  	struct elf_resolve *tpnt = xpnt->dyn;
 |  |  	struct elf_resolve *tpnt = xpnt->dyn;
 | 
											
												
													
														|  | 
 |  | +	char *symname = NULL;
 | 
											
												
													
														|  |  #if defined (__SUPPORT_LD_DEBUG__)
 |  |  #if defined (__SUPPORT_LD_DEBUG__)
 | 
											
												
													
														|  |  	unsigned long old_val=0;
 |  |  	unsigned long old_val=0;
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
										
											
												
													
														|  | @@ -169,7 +170,6 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
 | 
											
												
													
														|  |  	got = (unsigned long *) tpnt->dynamic_info[DT_PLTGOT];
 |  |  	got = (unsigned long *) tpnt->dynamic_info[DT_PLTGOT];
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	for (i = 0; i < rel_size; i++, rpnt++) {
 |  |  	for (i = 0; i < rel_size; i++, rpnt++) {
 | 
											
												
													
														|  | -		char *symname = NULL;
 |  | 
 | 
											
												
													
														|  |  		reloc_addr = (unsigned long *) (tpnt->loadaddr +
 |  |  		reloc_addr = (unsigned long *) (tpnt->loadaddr +
 | 
											
												
													
														|  |  			(unsigned long) rpnt->r_offset);
 |  |  			(unsigned long) rpnt->r_offset);
 | 
											
												
													
														|  |  		reloc_type = ELF32_R_TYPE(rpnt->r_info);
 |  |  		reloc_type = ELF32_R_TYPE(rpnt->r_info);
 | 
											
										
											
												
													
														|  | @@ -178,13 +178,13 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  		debug_sym(symtab,strtab,symtab_index);
 |  |  		debug_sym(symtab,strtab,symtab_index);
 | 
											
												
													
														|  |  		debug_reloc(symtab,strtab,rpnt);
 |  |  		debug_reloc(symtab,strtab,rpnt);
 | 
											
												
													
														|  | 
 |  | +		symname = strtab + symtab[symtab_index].st_name;
 | 
											
												
													
														|  |  #if defined (__SUPPORT_LD_DEBUG__)
 |  |  #if defined (__SUPPORT_LD_DEBUG__)
 | 
											
												
													
														|  |  		if (reloc_addr)
 |  |  		if (reloc_addr)
 | 
											
												
													
														|  |  			old_val = *reloc_addr;
 |  |  			old_val = *reloc_addr;
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  		if (reloc_type == R_MIPS_JUMP_SLOT || reloc_type == R_MIPS_COPY) {
 |  |  		if (reloc_type == R_MIPS_JUMP_SLOT || reloc_type == R_MIPS_COPY) {
 | 
											
												
													
														|  | -			symname = strtab + symtab[symtab_index].st_name;
 |  | 
 | 
											
												
													
														|  |  			symbol_addr = (unsigned long)_dl_find_hash(symname,
 |  |  			symbol_addr = (unsigned long)_dl_find_hash(symname,
 | 
											
												
													
														|  |  								   tpnt->symbol_scope,
 |  |  								   tpnt->symbol_scope,
 | 
											
												
													
														|  |  								   tpnt,
 |  |  								   tpnt,
 | 
											
										
											
												
													
														|  | @@ -192,6 +192,13 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
 | 
											
												
													
														|  |  			if (unlikely(!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK))
 |  |  			if (unlikely(!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK))
 | 
											
												
													
														|  |  				return 1;
 |  |  				return 1;
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  | 
 |  | +		if (!symtab_index) {
 | 
											
												
													
														|  | 
 |  | +			/* Relocs against STN_UNDEF are usually treated as using a
 | 
											
												
													
														|  | 
 |  | +			* symbol value of zero, and using the module containing the
 | 
											
												
													
														|  | 
 |  | +			* reloc itself.
 | 
											
												
													
														|  | 
 |  | +			*/
 | 
											
												
													
														|  | 
 |  | +			symbol_addr = symtab[symtab_index].st_value;
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  		switch (reloc_type) {
 |  |  		switch (reloc_type) {
 | 
											
												
													
														|  |  #if USE_TLS
 |  |  #if USE_TLS
 | 
											
										
											
												
													
														|  | @@ -205,21 +212,17 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
 | 
											
												
													
														|  |  		case R_MIPS_TLS_TPREL32:
 |  |  		case R_MIPS_TLS_TPREL32:
 | 
											
												
													
														|  |  # endif
 |  |  # endif
 | 
											
												
													
														|  |  			{
 |  |  			{
 | 
											
												
													
														|  | -				ElfW(Sym) *sym_tls = &symtab[symtab_index];
 |  | 
 | 
											
												
													
														|  |  				struct elf_resolve *tpnt_tls = NULL;
 |  |  				struct elf_resolve *tpnt_tls = NULL;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  				if (ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_LOCAL) {
 |  |  				if (ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_LOCAL) {
 | 
											
												
													
														|  | -					_dl_find_hash((strtab + symtab[symtab_index].st_name),
 |  | 
 | 
											
												
													
														|  | -							_dl_symbol_tables, tpnt,
 |  | 
 | 
											
												
													
														|  | -							elf_machine_type_class(reloc_type), &tpnt_tls);
 |  | 
 | 
											
												
													
														|  | 
 |  | +					symbol_addr = (unsigned long) _dl_find_hash(symname, tpnt->symbol_scope,
 | 
											
												
													
														|  | 
 |  | +						tpnt, elf_machine_type_class(reloc_type), &tpnt_tls);
 | 
											
												
													
														|  |  				}
 |  |  				}
 | 
											
												
													
														|  | -#if USE_TLS
 |  | 
 | 
											
												
													
														|  |  			    /* In case of a TLS reloc, tpnt_tls NULL means we have an 'anonymous'
 |  |  			    /* In case of a TLS reloc, tpnt_tls NULL means we have an 'anonymous'
 | 
											
												
													
														|  |  			       symbol.  This is the case for a static tls variable, so the lookup
 |  |  			       symbol.  This is the case for a static tls variable, so the lookup
 | 
											
												
													
														|  |  			       module is just that one is referencing the tls variable. */
 |  |  			       module is just that one is referencing the tls variable. */
 | 
											
												
													
														|  |  			    if (!tpnt_tls)
 |  |  			    if (!tpnt_tls)
 | 
											
												
													
														|  |  			        tpnt_tls = tpnt;
 |  |  			        tpnt_tls = tpnt;
 | 
											
												
													
														|  | -#endif
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  				switch (reloc_type) {
 |  |  				switch (reloc_type) {
 | 
											
												
													
														|  |  					case R_MIPS_TLS_DTPMOD64:
 |  |  					case R_MIPS_TLS_DTPMOD64:
 | 
											
										
											
												
													
														|  | @@ -228,17 +231,17 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
 | 
											
												
													
														|  |  							*(ElfW(Word) *)reloc_addr = tpnt_tls->l_tls_modid;
 |  |  							*(ElfW(Word) *)reloc_addr = tpnt_tls->l_tls_modid;
 | 
											
												
													
														|  |  #ifdef __SUPPORT_LD_DEBUG__
 |  |  #ifdef __SUPPORT_LD_DEBUG__
 | 
											
												
													
														|  |  						_dl_dprintf(2, "TLS_DTPMOD : %s, %d, %d\n",
 |  |  						_dl_dprintf(2, "TLS_DTPMOD : %s, %d, %d\n",
 | 
											
												
													
														|  | -							(strtab + symtab[symtab_index].st_name), old_val, *((unsigned int *)reloc_addr));
 |  | 
 | 
											
												
													
														|  | 
 |  | +							symname, old_val, *((unsigned int *)reloc_addr));
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
												
													
														|  |  						break;
 |  |  						break;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  					case R_MIPS_TLS_DTPREL64:
 |  |  					case R_MIPS_TLS_DTPREL64:
 | 
											
												
													
														|  |  					case R_MIPS_TLS_DTPREL32:
 |  |  					case R_MIPS_TLS_DTPREL32:
 | 
											
												
													
														|  |  						*(ElfW(Word) *)reloc_addr +=
 |  |  						*(ElfW(Word) *)reloc_addr +=
 | 
											
												
													
														|  | -							TLS_DTPREL_VALUE (sym_tls);
 |  | 
 | 
											
												
													
														|  | 
 |  | +							TLS_DTPREL_VALUE (symbol_addr);
 | 
											
												
													
														|  |  #ifdef __SUPPORT_LD_DEBUG__
 |  |  #ifdef __SUPPORT_LD_DEBUG__
 | 
											
												
													
														|  |  						_dl_dprintf(2, "TLS_DTPREL : %s, %x, %x\n",
 |  |  						_dl_dprintf(2, "TLS_DTPREL : %s, %x, %x\n",
 | 
											
												
													
														|  | -							(strtab + symtab[symtab_index].st_name), old_val, *((unsigned int *)reloc_addr));
 |  | 
 | 
											
												
													
														|  | 
 |  | +							symname, old_val, *((unsigned int *)reloc_addr));
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
												
													
														|  |  						break;
 |  |  						break;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -246,10 +249,10 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
 | 
											
												
													
														|  |  					case R_MIPS_TLS_TPREL64:
 |  |  					case R_MIPS_TLS_TPREL64:
 | 
											
												
													
														|  |  						CHECK_STATIC_TLS((struct link_map *)tpnt_tls);
 |  |  						CHECK_STATIC_TLS((struct link_map *)tpnt_tls);
 | 
											
												
													
														|  |  						*(ElfW(Word) *)reloc_addr +=
 |  |  						*(ElfW(Word) *)reloc_addr +=
 | 
											
												
													
														|  | -							TLS_TPREL_VALUE (tpnt_tls, sym_tls);
 |  | 
 | 
											
												
													
														|  | 
 |  | +							TLS_TPREL_VALUE (tpnt_tls, symbol_addr);
 | 
											
												
													
														|  |  #ifdef __SUPPORT_LD_DEBUG__
 |  |  #ifdef __SUPPORT_LD_DEBUG__
 | 
											
												
													
														|  |  						_dl_dprintf(2, "TLS_TPREL  : %s, %x, %x\n",
 |  |  						_dl_dprintf(2, "TLS_TPREL  : %s, %x, %x\n",
 | 
											
												
													
														|  | -							(strtab + symtab[symtab_index].st_name), old_val, *((unsigned int *)reloc_addr));
 |  | 
 | 
											
												
													
														|  | 
 |  | +							symname, old_val, *((unsigned int *)reloc_addr));
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
												
													
														|  |  						break;
 |  |  						break;
 | 
											
												
													
														|  |  				}
 |  |  				}
 | 
											
										
											
												
													
														|  | @@ -301,7 +304,7 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
 | 
											
												
													
														|  |  				_dl_dprintf(2, "\n%s: ",_dl_progname);
 |  |  				_dl_dprintf(2, "\n%s: ",_dl_progname);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  				if (symtab_index)
 |  |  				if (symtab_index)
 | 
											
												
													
														|  | -					_dl_dprintf(2, "symbol '%s': ", strtab + symtab[symtab_index].st_name);
 |  | 
 | 
											
												
													
														|  | 
 |  | +					_dl_dprintf(2, "symbol '%s': ", symname);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  #if defined (__SUPPORT_LD_DEBUG__)
 |  |  #if defined (__SUPPORT_LD_DEBUG__)
 | 
											
												
													
														|  |  				_dl_dprintf(2, "can't handle reloc type '%s' in lib '%s'\n", _dl_reltypes(reloc_type), tpnt->libname);
 |  |  				_dl_dprintf(2, "can't handle reloc type '%s' in lib '%s'\n", _dl_reltypes(reloc_type), tpnt->libname);
 |