From caeb71b21ffcc81a63fe8630e3484802ab6fb9a5 Mon Sep 17 00:00:00 2001 From: Sam Ravnborg Date: Mon, 16 Jul 2007 22:39:35 +0200 Subject: [PATCH] --- yaml --- r: 61832 b: refs/heads/master c: 56a974fa2d595fe6ebe433c525b8232ead539b76 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/scripts/mod/modpost.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index e8af14ef2d8e..7569eb772978 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ae4ac12323c0ff80528cac3269151d580e23f923 +refs/heads/master: 56a974fa2d595fe6ebe433c525b8232ead539b76 diff --git a/trunk/scripts/mod/modpost.c b/trunk/scripts/mod/modpost.c index b83cddb8dca9..256b3d272e2e 100644 --- a/trunk/scripts/mod/modpost.c +++ b/trunk/scripts/mod/modpost.c @@ -929,6 +929,26 @@ static int addend_386_rel(struct elf_info *elf, int rsection, Elf_Rela *r) return 0; } +static int addend_arm_rel(struct elf_info *elf, int rsection, Elf_Rela *r) +{ + unsigned int r_typ = ELF_R_TYPE(r->r_info); + + switch (r_typ) { + case R_ARM_ABS32: + /* From ARM ABI: (S + A) | T */ + r->r_addend = (int)(long)(elf->symtab_start + ELF_R_SYM(r->r_info)); + break; + case R_ARM_PC24: + /* From ARM ABI: ((S + A) | T) - P */ + r->r_addend = (int)(long)(elf->hdr + elf->sechdrs[rsection].sh_offset + + (r->r_offset - elf->sechdrs[rsection].sh_addr)); + break; + default: + return 1; + } + return 0; +} + static int addend_mips_rel(struct elf_info *elf, int rsection, Elf_Rela *r) { unsigned int r_typ = ELF_R_TYPE(r->r_info); @@ -1051,6 +1071,10 @@ static void check_sec_ref(struct module *mod, const char *modname, if (addend_386_rel(elf, i, &r)) continue; break; + case EM_ARM: + if(addend_arm_rel(elf, i, &r)) + continue; + break; case EM_MIPS: if (addend_mips_rel(elf, i, &r)) continue;