summaryrefslogtreecommitdiff
path: root/util/cbfstool
diff options
context:
space:
mode:
Diffstat (limited to 'util/cbfstool')
-rw-r--r--util/cbfstool/elf.h37
-rw-r--r--util/cbfstool/elfheaders.c3
-rw-r--r--util/cbfstool/rmodule.c32
3 files changed, 72 insertions, 0 deletions
diff --git a/util/cbfstool/elf.h b/util/cbfstool/elf.h
index a0bb35dd94..43fd7f33eb 100644
--- a/util/cbfstool/elf.h
+++ b/util/cbfstool/elf.h
@@ -1148,6 +1148,43 @@ typedef struct
/* Keep this the last entry. */
#define R_386_NUM 38
+/* AMD64 specific definitions. */
+#define R_AMD64_NONE 0 /* relocation types */
+#define R_AMD64_64 1
+#define R_AMD64_PC32 2
+#define R_AMD64_GOT32 3
+#define R_AMD64_PLT32 4
+#define R_AMD64_COPY 5
+#define R_AMD64_GLOB_DAT 6
+#define R_AMD64_JUMP_SLOT 7
+#define R_AMD64_RELATIVE 8
+#define R_AMD64_GOTPCREL 9
+#define R_AMD64_32 10
+#define R_AMD64_32S 11
+#define R_AMD64_16 12
+#define R_AMD64_PC16 13
+#define R_AMD64_8 14
+#define R_AMD64_PC8 15
+#define R_AMD64_DTPMOD64 16
+#define R_AMD64_DTPOFF64 17
+#define R_AMD64_TPOFF64 18
+#define R_AMD64_TLSGD 19
+#define R_AMD64_TLSLD 20
+#define R_AMD64_DTPOFF32 21
+#define R_AMD64_GOTTPOFF 22
+#define R_AMD64_TPOFF32 23
+#define R_AMD64_PC64 24
+#define R_AMD64_GOTOFF64 25
+#define R_AMD64_GOTPC32 26
+#define R_AMD64_GOT64 27 /* reserved for future expansion */
+#define R_AMD64_GOTPCREL64 28 /* reserved for future expansion */
+#define R_AMD64_GOTPC64 29 /* reserved for future expansion */
+#define R_AMD64_GOTPLT64 30 /* reserved for future expansion */
+#define R_AMD64_PLTOFF64 31 /* reserved for future expansion */
+#define R_AMD64_SIZE32 32
+#define R_AMD64_SIZE64 33
+#define R_AMD64_NUM 34
+
/* SUN SPARC specific definitions. */
/* Legal values for ST_TYPE subfield of st_info (symbol type). */
diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c
index 9d02c30573..8da54d09e0 100644
--- a/util/cbfstool/elfheaders.c
+++ b/util/cbfstool/elfheaders.c
@@ -1072,6 +1072,9 @@ static void fixup_relocations(struct elf_writer *ew)
case EM_386:
type = R_386_32;
break;
+ case EM_X86_64:
+ type = R_AMD64_64;
+ break;
case EM_ARM:
type = R_ARM_ABS32;
break;
diff --git a/util/cbfstool/rmodule.c b/util/cbfstool/rmodule.c
index ff8f1cdef2..f270e3ec8f 100644
--- a/util/cbfstool/rmodule.c
+++ b/util/cbfstool/rmodule.c
@@ -44,6 +44,33 @@ static int should_emit_386(Elf64_Rela *rel)
return (type == R_386_32);
}
+static int valid_reloc_amd64(Elf64_Rela *rel)
+{
+ int type;
+
+ type = ELF64_R_TYPE(rel->r_info);
+
+ /* Only these 5 relocations are expected to be found. */
+ return (type == R_AMD64_64 ||
+ type == R_AMD64_PC64 ||
+ type == R_AMD64_32S ||
+ type == R_AMD64_32 ||
+ type == R_AMD64_PC32);
+}
+
+static int should_emit_amd64(Elf64_Rela *rel)
+{
+ int type;
+
+ type = ELF64_R_TYPE(rel->r_info);
+
+ /* Only emit absolute relocations */
+ return (type == R_AMD64_64 ||
+ type == R_AMD64_PC64 ||
+ type == R_AMD64_32S ||
+ type == R_AMD64_32);
+}
+
static int valid_reloc_arm(Elf64_Rela *rel)
{
int type;
@@ -101,6 +128,11 @@ static const struct arch_ops reloc_ops[] = {
.should_emit = should_emit_386,
},
{
+ .arch = EM_X86_64,
+ .valid_type = valid_reloc_amd64,
+ .should_emit = should_emit_amd64,
+ },
+ {
.arch = EM_ARM,
.valid_type = valid_reloc_arm,
.should_emit = should_emit_arm,