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