diff mbox series

[2/5] tools: relocate-rela: introduce elf16_to_cpu() and elf32_to_cpu()

Message ID 20230305174919.293393-2-ovpanait@gmail.com
State Superseded
Delegated to: Michal Simek
Headers show
Series [1/5] tools: relocate-rela: adjust le64_to_cpu -> le32_to_cpu in decode_elf32() | expand

Commit Message

Ovidiu Panait March 5, 2023, 5:49 p.m. UTC
Add elf16_to_cpu() and elf32_to_cpu() functions that allow to read data in
both big-endian and little-endian formats.

Signed-off-by: Ovidiu Panait <ovpanait@gmail.com>
---

 tools/relocate-rela.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

Comments

Michal Simek March 8, 2023, 12:04 p.m. UTC | #1
On 3/5/23 18:49, Ovidiu Panait wrote:
> Add elf16_to_cpu() and elf32_to_cpu() functions that allow to read data in
> both big-endian and little-endian formats.
> 
> Signed-off-by: Ovidiu Panait <ovpanait@gmail.com>
> ---
> 
>   tools/relocate-rela.c | 20 ++++++++++++++++++++
>   1 file changed, 20 insertions(+)
> 
> diff --git a/tools/relocate-rela.c b/tools/relocate-rela.c
> index 689e2d4655..84531b23a6 100644
> --- a/tools/relocate-rela.c
> +++ b/tools/relocate-rela.c
> @@ -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 == 0x01)

Can we used macros instead of hardcoding value?

/* e_ident[] data encoding */
#define ELFDATANONE     0               /* invalid */
#define ELFDATA2LSB     1               /* Little-Endian */
#define ELFDATA2MSB     2               /* Big-Endian */
#define ELFDATANUM      3               /* number of data encode defines */

M
diff mbox series

Patch

diff --git a/tools/relocate-rela.c b/tools/relocate-rela.c
index 689e2d4655..84531b23a6 100644
--- a/tools/relocate-rela.c
+++ b/tools/relocate-rela.c
@@ -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 == 0x01)
+		return le16_to_cpu(data);
+
+	return be16_to_cpu(data);
+}
+
+static uint32_t elf32_to_cpu(uint32_t data)
+{
+	if (ei_data == 0x01)
+		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);