|
@@ -169,6 +169,21 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
|
|
*(u32 *)loc = offset & 0x7fffffff;
|
|
*(u32 *)loc = offset & 0x7fffffff;
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case R_ARM_MOVW_ABS_NC:
|
|
|
|
+ case R_ARM_MOVT_ABS:
|
|
|
|
+ offset = *(u32 *)loc;
|
|
|
|
+ offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff);
|
|
|
|
+ offset = (offset ^ 0x8000) - 0x8000;
|
|
|
|
+
|
|
|
|
+ offset += sym->st_value;
|
|
|
|
+ if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS)
|
|
|
|
+ offset >>= 16;
|
|
|
|
+
|
|
|
|
+ *(u32 *)loc &= 0xfff0f000;
|
|
|
|
+ *(u32 *)loc |= ((offset & 0xf000) << 4) |
|
|
|
|
+ (offset & 0x0fff);
|
|
|
|
+ break;
|
|
|
|
+
|
|
default:
|
|
default:
|
|
printk(KERN_ERR "%s: unknown relocation: %u\n",
|
|
printk(KERN_ERR "%s: unknown relocation: %u\n",
|
|
module->name, ELF32_R_TYPE(rel->r_info));
|
|
module->name, ELF32_R_TYPE(rel->r_info));
|