scripts/sorttable: Add helper functions for Elf_Ehdr
authorSteven Rostedt <rostedt@goodmis.org>
Sun, 5 Jan 2025 16:22:20 +0000 (11:22 -0500)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Wed, 8 Jan 2025 03:23:05 +0000 (22:23 -0500)
In order to remove the double #include of sorttable.h for 64 and 32 bit
to create duplicate functions, add helper functions for Elf_Ehdr.  This
will create a function pointer for each helper that will get assigned to
the appropriate function to handle either the 64bit or 32bit version.

This also moves the _r()/r() wrappers for the Elf_Ehdr references that
handle endian and size differences between the different architectures,
into the helper function and out of the open code which is more error
prone.

Cc: bpf <bpf@vger.kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Nicolas Schier <nicolas@fjasle.eu>
Cc: Zheng Yejian <zhengyejian1@huawei.com>
Cc: Martin Kelly <martin.kelly@crowdstrike.com>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lore.kernel.org/20250105162345.736369526@goodmis.org
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
scripts/sorttable.c
scripts/sorttable.h

index 57792cf2aa89b76a608d6c182ca102a1cc2e48e6..5dfa734eff09731bd106582a433b520ac1e08c47 100644 (file)
@@ -85,6 +85,31 @@ static uint64_t (*r8)(const uint64_t *);
 static void (*w)(uint32_t, uint32_t *);
 typedef void (*table_sort_t)(char *, int);
 
+static uint64_t ehdr64_shoff(Elf_Ehdr *ehdr)
+{
+       return r8(&ehdr->e64.e_shoff);
+}
+
+static uint64_t ehdr32_shoff(Elf_Ehdr *ehdr)
+{
+       return r(&ehdr->e32.e_shoff);
+}
+
+#define EHDR_HALF(fn_name)                             \
+static uint16_t ehdr64_##fn_name(Elf_Ehdr *ehdr)       \
+{                                                      \
+       return r2(&ehdr->e64.e_##fn_name);              \
+}                                                      \
+                                                       \
+static uint16_t ehdr32_##fn_name(Elf_Ehdr *ehdr)       \
+{                                                      \
+       return r2(&ehdr->e32.e_##fn_name);              \
+}
+
+EHDR_HALF(shentsize)
+EHDR_HALF(shstrndx)
+EHDR_HALF(shnum)
+
 /*
  * Get the whole file as a programming convenience in order to avoid
  * malloc+lseek+read+free of many pieces.  If successful, then mmap
index cd4429c8a9f42b9eb96f4f79f6b77596759bf8e0..97278c973bc9865a12a9491b61bc396bb1617343 100644 (file)
 #undef uint_t
 #undef _r
 #undef etype
+#undef ehdr_shoff
+#undef ehdr_shentsize
+#undef ehdr_shstrndx
+#undef ehdr_shnum
 
 #ifdef SORTTABLE_64
 # define extable_ent_size      16
 # define uint_t                        uint64_t
 # define _r                    r8
 # define etype                 e64
+# define ehdr_shoff            ehdr64_shoff
+# define ehdr_shentsize                ehdr64_shentsize
+# define ehdr_shstrndx         ehdr64_shstrndx
+# define ehdr_shnum            ehdr64_shnum
 #else
 # define extable_ent_size      8
 # define compare_extable       compare_extable_32
 # define uint_t                        uint32_t
 # define _r                    r
 # define etype                 e32
+# define ehdr_shoff            ehdr32_shoff
+# define ehdr_shentsize                ehdr32_shentsize
+# define ehdr_shstrndx         ehdr32_shstrndx
+# define ehdr_shnum            ehdr32_shnum
 #endif
 
 #if defined(SORTTABLE_64) && defined(UNWINDER_ORC_ENABLED)
@@ -250,16 +262,16 @@ static int do_sort(Elf_Ehdr *ehdr,
        unsigned int orc_num_entries = 0;
 #endif
 
-       shdr_start = (Elf_Shdr *)((char *)ehdr + _r(&ehdr->etype.e_shoff));
-       shentsize = r2(&ehdr->etype.e_shentsize);
+       shdr_start = (Elf_Shdr *)((char *)ehdr + ehdr_shoff(ehdr));
+       shentsize = ehdr_shentsize(ehdr);
 
-       shstrndx = r2(&ehdr->etype.e_shstrndx);
+       shstrndx = ehdr_shstrndx(ehdr);
        if (shstrndx == SHN_XINDEX)
                shstrndx = r(&shdr_start->etype.sh_link);
        string_sec = get_index(shdr_start, shentsize, shstrndx);
        secstrings = (const char *)ehdr + _r(&string_sec->etype.sh_offset);
 
-       shnum = r2(&ehdr->etype.e_shnum);
+       shnum = ehdr_shnum(ehdr);
        if (shnum == SHN_UNDEF)
                shnum = _r(&shdr_start->etype.sh_size);