PERFORCE change 105194 for review

John Birrell jb at FreeBSD.org
Sun Aug 27 22:24:29 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=105194

Change 105194 by jb at 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 <libelf.h>
 . \" and <gelf.h> (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 <sys/types.h>
 #include <sys/elf32.h>
 #include <sys/elf64.h>
+#include <sys/queue.h>
 
 /* 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;
 	}


More information about the p4-projects mailing list