41 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Subject: [PATCH] ldso: AVR32 startup hack
 | |
| 
 | |
| AVR32 needs to do both PERFORM_BOOTSTRAP_GOT and a full relocation of
 | |
| the GOT. I don't quite remember why, but I think it's because some GOT
 | |
| entries just need the load address added to them, while the rest need
 | |
| the full relocation code.
 | |
| 
 | |
| This patch should be revisited to figure out whether we're processing
 | |
| relocations against undefined symbols and whether that's something we
 | |
| should be doing...
 | |
| 
 | |
| ---
 | |
| 
 | |
|  ldso/ldso/dl-startup.c |    6 ++++--
 | |
|  1 file changed, 4 insertions(+), 2 deletions(-)
 | |
| 
 | |
| Index: uClibc-0.9.28/ldso/ldso/dl-startup.c
 | |
| ===================================================================
 | |
| --- uClibc-0.9.28.orig/ldso/ldso/dl-startup.c	2006-02-07 16:49:27.000000000 +0100
 | |
| +++ uClibc-0.9.28/ldso/ldso/dl-startup.c	2006-02-07 17:12:09.000000000 +0100
 | |
| @@ -217,7 +217,9 @@ static void * __attribute_used__ _dl_sta
 | |
|  	/* some arches (like MIPS) we have to tweak the GOT before relocations */
 | |
|  	PERFORM_BOOTSTRAP_GOT(tpnt);
 | |
|  
 | |
| -#else
 | |
| +#endif
 | |
| +
 | |
| +#if !defined(PERFORM_BOOTSTRAP_GOT) || defined(__avr32__)
 | |
|  
 | |
|  	/* OK, now do the relocations.  We do not do a lazy binding here, so
 | |
|  	   that once we are done, we have considerably more flexibility. */
 | |
| @@ -259,7 +261,7 @@ static void * __attribute_used__ _dl_sta
 | |
|  				rel_addr += relative_count * sizeof(ELF_RELOC);;
 | |
|  			}
 | |
|  
 | |
| -			rpnt = (ELF_RELOC *) (rel_addr + load_addr);
 | |
| +			rpnt = (ELF_RELOC *) (rel_addr /* + load_addr */);
 | |
|  			for (i = 0; i < rel_size; i += sizeof(ELF_RELOC), rpnt++) {
 | |
|  				reloc_addr = (unsigned long *) (load_addr + (unsigned long) rpnt->r_offset);
 | |
|  				symtab_index = ELF_R_SYM(rpnt->r_info);
 |