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; @@ -100,6 +127,11 @@ static const struct arch_ops reloc_ops[] = { .valid_type = valid_reloc_386, .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,