diff options
Diffstat (limited to 'arch/microblaze/kernel/module.c')
| -rw-r--r-- | arch/microblaze/kernel/module.c | 19 | 
1 files changed, 14 insertions, 5 deletions
diff --git a/arch/microblaze/kernel/module.c b/arch/microblaze/kernel/module.c index 51414171326..5a45b1adfef 100644 --- a/arch/microblaze/kernel/module.c +++ b/arch/microblaze/kernel/module.c @@ -57,7 +57,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,  	Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;  	Elf32_Sym *sym;  	unsigned long int *location; -	unsigned long int locoffs;  	unsigned long int value;  #if __GNUC__ < 4  	unsigned long int old_value; @@ -113,10 +112,12 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,  			break;  		case R_MICROBLAZE_64_PCREL: -			locoffs = (location[0] & 0xFFFF) << 16 | +#if __GNUC__ < 4 +			old_value = (location[0] & 0xFFFF) << 16 |  				(location[1] & 0xFFFF); -			value -= (unsigned long int)(location) + 4 + -				locoffs; +			value -= old_value; +#endif +			value -= (unsigned long int)(location) + 4;  			location[0] = (location[0] & 0xFFFF0000) |  					(value >> 16);  			location[1] = (location[1] & 0xFFFF0000) | @@ -125,6 +126,14 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,  				value);  			break; +		case R_MICROBLAZE_32_PCREL_LO: +			pr_debug("R_MICROBLAZE_32_PCREL_LO\n"); +			break; + +		case R_MICROBLAZE_64_NONE: +			pr_debug("R_MICROBLAZE_NONE\n"); +			break; +  		case R_MICROBLAZE_NONE:  			pr_debug("R_MICROBLAZE_NONE\n");  			break; @@ -133,7 +142,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,  			printk(KERN_ERR "module %s: "  				"Unknown relocation: %u\n",  				module->name, -				ELF32_R_TYPE(rela->r_info)); +				ELF32_R_TYPE(rela[i].r_info));  			return -ENOEXEC;  		}  	}  |