This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 7829d5af7f18d81344a6673c25f725dd116ba75a Author: yezhonghui <[email protected]> AuthorDate: Thu Jan 29 14:19:59 2026 +0800 elf: include both elf32.h and elf64.h in elf.h Modify elf.h to include both elf32.h and elf64.h simultaneously, allowing code to use both 32-bit and 64-bit ELF structures. Changes: - elf.h: Include both elf32.h and elf64.h, define generic Elf_* type aliases and ELF_* macros based on CONFIG_ARCH_64BIT - elf32.h: Remove generic aliases and circular include of elf.h - elf64.h: Remove generic aliases and circular include of elf.h This enables parsing ELF files of different architectures on any platform. Signed-off-by: yezhonghui <[email protected]> Signed-off-by: Marco Casaroli <[email protected]> --- include/elf.h | 49 ++++++++++++++++++++++++++++++++++++++++++++----- include/elf32.h | 26 +++----------------------- include/elf64.h | 26 +++----------------------- 3 files changed, 50 insertions(+), 51 deletions(-) diff --git a/include/elf.h b/include/elf.h index 75475d4aa54..ec702dca4a5 100644 --- a/include/elf.h +++ b/include/elf.h @@ -35,11 +35,8 @@ /* NOTE: elf64.h and elf32.h refer EI_NIDENT defined above */ -#ifdef CONFIG_ARCH_64BIT -# include <elf64.h> -#else -# include <elf32.h> -#endif +#include <elf32.h> +#include <elf64.h> /**************************************************************************** * Pre-processor Definitions @@ -396,4 +393,46 @@ # define ELF_DATA ELFDATA2LSB #endif +/* Generic ELF type aliases based on architecture */ + +#ifdef CONFIG_ARCH_64BIT +# define ELF_CLASS ELFCLASS64 +# define ELF_ST_TYPE(a) ELF64_ST_TYPE(a) +# define ELF_ST_BIND(a) ELF64_ST_BIND(a) +# define ELF_ST_VISIBILITY(o) ELF64_ST_VISIBILITY(o) +# define ELF_R_SYM(i) ELF64_R_SYM(i) +# define ELF_R_TYPE(i) ELF64_R_TYPE(i) + +typedef Elf64_Addr Elf_Addr; +typedef Elf64_Ehdr Elf_Ehdr; +typedef Elf64_Rel Elf_Rel; +typedef Elf64_Rela Elf_Rela; +typedef Elf64_Nhdr Elf_Nhdr; +typedef Elf64_Phdr Elf_Phdr; +typedef Elf64_Sym Elf_Sym; +typedef Elf64_Shdr Elf_Shdr; +typedef Elf64_Off Elf_Off; +typedef Elf64_Word Elf_Word; +typedef Elf64_Dyn Elf_Dyn; +#else +# define ELF_CLASS ELFCLASS32 +# define ELF_ST_TYPE(a) ELF32_ST_TYPE(a) +# define ELF_ST_BIND(a) ELF32_ST_BIND(a) +# define ELF_ST_VISIBILITY(o) ELF32_ST_VISIBILITY(o) +# define ELF_R_SYM(i) ELF32_R_SYM(i) +# define ELF_R_TYPE(i) ELF32_R_TYPE(i) + +typedef Elf32_Addr Elf_Addr; +typedef Elf32_Ehdr Elf_Ehdr; +typedef Elf32_Rel Elf_Rel; +typedef Elf32_Rela Elf_Rela; +typedef Elf32_Nhdr Elf_Nhdr; +typedef Elf32_Phdr Elf_Phdr; +typedef Elf32_Sym Elf_Sym; +typedef Elf32_Shdr Elf_Shdr; +typedef Elf32_Off Elf_Off; +typedef Elf32_Word Elf_Word; +typedef Elf32_Dyn Elf_Dyn; +#endif + #endif /* __INCLUDE_ELF_H */ diff --git a/include/elf32.h b/include/elf32.h index 1e62a7cf913..2dd6a6974ba 100644 --- a/include/elf32.h +++ b/include/elf32.h @@ -30,34 +30,26 @@ #include <nuttx/config.h> #include <stdint.h> -#include <elf.h> /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ -#define ELF_CLASS ELFCLASS32 +#ifndef EI_NIDENT +# define EI_NIDENT 16 /* Size of e_ident[] */ +#endif #define ELF32_ST_BIND(i) ((i) >> 4) #define ELF32_ST_TYPE(i) ((i) & 0xf) #define ELF32_ST_INFO(b,t) (((b) << 4) | ((t) & 0xf)) #define ELF32_ST_VISIBILITY(o) ((o) & 0x3) -/* Generic macro to abstract ELF32/ELF64 type/bind */ - -#define ELF_ST_TYPE(a) ELF32_ST_TYPE(a) -#define ELF_ST_BIND(a) ELF32_ST_BIND(a) -#define ELF_ST_VISIBILITY(o) ELF32_ST_VISIBILITY(o) - /* Definitions for Elf32_Rel*::r_info */ #define ELF32_R_SYM(i) ((i) >> 8) #define ELF32_R_TYPE(i) ((i) & 0xff) #define ELF32_R_INFO(s,t) (((s)<< 8) | ((t) & 0xff)) -#define ELF_R_SYM(i) ELF32_R_SYM(i) -#define ELF_R_TYPE(i) ELF32_R_TYPE(i) - /**************************************************************************** * Public Type Definitions ****************************************************************************/ @@ -168,16 +160,4 @@ typedef struct } d_un; } Elf32_Dyn; -typedef Elf32_Addr Elf_Addr; -typedef Elf32_Ehdr Elf_Ehdr; -typedef Elf32_Rel Elf_Rel; -typedef Elf32_Rela Elf_Rela; -typedef Elf32_Nhdr Elf_Nhdr; -typedef Elf32_Phdr Elf_Phdr; -typedef Elf32_Sym Elf_Sym; -typedef Elf32_Shdr Elf_Shdr; -typedef Elf32_Off Elf_Off; -typedef Elf32_Word Elf_Word; -typedef Elf32_Dyn Elf_Dyn; - #endif /* __INCLUDE_ELF32_H */ diff --git a/include/elf64.h b/include/elf64.h index 27ac06246db..6747d593a95 100644 --- a/include/elf64.h +++ b/include/elf64.h @@ -30,13 +30,14 @@ #include <nuttx/config.h> #include <stdint.h> -#include <elf.h> /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ -#define ELF_CLASS ELFCLASS64 +#ifndef EI_NIDENT +# define EI_NIDENT 16 /* Size of e_ident[] */ +#endif /* See ELF-64 Object File Format: Version 1.5 Draft 2 */ @@ -45,21 +46,12 @@ #define ELF64_ST_INFO(b,t) (((b) << 4) | ((t) & 0xf)) #define ELF64_ST_VISIBILITY(o) ((o) & 0x3) -/* Generic macro to abstract ELF32/ELF64 type/bind */ - -#define ELF_ST_TYPE(a) ELF64_ST_TYPE(a) -#define ELF_ST_BIND(a) ELF64_ST_BIND(a) -#define ELF_ST_VISIBILITY(o) ELF64_ST_VISIBILITY(o) - /* Definitions for Elf64_Rel*::r_info */ #define ELF64_R_SYM(i) ((i) >> 32) #define ELF64_R_TYPE(i) ((i) & 0xffffffffL) #define ELF64_R_INFO(s,t) (((s)<< 32) + ((t) & 0xffffffffL)) -#define ELF_R_SYM(i) ELF64_R_SYM(i) -#define ELF_R_TYPE(i) ELF64_R_TYPE(i) - /**************************************************************************** * Public Type Definitions ****************************************************************************/ @@ -172,16 +164,4 @@ typedef struct } d_un; } Elf64_Dyn; -typedef Elf64_Addr Elf_Addr; -typedef Elf64_Ehdr Elf_Ehdr; -typedef Elf64_Rel Elf_Rel; -typedef Elf64_Rela Elf_Rela; -typedef Elf64_Nhdr Elf_Nhdr; -typedef Elf64_Phdr Elf_Phdr; -typedef Elf64_Sym Elf_Sym; -typedef Elf64_Shdr Elf_Shdr; -typedef Elf64_Off Elf_Off; -typedef Elf64_Word Elf_Word; -typedef Elf64_Dyn Elf_Dyn; - #endif /* __INCLUDE_ELF64_H */
