[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC PATCH 28/28] x86/tools: Drop x86_64 support from 'relocs' tool



From: Ard Biesheuvel <ardb@xxxxxxxxxx>

The relocs tool is no longer used on vmlinux, which is the only 64-bit
ELF executable that it used to operate on in the 64-bit build. (It is
still used for parts of the decompressor)

So drop the 64-bit handling - it is dead code now.

Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx>
---
 arch/x86/tools/Makefile        |   2 +-
 arch/x86/tools/relocs.c        | 178 +-------------------
 arch/x86/tools/relocs.h        |   9 +-
 arch/x86/tools/relocs_64.c     |  18 --
 arch/x86/tools/relocs_common.c |  11 +-
 5 files changed, 9 insertions(+), 209 deletions(-)

diff --git a/arch/x86/tools/Makefile b/arch/x86/tools/Makefile
index 7278e2545c35..f7d12a9dccfc 100644
--- a/arch/x86/tools/Makefile
+++ b/arch/x86/tools/Makefile
@@ -40,7 +40,7 @@ $(obj)/insn_sanity.o: $(srctree)/tools/arch/x86/lib/insn.c 
$(srctree)/tools/arch
 
 HOST_EXTRACFLAGS += -I$(srctree)/tools/include
 hostprogs      += relocs
-relocs-objs     := relocs_32.o relocs_64.o relocs_common.o
+relocs-objs     := relocs_32.o relocs_common.o
 PHONY += relocs
 relocs: $(obj)/relocs
        @:
diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
index 22c2d3f07a57..ff5578e63ff8 100644
--- a/arch/x86/tools/relocs.c
+++ b/arch/x86/tools/relocs.c
@@ -28,12 +28,7 @@ struct relocs {
 static struct relocs           relocs16;
 static struct relocs           relocs32;
 
-#if ELF_BITS == 64
-static struct relocs           relocs64;
-# define FMT PRIu64
-#else
 # define FMT PRIu32
-#endif
 
 struct section {
                                Elf_Shdr         shdr;
@@ -86,10 +81,6 @@ static const char * const    sym_regex_kernel[S_NSYMTYPES] = 
{
        "__end_rodata_aligned|"
        "__initramfs_start|"
        "(jiffies|jiffies_64)|"
-#if ELF_BITS == 64
-       "__per_cpu_load|"
-       "__end_rodata_hpage_align|"
-#endif
        "__vvar_page|"
        "_end)$"
 };
@@ -210,27 +201,6 @@ static const char *rel_type(unsigned type)
 {
        static const char *type_name[] = {
 #define REL_TYPE(X) [X] = #X
-#if ELF_BITS == 64
-               REL_TYPE(R_X86_64_NONE),
-               REL_TYPE(R_X86_64_64),
-               REL_TYPE(R_X86_64_PC64),
-               REL_TYPE(R_X86_64_PC32),
-               REL_TYPE(R_X86_64_GOT32),
-               REL_TYPE(R_X86_64_PLT32),
-               REL_TYPE(R_X86_64_COPY),
-               REL_TYPE(R_X86_64_GLOB_DAT),
-               REL_TYPE(R_X86_64_JUMP_SLOT),
-               REL_TYPE(R_X86_64_RELATIVE),
-               REL_TYPE(R_X86_64_GOTPCREL),
-               REL_TYPE(R_X86_64_GOTPCRELX),
-               REL_TYPE(R_X86_64_REX_GOTPCRELX),
-               REL_TYPE(R_X86_64_32),
-               REL_TYPE(R_X86_64_32S),
-               REL_TYPE(R_X86_64_16),
-               REL_TYPE(R_X86_64_PC16),
-               REL_TYPE(R_X86_64_8),
-               REL_TYPE(R_X86_64_PC8),
-#else
                REL_TYPE(R_386_NONE),
                REL_TYPE(R_386_32),
                REL_TYPE(R_386_PC32),
@@ -246,7 +216,6 @@ static const char *rel_type(unsigned type)
                REL_TYPE(R_386_PC8),
                REL_TYPE(R_386_16),
                REL_TYPE(R_386_PC16),
-#endif
 #undef REL_TYPE
        };
        const char *name = "unknown type rel type name";
@@ -312,19 +281,9 @@ static uint32_t elf32_to_cpu(uint32_t val)
 #define elf_half_to_cpu(x)     elf16_to_cpu(x)
 #define elf_word_to_cpu(x)     elf32_to_cpu(x)
 
-#if ELF_BITS == 64
-static uint64_t elf64_to_cpu(uint64_t val)
-{
-        return le64_to_cpu(val);
-}
-# define elf_addr_to_cpu(x)    elf64_to_cpu(x)
-# define elf_off_to_cpu(x)     elf64_to_cpu(x)
-# define elf_xword_to_cpu(x)   elf64_to_cpu(x)
-#else
 # define elf_addr_to_cpu(x)    elf32_to_cpu(x)
 # define elf_off_to_cpu(x)     elf32_to_cpu(x)
 # define elf_xword_to_cpu(x)   elf32_to_cpu(x)
-#endif
 
 static int sym_index(Elf_Sym *sym)
 {
@@ -515,10 +474,7 @@ static void print_absolute_symbols(void)
        int i;
        const char *format;
 
-       if (ELF_BITS == 64)
-               format = "%5d %016"PRIx64" %5"PRId64" %10s %10s %12s %s\n";
-       else
-               format = "%5d %08"PRIx32"  %5"PRId32" %10s %10s %12s %s\n";
+       format = "%5d %08"PRIx32"  %5"PRId32" %10s %10s %12s %s\n";
 
        printf("Absolute symbols\n");
        printf(" Num:    Value Size  Type       Bind        Visibility  
Name\n");
@@ -559,10 +515,7 @@ static void print_absolute_relocs(void)
        int i, printed = 0;
        const char *format;
 
-       if (ELF_BITS == 64)
-               format = "%016"PRIx64" %016"PRIx64" %10s %016"PRIx64"  %s\n";
-       else
-               format = "%08"PRIx32" %08"PRIx32" %10s %08"PRIx32"  %s\n";
+       format = "%08"PRIx32" %08"PRIx32" %10s %08"PRIx32"  %s\n";
 
        for (i = 0; i < shnum; i++) {
                struct section *sec = &secs[i];
@@ -694,104 +647,6 @@ static void walk_relocs(int (*process)(struct section 
*sec, Elf_Rel *rel,
        }
 }
 
-#if ELF_BITS == 64
-
-static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
-                     const char *symname)
-{
-       unsigned r_type = ELF64_R_TYPE(rel->r_info);
-       ElfW(Addr) offset = rel->r_offset;
-       int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname);
-
-       if (sym->st_shndx == SHN_UNDEF)
-               return 0;
-
-       switch (r_type) {
-       case R_X86_64_NONE:
-               /* NONE can be ignored. */
-               break;
-
-       case R_X86_64_PC32:
-       case R_X86_64_PLT32:
-               /*
-                * PC relative relocations don't need to be adjusted.
-                *
-                * NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32.
-                */
-               break;
-
-       case R_X86_64_PC64:
-               /*
-                * Only used by jump labels
-                */
-               break;
-
-       case R_X86_64_32:
-       case R_X86_64_32S:
-       case R_X86_64_64:
-       case R_X86_64_GOTPCREL:
-               if (shn_abs) {
-                       /*
-                        * Whitelisted absolute symbols do not require
-                        * relocation.
-                        */
-                       if (is_reloc(S_ABS, symname))
-                               break;
-
-                       die("Invalid absolute %s relocation: %s\n", 
rel_type(r_type), symname);
-                       break;
-               }
-
-               if (r_type == R_X86_64_GOTPCREL) {
-                       Elf_Shdr *s = &secs[sec->shdr.sh_info].shdr;
-                       unsigned file_off = offset - s->sh_addr + s->sh_offset;
-
-                       /*
-                        * GOTPCREL relocations refer to instructions that load
-                        * a 64-bit address via a 32-bit relative reference to
-                        * the GOT.  In this case, it is the GOT entry that
-                        * needs to be fixed up, not the immediate offset in
-                        * the opcode. Note that the linker will have applied an
-                        * addend of -4 to compensate for the delta between the
-                        * relocation offset and the value of RIP when the
-                        * instruction executes, and this needs to be backed out
-                        * again. (Addends other than -4 are permitted in
-                        * principle, but make no sense in practice so they are
-                        * not supported.)
-                         */
-                       if (rel->r_addend != -4) {
-                               die("invalid addend (%ld) for %s relocation: 
%s\n",
-                                   rel->r_addend, rel_type(r_type), symname);
-                               break;
-                       }
-                       offset += 4 + (int32_t)get_unaligned_le32(elf_image + 
file_off);
-               }
-
-               /*
-                * Relocation offsets for 64 bit kernels are output
-                * as 32 bits and sign extended back to 64 bits when
-                * the relocations are processed.
-                * Make sure that the offset will fit.
-                */
-               if ((int32_t)offset != (int64_t)offset)
-                       die("Relocation offset doesn't fit in 32 bits\n");
-
-               if (r_type == R_X86_64_64 || r_type == R_X86_64_GOTPCREL)
-                       add_reloc(&relocs64, offset);
-               else
-                       add_reloc(&relocs32, offset);
-               break;
-
-       default:
-               die("Unsupported relocation type: %s (%d)\n", rel_type(r_type), 
r_type);
-               break;
-       }
-
-       return 0;
-}
-
-#else
-
 static int do_reloc32(struct section *sec, Elf_Rel *rel, Elf_Sym *sym,
                      const char *symname)
 {
@@ -902,8 +757,6 @@ static int do_reloc_real(struct section *sec, Elf_Rel *rel, 
Elf_Sym *sym, const
        return 0;
 }
 
-#endif
-
 static int cmp_relocs(const void *va, const void *vb)
 {
        const uint32_t *a, *b;
@@ -939,17 +792,10 @@ static void emit_relocs(int as_text, int use_real_mode)
        int (*write_reloc)(uint32_t, FILE *) = write32;
        int (*do_reloc)(struct section *sec, Elf_Rel *rel, Elf_Sym *sym, const 
char *symname);
 
-#if ELF_BITS == 64
-       if (!use_real_mode)
-               do_reloc = do_reloc64;
-       else
-               die("--realmode not valid for a 64-bit ELF file");
-#else
        if (!use_real_mode)
                do_reloc = do_reloc32;
        else
                do_reloc = do_reloc_real;
-#endif
 
        /* Collect up the relocations */
        walk_relocs(do_reloc);
@@ -959,11 +805,7 @@ static void emit_relocs(int as_text, int use_real_mode)
 
        /* Order the relocations for more efficient processing */
        sort_relocs(&relocs32);
-#if ELF_BITS == 64
-       sort_relocs(&relocs64);
-#else
        sort_relocs(&relocs16);
-#endif
 
        /* Print the relocations */
        if (as_text) {
@@ -984,16 +826,6 @@ static void emit_relocs(int as_text, int use_real_mode)
                for (i = 0; i < relocs32.count; i++)
                        write_reloc(relocs32.offset[i], stdout);
        } else {
-#if ELF_BITS == 64
-               /* Print a stop */
-               write_reloc(0, stdout);
-
-               /* Now print each relocation */
-               for (i = 0; i < relocs64.count; i++)
-                       if (!i || relocs64.offset[i] != relocs64.offset[i - 1])
-                               write_reloc(relocs64.offset[i], stdout);
-#endif
-
                /* Print a stop */
                write_reloc(0, stdout);
 
@@ -1027,12 +859,6 @@ static void print_reloc_info(void)
        walk_relocs(do_reloc_info);
 }
 
-#if ELF_BITS == 64
-# define process process_64
-#else
-# define process process_32
-#endif
-
 void process(FILE *fp, int use_real_mode, int as_text,
             int show_absolute_syms, int show_absolute_relocs,
             int show_reloc_info)
diff --git a/arch/x86/tools/relocs.h b/arch/x86/tools/relocs.h
index 7a509604ff92..ef9eec96bd62 100644
--- a/arch/x86/tools/relocs.h
+++ b/arch/x86/tools/relocs.h
@@ -32,10 +32,7 @@ enum symtype {
        S_NSYMTYPES
 };
 
-void process_32(FILE *fp, int use_real_mode, int as_text,
-               int show_absolute_syms, int show_absolute_relocs,
-               int show_reloc_info);
-void process_64(FILE *fp, int use_real_mode, int as_text,
-               int show_absolute_syms, int show_absolute_relocs,
-               int show_reloc_info);
+void process(FILE *fp, int use_real_mode, int as_text,
+            int show_absolute_syms, int show_absolute_relocs,
+            int show_reloc_info);
 #endif /* RELOCS_H */
diff --git a/arch/x86/tools/relocs_64.c b/arch/x86/tools/relocs_64.c
deleted file mode 100644
index 9029cb619cb1..000000000000
--- a/arch/x86/tools/relocs_64.c
+++ /dev/null
@@ -1,18 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include "relocs.h"
-
-#define ELF_BITS 64
-
-#define ELF_MACHINE             EM_X86_64
-#define ELF_MACHINE_NAME        "x86_64"
-#define SHT_REL_TYPE            SHT_RELA
-#define Elf_Rel                 Elf64_Rela
-
-#define ELF_CLASS               ELFCLASS64
-#define ELF_R_SYM(val)          ELF64_R_SYM(val)
-#define ELF_R_TYPE(val)         ELF64_R_TYPE(val)
-#define ELF_ST_TYPE(o)          ELF64_ST_TYPE(o)
-#define ELF_ST_BIND(o)          ELF64_ST_BIND(o)
-#define ELF_ST_VISIBILITY(o)    ELF64_ST_VISIBILITY(o)
-
-#include "relocs.c"
diff --git a/arch/x86/tools/relocs_common.c b/arch/x86/tools/relocs_common.c
index 6634352a20bc..167985ecd544 100644
--- a/arch/x86/tools/relocs_common.c
+++ b/arch/x86/tools/relocs_common.c
@@ -72,14 +72,9 @@ int main(int argc, char **argv)
                die("Cannot read %s: %s", fname, strerror(errno));
        }
        rewind(fp);
-       if (e_ident[EI_CLASS] == ELFCLASS64)
-               process_64(fp, use_real_mode, as_text,
-                          show_absolute_syms, show_absolute_relocs,
-                          show_reloc_info);
-       else
-               process_32(fp, use_real_mode, as_text,
-                          show_absolute_syms, show_absolute_relocs,
-                          show_reloc_info);
+       process(fp, use_real_mode, as_text,
+               show_absolute_syms, show_absolute_relocs,
+               show_reloc_info);
        fclose(fp);
        return 0;
 }
-- 
2.46.0.792.g87dc391469-goog




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.