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