summaryrefslogtreecommitdiff
path: root/util/cbfstool
diff options
context:
space:
mode:
Diffstat (limited to 'util/cbfstool')
-rw-r--r--util/cbfstool/elf.h1
-rw-r--r--util/cbfstool/rmodule.c26
2 files changed, 27 insertions, 0 deletions
diff --git a/util/cbfstool/elf.h b/util/cbfstool/elf.h
index d07bb53599..8b56a7172c 100644
--- a/util/cbfstool/elf.h
+++ b/util/cbfstool/elf.h
@@ -2222,6 +2222,7 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */
#define R_ARM_GOT32 26 /* 32 bit GOT entry */
#define R_ARM_PLT32 27 /* 32 bit PLT address */
+#define R_ARM_THM_JUMP24 30
#define R_ARM_ALU_PCREL_7_0 32
#define R_ARM_ALU_PCREL_15_8 33
#define R_ARM_ALU_PCREL_23_15 34
diff --git a/util/cbfstool/rmodule.c b/util/cbfstool/rmodule.c
index 168d71a8f7..966c364c47 100644
--- a/util/cbfstool/rmodule.c
+++ b/util/cbfstool/rmodule.c
@@ -82,12 +82,38 @@ static int should_emit_386(struct rmod_context *ctx, Elf64_Rela *rel)
return (type == R_386_32);
}
+static int valid_reloc_arm(struct rmod_context *ctx, Elf64_Rela *rel)
+{
+ int type;
+
+ type = ELF64_R_TYPE(rel->r_info);
+
+ /* Only these 3 relocations are expected to be found. */
+ return (type == R_ARM_ABS32 || type == R_ARM_THM_PC22 ||
+ type == R_ARM_THM_JUMP24);
+}
+
+static int should_emit_arm(struct rmod_context *ctx, Elf64_Rela *rel)
+{
+ int type;
+
+ type = ELF64_R_TYPE(rel->r_info);
+
+ /* R_ARM_ABS32 relocations are absolute. Must emit these. */
+ return (type == R_ARM_ABS32);
+}
+
static struct arch_ops reloc_ops[] = {
{
.arch = EM_386,
.valid_type = valid_reloc_386,
.should_emit = should_emit_386,
},
+ {
+ .arch = EM_ARM,
+ .valid_type = valid_reloc_arm,
+ .should_emit = should_emit_arm,
+ },
};
/*