tools: relocate-rela: introduce elf16_to_cpu() and elf32_to_cpu()
authorOvidiu Panait <ovpanait@gmail.com>
Sat, 11 Mar 2023 17:38:35 +0000 (19:38 +0200)
committerMichal Simek <michal.simek@amd.com>
Mon, 13 Mar 2023 10:46:17 +0000 (11:46 +0100)
Add elf16_to_cpu() and elf32_to_cpu() functions that allow to read data in
both big-endian and little-endian formats.

Reviewed-by: Michal Simek <michal.simek@amd.com>
Signed-off-by: Ovidiu Panait <ovpanait@gmail.com>
Link: https://lore.kernel.org/r/20230311173838.521804-2-ovpanait@gmail.com
Signed-off-by: Michal Simek <michal.simek@amd.com>
tools/relocate-rela.c

index 689e2d4..b27c41b 100644 (file)
@@ -45,6 +45,7 @@
 #endif
 
 static int ei_class;
+static int ei_data;
 
 static uint64_t rela_start, rela_end, text_base, dyn_start;
 
@@ -61,6 +62,22 @@ static void debug(const char *fmt, ...)
        }
 }
 
+static uint16_t elf16_to_cpu(uint16_t data)
+{
+       if (ei_data == ELFDATA2LSB)
+               return le16_to_cpu(data);
+
+       return be16_to_cpu(data);
+}
+
+static uint32_t elf32_to_cpu(uint32_t data)
+{
+       if (ei_data == ELFDATA2LSB)
+               return le32_to_cpu(data);
+
+       return be32_to_cpu(data);
+}
+
 static bool supported_rela(Elf64_Rela *rela)
 {
        uint64_t mask = 0xffffffffULL; /* would be different on 32-bit */
@@ -384,6 +401,9 @@ static int decode_elf(char **argv)
        ei_class = e_ident[4];
        debug("EI_CLASS(1=32bit, 2=64bit) %d\n", ei_class);
 
+       ei_data = e_ident[5];
+       debug("EI_DATA(1=little endian, 2=big endian) %d\n", ei_data);
+
        if (ei_class == 2)
                return decode_elf64(felf, argv);