diff options
| -rw-r--r-- | ldso/ldso/arm/elfinterp.c | 15 | ||||
| -rw-r--r-- | ldso/ldso/dl-startup.c | 33 | ||||
| -rw-r--r-- | ldso/ldso/i386/elfinterp.c | 13 | ||||
| -rw-r--r-- | ldso/ldso/mips/elfinterp.c | 6 | ||||
| -rw-r--r-- | ldso/ldso/powerpc/elfinterp.c | 13 | 
5 files changed, 26 insertions, 54 deletions
diff --git a/ldso/ldso/arm/elfinterp.c b/ldso/ldso/arm/elfinterp.c index 6b43464b3..93ae35e8b 100644 --- a/ldso/ldso/arm/elfinterp.c +++ b/ldso/ldso/arm/elfinterp.c @@ -188,8 +188,13 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,  	Elf32_Sym *symtab;  	ELF_RELOC *rpnt;  	int symtab_index; -	/* Now parse the relocation information */ +	/* When the dynamic linker bootstrapped itself, it resolved some symbols. +	   Make sure we do not do them again */ +	if (tpnt->libtype == program_interpreter) +		return 0; + +	/* Now parse the relocation information */  	rpnt = (ELF_RELOC *) (rel_addr + tpnt->loadaddr);  	rel_size = rel_size / sizeof(ELF_RELOC); @@ -201,14 +206,6 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,  		symtab_index = ELF32_R_SYM(rpnt->r_info); -		/* When the dynamic linker bootstrapped itself, it resolved some symbols. -		   Make sure we do not do them again */ -		if (!symtab_index && tpnt->libtype == program_interpreter) -			continue; -		if (symtab_index && tpnt->libtype == program_interpreter && -		    _dl_symbol(strtab + symtab[symtab_index].st_name)) -			continue; -  #if defined (__SUPPORT_LD_DEBUG__)  		debug_sym(symtab,strtab,symtab_index);  		debug_reloc(symtab,strtab,rpnt); diff --git a/ldso/ldso/dl-startup.c b/ldso/ldso/dl-startup.c index f97619af3..5d1d5a67e 100644 --- a/ldso/ldso/dl-startup.c +++ b/ldso/ldso/dl-startup.c @@ -490,7 +490,7 @@ found_got:  		unsigned long symbol_addr;  		int symtab_index;  		unsigned long rel_addr, rel_size; - +		Elf32_Sym *sym;  		rel_addr = (indx ? tpnt->dynamic_info[DT_JMPREL] : tpnt->  				dynamic_info[DT_RELOC_TABLE_ADDR]); @@ -506,43 +506,24 @@ found_got:  			reloc_addr = (unsigned long *) (load_addr + (unsigned long) rpnt->r_offset);  			symtab_index = ELF32_R_SYM(rpnt->r_info);  			symbol_addr = 0; +			sym = NULL;  			if (symtab_index) {  				char *strtab; -				char *symname;  				Elf32_Sym *symtab;  				symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + load_addr);  				strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + load_addr); -				symname = strtab + symtab[symtab_index].st_name; - -				/* We only do a partial dynamic linking right now.  The user -				   is not supposed to define any symbols that start with a -				   '_dl', so we can do this with confidence. */ -				if (!symname || !_dl_symbol(symname)) { -					continue; -				} +				sym = &symtab[symtab_index]; +				symbol_addr = load_addr + sym->st_value; -				symbol_addr = load_addr + symtab[symtab_index].st_value; - -				if (!symbol_addr) { -					/* This will segfault - you cannot call a function until -					 * we have finished the relocations. -					 */ -					SEND_STDERR("ELF dynamic loader - unable to self-bootstrap - symbol "); -					SEND_STDERR(symname); -					SEND_STDERR(" undefined.\n"); -					goof++; -				}  #ifdef __SUPPORT_LD_DEBUG_EARLY__  				SEND_STDERR("relocating symbol: "); -				SEND_STDERR(symname); +				SEND_STDERR(strtab + sym->st_name);  				SEND_STDERR("\n");  #endif -				PERFORM_BOOTSTRAP_RELOC(rpnt, reloc_addr, symbol_addr, load_addr, &symtab[symtab_index]); -			} else { -				/* Use this machine-specific macro to perform the actual relocation.  */ -				PERFORM_BOOTSTRAP_RELOC(rpnt, reloc_addr, symbol_addr, load_addr, NULL);  			} +			/* Use this machine-specific macro to perform the actual relocation.  */ +			PERFORM_BOOTSTRAP_RELOC(rpnt, reloc_addr, symbol_addr, load_addr, sym);  		}  	} diff --git a/ldso/ldso/i386/elfinterp.c b/ldso/ldso/i386/elfinterp.c index a80dcad54..dca5fe54d 100644 --- a/ldso/ldso/i386/elfinterp.c +++ b/ldso/ldso/i386/elfinterp.c @@ -183,6 +183,11 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,  	ELF_RELOC *rpnt;  	int symtab_index; +	/* When the dynamic linker bootstrapped itself, it resolved some symbols. +	   Make sure we do not do them again */ +	if (tpnt->libtype == program_interpreter) +		return 0; +  	/* Now parse the relocation information */  	rpnt = (ELF_RELOC *)(intptr_t) (rel_addr + tpnt->loadaddr);  	rel_size = rel_size / sizeof(ELF_RELOC); @@ -195,14 +200,6 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,  		symtab_index = ELF32_R_SYM(rpnt->r_info); -		/* When the dynamic linker bootstrapped itself, it resolved some symbols. -		   Make sure we do not do them again */ -		if (!symtab_index && tpnt->libtype == program_interpreter) -			continue; -		if (symtab_index && tpnt->libtype == program_interpreter && -		    _dl_symbol(strtab + symtab[symtab_index].st_name)) -			continue; -  #if defined (__SUPPORT_LD_DEBUG__)  		debug_sym(symtab,strtab,symtab_index);  		debug_reloc(symtab,strtab,rpnt); diff --git a/ldso/ldso/mips/elfinterp.c b/ldso/ldso/mips/elfinterp.c index 0b6a68005..dfbc88fdc 100644 --- a/ldso/ldso/mips/elfinterp.c +++ b/ldso/ldso/mips/elfinterp.c @@ -187,6 +187,9 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,  	unsigned long old_val=0;  #endif +	if (tpnt->libtype == program_interpreter) +		return 0; +  	/* Now parse the relocation information */  	rel_size = rel_size / sizeof(Elf32_Rel);  	rpnt = (Elf32_Rel *) (rel_addr + tpnt->loadaddr); @@ -202,9 +205,6 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,  		symtab_index = ELF32_R_SYM(rpnt->r_info);  		symbol_addr = 0; -		if (!symtab_index && tpnt->libtype == program_interpreter) -			continue; -  #if defined (__SUPPORT_LD_DEBUG__)  		debug_sym(symtab,strtab,symtab_index);  		debug_reloc(symtab,strtab,rpnt); diff --git a/ldso/ldso/powerpc/elfinterp.c b/ldso/ldso/powerpc/elfinterp.c index e67128b2a..0cecf7dc8 100644 --- a/ldso/ldso/powerpc/elfinterp.c +++ b/ldso/ldso/powerpc/elfinterp.c @@ -443,6 +443,11 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,  	ELF_RELOC *rpnt;  	int symtab_index; +	/* When the dynamic linker bootstrapped itself, it resolved some symbols. +	   Make sure we do not do them again */ +	if (tpnt->libtype == program_interpreter) +		return 0; +  	/* Now parse the relocation information */  	rpnt = (ELF_RELOC *)(intptr_t) (rel_addr + tpnt->loadaddr);  	rel_size = rel_size / sizeof(ELF_RELOC); @@ -455,14 +460,6 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,  		symtab_index = ELF32_R_SYM(rpnt->r_info); -		/* When the dynamic linker bootstrapped itself, it resolved some symbols. -		   Make sure we do not do them again */ -		if (!symtab_index && tpnt->libtype == program_interpreter) -			continue; -		if (symtab_index && tpnt->libtype == program_interpreter && -		    _dl_symbol(strtab + symtab[symtab_index].st_name)) -			continue; -  #if defined (__SUPPORT_LD_DEBUG__)  		debug_sym(symtab,strtab,symtab_index);  		debug_reloc(symtab,strtab,rpnt);  | 
