From owner-p4-projects@FreeBSD.ORG Sun Aug 27 22:24:29 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 108E816A4E1; Sun, 27 Aug 2006 22:24:29 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C7AEA16A4DA for ; Sun, 27 Aug 2006 22:24:28 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5F1D243D4C for ; Sun, 27 Aug 2006 22:24:28 +0000 (GMT) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k7RMOSDA007766 for ; Sun, 27 Aug 2006 22:24:28 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k7RMORav007763 for perforce@freebsd.org; Sun, 27 Aug 2006 22:24:27 GMT (envelope-from jb@freebsd.org) Date: Sun, 27 Aug 2006 22:24:27 GMT Message-Id: <200608272224.k7RMORav007763@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 105194 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 27 Aug 2006 22:24:29 -0000 http://perforce.freebsd.org/chv.cgi?CH=105194 Change 105194 by jb@jb_freebsd2 on 2006/08/27 22:23:39 IFlibbsdelf Affected files ... .. //depot/projects/dtrace/src/lib/libelf/Makefile#11 integrate .. //depot/projects/dtrace/src/lib/libelf/_libelf.h#7 integrate .. //depot/projects/dtrace/src/lib/libelf/elf.3#3 integrate .. //depot/projects/dtrace/src/lib/libelf/elf_begin.c#4 integrate .. //depot/projects/dtrace/src/lib/libelf/elf_errmsg.3#2 integrate .. //depot/projects/dtrace/src/lib/libelf/elf_errmsg.c#8 integrate .. //depot/projects/dtrace/src/lib/libelf/elf_flag.c#1 branch .. //depot/projects/dtrace/src/lib/libelf/elf_flagdata.3#2 integrate .. //depot/projects/dtrace/src/lib/libelf/elf_getdata.3#1 branch .. //depot/projects/dtrace/src/lib/libelf/elf_getscn.3#1 branch .. //depot/projects/dtrace/src/lib/libelf/elf_memory.c#5 integrate .. //depot/projects/dtrace/src/lib/libelf/elf_scn.c#1 branch .. //depot/projects/dtrace/src/lib/libelf/gelf_getehdr.3#5 integrate .. //depot/projects/dtrace/src/lib/libelf/gelf_getphdr.3#1 branch .. //depot/projects/dtrace/src/lib/libelf/gelf_getshdr.3#1 branch .. //depot/projects/dtrace/src/lib/libelf/gelf_newehdr.3#6 integrate .. //depot/projects/dtrace/src/lib/libelf/gelf_newphdr.3#1 branch .. //depot/projects/dtrace/src/lib/libelf/gelf_phdr.c#1 branch .. //depot/projects/dtrace/src/lib/libelf/gelf_update.c#1 branch .. //depot/projects/dtrace/src/lib/libelf/gelf_update_ehdr.3#1 branch .. //depot/projects/dtrace/src/lib/libelf/gelf_xlatetof.3#3 integrate .. //depot/projects/dtrace/src/lib/libelf/libelf.h#7 integrate .. //depot/projects/dtrace/src/lib/libelf/libelf_allocate.c#3 integrate .. //depot/projects/dtrace/src/lib/libelf/libelf_phdr.c#1 branch Differences ... ==== //depot/projects/dtrace/src/lib/libelf/Makefile#11 (text+ko) ==== @@ -8,8 +8,7 @@ elf_dump_argv.c \ elf_end.c elf_errmsg.c elf_errno.c \ elf_fill.c \ - elf_flagelf.c \ - elf_getarhdr.c \ + elf_flag.c \ elf_getbase.c \ elf_getdata.c \ elf_getident.c \ @@ -25,27 +24,20 @@ elf_rand.c \ elf_rawdata.c \ elf_rawfile.c \ - elf_strptr.c \ - elf_update.c \ + elf_scn.c \ elf_version.c \ gelf_fsize.c \ gelf_getclass.c \ + gelf_getshdr.c \ gelf_ehdr.c \ - gelf_getphdr.c \ - gelf_getshdr.c \ - gelf_getsym.c \ - gelf_newphdr.c \ - gelf_rel.c \ - gelf_rela.c \ - gelf_update_ehdr.c \ - gelf_update_phdr.c \ - gelf_update_shdr.c \ - gelf_update_sym.c \ + gelf_phdr.c \ + gelf_update.c \ gelf_xlate.c \ libelf.c \ libelf_allocate.c \ libelf_ar.c \ - libelf_ehdr.c + libelf_ehdr.c \ + libelf_phdr.c INCS= libelf.h gelf.h DPSRCS+= libelf_fsize.c libelf_msize.c libelf_convert.c @@ -67,7 +59,9 @@ elf_getarhdr.3 \ elf_getarsym.3 \ elf_getbase.3 \ + elf_getdata.3 \ elf_getident.3 \ + elf_getscn.3 \ elf_hash.3 \ elf_kind.3 \ elf_memory.3 \ @@ -77,67 +71,56 @@ elf_version.3 \ gelf.3 \ gelf_fsize.3 \ + gelf_getclass.3 \ gelf_getehdr.3 \ + gelf_getphdr.3 \ + gelf_getshdr.3 \ gelf_newehdr.3 \ - gelf_getclass.3 \ + gelf_newphdr.3 \ + gelf_update_ehdr.3 \ gelf_xlatetof.3 -MLINKS+= \ - gelf.3 gelf_checksum.3 \ - gelf.3 gelf_getdyn.3 \ - gelf.3 gelf_getmove.3 \ - gelf.3 gelf_getphdr.3 \ - gelf.3 gelf_getrel.3 \ - gelf.3 gelf_getrela.3 \ - gelf.3 gelf_getshdr.3 \ - gelf.3 gelf_getsym.3 \ - gelf.3 gelf_getsyminfo.3 \ - gelf.3 gelf_update_dyn.3 \ - gelf.3 gelf_update_ehr.3 \ - gelf.3 gelf_update_move.3 \ - gelf.3 gelf_update_rela.3 \ - gelf.3 gelf_update_shdr.3 \ - gelf.3 gelf_update_sym.3 \ - gelf.3 gelf_update_syminfo.3 \ +MLINKS+= \ + gelf.3 gelf_checksum.3 \ + gelf.3 gelf_getdyn.3 \ + gelf.3 gelf_getmove.3 \ + gelf.3 gelf_getrel.3 \ + gelf.3 gelf_getrela.3 \ + gelf.3 gelf_getsym.3 \ + gelf.3 gelf_getsyminfo.3 \ + gelf_update_ehdr.3 gelf_update_phdr.3 \ + gelf_update_ehdr.3 gelf_update_shdr.3 \ + gelf.3 gelf_update_move.3 \ + gelf.3 gelf_update_rela.3 \ + gelf.3 gelf_update_sym.3 \ + gelf.3 gelf_update_syminfo.3 \ gelf_xlatetof.3 gelf_xlatetom.3 MLINKS+= \ - gelf_fsize.3 elf32_fsize.3 \ - gelf_fsize.3 elf64_fsize.3 \ - gelf_getehdr.3 elf32_getehdr.3 \ - gelf_getehdr.3 elf64_getehdr.3 \ - gelf_newehdr.3 elf32_newehdr.3 \ - gelf_newehdr.3 elf64_newehdr.3 - - -MLINKS+= \ - elf_flagdata.3 elf_flagehdr.3 \ - elf_flagdata.3 elf_flagelf.3 \ - elf_flagdata.3 elf_flagphdr.3 \ - elf_flagdata.3 elf_flagscn.3 \ - elf_flagdata.3 elf_flagshdr.3 \ - elf.3 elf_getdata.3 \ - elf.3 elf_getscn.3 \ - elf.3 elf_ndxscn.3 \ - elf.3 elf_newdata.3 \ - elf.3 elf_newscn.3 \ - elf.3 elf_nextscn.3 \ - elf.3 elf_rawdata.3 \ - elf.3 elf_strptr.3 \ + elf_errmsg.3 elf_errno.3 \ + elf_flagdata.3 elf_flagehdr.3 \ + elf_flagdata.3 elf_flagelf.3 \ + elf_flagdata.3 elf_flagphdr.3 \ + elf_flagdata.3 elf_flagscn.3 \ + elf_flagdata.3 elf_flagshdr.3 \ + elf_getdata.3 elf_newdata.3 \ + elf_getdata.3 elf_rawdata.3 \ + elf_getscn.3 elf_ndxscn.3 \ + elf_getscn.3 elf_newscn.3 \ + elf_getscn.3 elf_nextscn.3 \ + elf.3 elf_strptr.3 \ elf.3 elf_update.3 -MLINKS+= \ - elf_errmsg.3 elf_errno.3 - .for E in 32 64 MLINKS+= \ - elf.3 elf${E}_checksum.3 \ - elf.3 elf${E}_getphdr.3 \ - elf.3 elf${E}_getshdr.3 \ - elf.3 elf${E}_newphdr.3 \ - gelf_getehdr.3 elf${E}_getehdr.3 \ - gelf_newehdr.3 elf${E}_newehdr.3 \ - gelf_xlatetof.3 elf${E}_xlatetof.3 \ + elf.3 elf${E}_checksum.3 \ + gelf_fsize.3 elf${E}_fsize.3 \ + gelf_getehdr.3 elf${E}_getehdr.3 \ + gelf_getphdr.3 elf${E}_getphdr.3 \ + gelf_getshdr.3 elf${E}_getshdr.3 \ + gelf_newehdr.3 elf${E}_newehdr.3 \ + gelf_newphdr.3 elf${E}_newphdr.3 \ + gelf_xlatetof.3 elf${E}_xlatetof.3 \ gelf_xlatetof.3 elf${E}_xlatetom.3 .endfor ==== //depot/projects/dtrace/src/lib/libelf/_libelf.h#7 (text+ko) ==== @@ -59,7 +59,7 @@ #define LIBELF_OS_ERROR_SHIFT 8 #define LIBELF_SET_ERROR(E, O) do { \ - LIBELF_PRIVATE(error) = ((ELF_E_##E & LIBELF_ELF_ERROR_MASK)| \ + LIBELF_PRIVATE(error) = ((ELF_E_##E & LIBELF_ELF_ERROR_MASK)| \ ((O) << LIBELF_OS_ERROR_SHIFT)); \ } while (0) @@ -69,10 +69,12 @@ * Flags for library internal use. These use the upper 16 bits of a * flags field. */ +#define LIBELF_F_ALLOCED 0x010000 /* whether e_rawfile is malloc'ed */ +#define LIBELF_F_MMAP 0x020000 /* whether e_rawfile was mmap'ed */ +#define LIBELF_F_EHDR_DIRTY 0x040000 /* TODO: check if these 3 can be */ +#define LIBELF_F_PHDR_DIRTY 0x080000 /* folded into one flag. */ +#define LIBELF_F_SHDR_DIRTY 0x100000 -#define LIBELF_F_ALLOCED 0x10000 /* whether e_rawfile is malloc'ed */ -#define LIBELF_F_MMAP 0x20000 /* whether e_rawfile was mmap'ed by us */ - struct _Elf { int e_activations; /* activation count */ unsigned int e_byteorder; /* ELFDATA* */ @@ -106,14 +108,24 @@ Elf32_Phdr *e_phdr32; Elf64_Phdr *e_phdr64; } e_phdr; - union { - Elf32_Phdr *e_shdr32; - Elf64_Phdr *e_shdr64; - } e_shdr; + STAILQ_HEAD(, _Elf_Scn) e_scn; /* section list */ } e_elf; } e_u; }; +struct _Elf_Scn { + STAILQ_HEAD(, _Elf_Scn) s_data; /* list of Elf_Data descriptors */ + struct _Elf *s_elf; /* parent ELF descriptor */ + unsigned int s_flags; /* flags for the section as a whole */ + size_t s_ndx; /* index# for this section */ + STAILQ_ENTRY(_Elf_Scn) s_next; + union { + Elf32_Shdr s_shdr32; + Elf64_Shdr s_shdr64; + } s_shdr; +}; + + enum { ELF_TOFILE, ELF_TOMEMORY @@ -124,6 +136,7 @@ */ Elf *_libelf_allocate_elf(void); +Elf *_libelf_ar_open(Elf *_e); int _libelf_dump32(Elf *_elf, const char *_name, const char *_outfile, unsigned int _flags); int _libelf_dump64(Elf *_elf, const char *_name, const char *_outfile, @@ -131,9 +144,11 @@ void *_libelf_ehdr(Elf *_e, int _elfclass, int _allocate); void (*_libelf_get_translator(Elf_Type _t, int _direction, int _elfclass)) (char *_dst, char *_src, int _cnt, int _byteswap); +void *_libelf_getphdr(Elf *_e, int _elfclass); +void _libelf_init_elf(Elf *_e, Elf_Kind _kind); int _libelf_malign(Elf_Type _t, int _elfclass); size_t _libelf_msize(Elf_Type _t, int _elfclass, unsigned int _version); -Elf *_libelf_ar_open(Elf *_e); +void *_libelf_newphdr(Elf *_e, int _elfclass, size_t _count); void _libelf_release_elf(Elf *_e); #endif /* __LIBELF_H_ */ ==== //depot/projects/dtrace/src/lib/libelf/elf.3#3 (text+ko) ==== @@ -42,8 +42,11 @@ . \" (natively ordered data structures getting translated to . \" file representation at update() time. Describe the ELF_F_DIRTY . \" bit. +. \" Describe the ELF_F_LAYOUT bit. . \" Memory management discipline: Note that no ELF data structure should . \" be explicitly free()'ed by the application. All free'ing happens when . \" an elf_end() is done, after which pointers go stale. . \" Describe all prefixes used by the library and namespace use by . \" and (in gelf.3). +. \" Describe the members of the Elf_Data and the rules governing their +. \" use. ==== //depot/projects/dtrace/src/lib/libelf/elf_begin.c#4 (text+ko) ==== @@ -153,9 +153,9 @@ } if ((e = _libelf_allocate_elf()) != NULL) { + _libelf_init_elf(e, ELF_K_ELF); e->e_byteorder = LIBELF_PRIVATE(byteorder); e->e_fd = fd; - e->e_kind = ELF_K_ELF; e->e_cmd = c; } return (e); ==== //depot/projects/dtrace/src/lib/libelf/elf_errmsg.3#2 (text+ko) ==== @@ -27,7 +27,7 @@ .Os .Dt ELF 3 .Sh NAME -.Nm elf_errmsg +.Nm elf_errmsg , .Nm elf_errno .Nd ELF library error message handling .Sh LIBRARY ==== //depot/projects/dtrace/src/lib/libelf/elf_errmsg.c#8 (text+ko) ==== @@ -46,7 +46,9 @@ DEFINE_ERROR(HEADER, "Missing or malformed ELF header"), DEFINE_ERROR(MMAP, "File mapping failed"), DEFINE_ERROR(MODE, "Incorrect ELF descriptor mode"), + DEFINE_ERROR(RANGE, "Value out of range of target"), DEFINE_ERROR(RESOURCE, "Resource exhaustion"), + DEFINE_ERROR(SECTION, "Section descriptor was invalid"), DEFINE_ERROR(SEQUENCE, "API calls out of sequence"), DEFINE_ERROR(STAT, "Cannot determine file parameters"), DEFINE_ERROR(TRUNCATE, "File truncation failed"), ==== //depot/projects/dtrace/src/lib/libelf/elf_flagdata.3#2 (text+ko) ==== @@ -27,11 +27,11 @@ .Os .Dt ELF 3 .Sh NAME -.Nm elf_flagdata -.Nm elf_flagehdr -.Nm elf_flagelf -.Nm elf_flagphdr -.Nm elf_flagscn +.Nm elf_flagdata , +.Nm elf_flagehdr , +.Nm elf_flagelf , +.Nm elf_flagphdr , +.Nm elf_flagscn , .Nm elf_flagshdr .Nd manipulate flags associated with ELF(3) data structures .Sh LIBRARY @@ -47,7 +47,7 @@ .Ft "unsigned int" .Fn elf_flagphdr "Elf *elf" "Elf_Cmd cmd" "unsigned int flags" .Ft "unsigned int" -.Fn elf_flagscn "Elf *elf" "Elf_Cmd cmd" "unsigned int flags" +.Fn elf_flagscn "Elf_Scn *scn" "Elf_Cmd cmd" "unsigned int flags" .Ft "unsigned int" .Fn elf_flagshdr "Elf_Scn *scn" "Elf_Cmd cmd" "unsigned int flags" .Sh DESCRIPTION @@ -68,13 +68,13 @@ may have the following values: .Bl -tag -width ELF_C_SET .It Dv ELF_C_CLR -The non-zero bits in argument +The argument .Ar flags -are to be cleared. +specifies the bits to be cleared. .It Dv ELF_C_SET -The non-zero bits in arguments +The argument .Ar flags -are to be set. +specifies the bits to be set. .El .Pp The argument @@ -93,24 +93,46 @@ .It Dv ELF_F_LAYOUT This flag is only valid with the .Fn elf_flagelf -API, and for ELF descriptors opened for writing. +API. It informs the library that the application will take responsibility for the layout of the file and that the library is not to insert any padding in between sections. .El +.Pp +Marking a given data structure as +.Dq dirty +affects all of its contained elements. +Thus marking an ELF descriptor +.Ar elf +with +.Fn elf_flagelf "elf" "ELF_C_SET" "ELF_F_DIRTY" +means that the entire contents of the descriptor are +.Dq dirty . .Sh RETURN VALUES -These functions return the updated bits is succesful, and zero +These functions return the updated bits is successful, and zero if an error is detected. .Sh ERRORS +These functions may fail with the following errors: .Bl -tag -width "[ELF_E_RESOURCE]" .It Bq Er ELF_E_ARGUMENT -An supported value was used the +An unsupported value was used for the .Ar cmd argument. .It Bq Er ELF_E_ARGUMENT Argument .Ar flags -had an unknown flag bit set. +was zero or had unsupported flag bits set. +.It Bq Er ELF_E_ARGUMENT +The descriptors +.Ar data , +.Ar elf , +or +.Ar scn +were not opened for writing. +.It Bq Er ELF_E_ARGUMENT +The argument +.Ar elf +was not a descriptor for an ELF object. .El .Sh SEE ALSO .Xr elf 3 , ==== //depot/projects/dtrace/src/lib/libelf/elf_memory.c#5 (text+ko) ==== @@ -49,10 +49,8 @@ return (NULL); } - if ((e = _libelf_allocate_elf()) == NULL) { - LIBELF_SET_ERROR(RESOURCE, 0); + if ((e = _libelf_allocate_elf()) == NULL) return (NULL); - } e->e_cmd = ELF_C_READ; e->e_rawfile = image; @@ -64,7 +62,7 @@ (P)[EI_MAG3] == ELFMAG3) if (sz > EI_NIDENT && LIBELF_IS_ELF(image)) { - e->e_kind = ELF_K_ELF; + _libelf_init_elf(e, ELF_K_ELF); e->e_class = image[EI_CLASS]; e->e_byteorder = image[EI_DATA]; e->e_version = image[EI_VERSION]; @@ -74,10 +72,11 @@ LIBELF_SET_ERROR(VERSION, 0); return (NULL); } - } else if (sz >= SARMAG && strncmp(image, ARMAG, SARMAG) == 0) + } else if (sz >= SARMAG && strncmp(image, ARMAG, SARMAG) == 0) { + _libelf_init_elf(e, ELF_K_AR); e = _libelf_ar_open(e); - else - e->e_kind = ELF_K_NONE; + } else + _libelf_init_elf(e, ELF_K_NONE); return (e); } ==== //depot/projects/dtrace/src/lib/libelf/gelf_getehdr.3#5 (text+ko) ==== @@ -27,8 +27,8 @@ .Os .Dt ELF 3 .Sh NAME -.Nm elf32_getehdr -.Nm elf64_getehdr +.Nm elf32_getehdr , +.Nm elf64_getehdr , .Nm gelf_getehdr .Nd retrieve the object file header .Sh LIBRARY @@ -111,6 +111,7 @@ .Sh SEE ALSO .Xr elf 3 , .Xr elf_getident 3 , +.Xr elf_flagehdr 3 , .Xr elf32_newehdr 3 , .Xr elf64_newehdr 3 , .Xr gelf 3 , ==== //depot/projects/dtrace/src/lib/libelf/gelf_newehdr.3#6 (text+ko) ==== @@ -27,8 +27,8 @@ .Os .Dt ELF 3 .Sh NAME -.Nm elf32_newehdr -.Nm elf64_newehdr +.Nm elf32_newehdr , +.Nm elf64_newehdr , .Nm gelf_newehdr .Nd retrieve or allocate the object file header .Sh LIBRARY ==== //depot/projects/dtrace/src/lib/libelf/gelf_xlatetof.3#3 (text+ko) ==== @@ -27,8 +27,8 @@ .Os .Dt ELF 3 .Sh NAME -.Nm elf32_xlate -.Nm elf64_xlate +.Nm elf32_xlate , +.Nm elf64_xlate , .Nm gelf_xlate .Nd translate data between files and memory .Sh LIBRARY ==== //depot/projects/dtrace/src/lib/libelf/libelf.h#7 (text+ko) ==== @@ -32,10 +32,11 @@ #include #include #include +#include /* Library private data structures */ typedef struct _Elf Elf; -typedef struct _ElfScn Elf_Scn; +typedef struct _Elf_Scn Elf_Scn; /* File types */ typedef enum { @@ -99,13 +100,16 @@ * An `Elf_Data' structure describes data in an * ELF section. */ -typedef struct { +typedef struct _Elf_Data { void *d_buf; off_t d_off; size_t d_align; size_t d_size; Elf_Type d_type; unsigned int d_version; + + Elf_Scn *d_scn; /* containing section */ + STAILQ_ENTRY(_Elf_Data) d_next; } Elf_Data; /* @@ -141,11 +145,13 @@ ELF_E_ARCHIVE, /* Malformed ar(1) archive */ ELF_E_ARGUMENT, /* Invalid argument */ ELF_E_CLASS, /* Mismatched ELF class */ - ELF_E_DATA, /* Invalid data buffer descriptor */ + ELF_E_DATA, /* Invalid data descriptor */ ELF_E_HEADER, /* Missing or malformed ELF header */ ELF_E_MMAP, /* File mapping failed */ ELF_E_MODE, /* Wrong mode for ELF descriptor */ + ELF_E_RANGE, /* Value out of range */ ELF_E_RESOURCE, /* Resource exhaustion */ + ELF_E_SECTION, /* Invalid section descriptor */ ELF_E_SEQUENCE, /* API calls out of sequence */ ELF_E_STAT, /* Cannot determine file parameters */ ELF_E_TRUNCATE, /* File truncation failed */ ==== //depot/projects/dtrace/src/lib/libelf/libelf_allocate.c#3 (text+ko) ==== @@ -64,9 +64,24 @@ (void) memset(&e->e_u, 0, sizeof(e->e_u)); - /* TODO: Initialize the rest of the structure. */ + return (e); +} + +void +_libelf_init_elf(Elf *e, Elf_Kind kind) +{ + assert(e != NULL); + assert(e->e_kind == ELF_K_NONE); + + e->e_kind = kind; - return (e); + switch (kind) { + case ELF_K_ELF: + STAILQ_INIT(&e->e_u.e_elf.e_scn); + break; + default: + break; + } } #define FREE(P) do { \ @@ -83,6 +98,19 @@ FREE(e->e_u.e_ar.e_symtab); break; + case ELF_K_ELF: + switch (e->e_class) { + case ELFCLASS32: + FREE(e->e_u.e_elf.e_ehdr.e_ehdr32); + FREE(e->e_u.e_elf.e_phdr.e_phdr32); + break; + case ELFCLASS64: + FREE(e->e_u.e_elf.e_ehdr.e_ehdr64); + FREE(e->e_u.e_elf.e_phdr.e_phdr64); + break; + } + break; + default: break; }