Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Oct 2006 23:06:39 GMT
From:      John Birrell <jb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 108538 for review
Message-ID:  <200610262306.k9QN6dOt052292@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=108538

Change 108538 by jb@jb_freebsd8 on 2006/10/26 23:05:52

	IFlibbsdelf

Affected files ...

.. //depot/projects/dtrace/src/lib/libelf/elf_update.3#2 integrate
.. //depot/projects/dtrace/src/lib/libelf/elf_update.c#3 integrate
.. //depot/projects/dtrace/src/lib/libelf/gelf_newehdr.3#7 integrate
.. //depot/projects/dtrace/src/lib/libelf/libelf_ehdr.c#6 integrate

Differences ...

==== //depot/projects/dtrace/src/lib/libelf/elf_update.3#2 (text+ko) ====

@@ -72,7 +72,14 @@
 .It "Executable Header"
 The ELF executable header is described in
 .Xr elf 5 .
-.Bl -tag -width "e_ident[EI_DATA]" -compact
+The following members of the ELF executable header are the application's
+responsibility:
+.Pp
+.Bl -tag -width "e_ident[EI_OSABI]" -compact
+.It Va e_entry
+Set to the desired entry address for executables.
+.It Va e_flags
+Set to the desired processor specific flags.
 .It Va "e_ident[EI_DATA]"
 Must be set to one of
 .Dv ELFDATA2LSB
@@ -81,30 +88,30 @@
 .It Va "e_ident[EI_OSABI]"
 Set to the OS ABI desired.
 For
-.Os
-executable, this field should be set to
+.Fx
+executables, this field should be set to
 .Dv ELFOSABI_FREEBSD .
+.It Va e_machine
+Set to the desired machine architecture, one of the
+.Dv EM_*
+values in
+.In sys/elf_common.h .
+.It Va e_phoff
+If the application is managing the object's layout, it must
+set this field to the file offset of the ELF program header table.
+.It Va e_shoff
+If the application is managing the object's layout, it must
+set this field to the file offset of the ELF section header table.
+.It Va e_shstrndx
+Set to the index of the string table containing
+section names.
 .It Va e_type
-The type of the ELF object, one of the
+Set to the type of the ELF object, one of the
 .Dv ET_*
-values.
-.It Va e_machine
-The desired machine architecture.
+values in
+.In sys/elf_common.h .
 .It Va e_version
 Set to the desired version of the ELF object.
-Currently only
-.Dv EV_CURRENT
-is supported.
-.It Va e_entry
-Set to the desired entry address.
-.It Va e_phoff
-If the application is managing the object's layout.
-.It Va e_shoff
-If the application is managing the object's layout.
-.It Va e_flags
-Set to the desired processor specific flags.
-.It Va e_shstrndx
-Set to the index of the string table.
 .El
 .It "Program Header"
 All fields of the entries in the program header table are
@@ -112,32 +119,40 @@
 .It "Section Header"
 The ELF section header is described in
 .Xr elf 5 .
+The following members of the ELF section header are the
+application's responsibility:
+.Pp
 .Bl -tag -width "sh_addralign" -compact
-.It Va sh_name
-Set to the index of the section in the string table.
-.It Va sh_type
-Set to the type of the section.
+.It Va sh_addr
+Set to the physical memory address where the section should reside.
+.It Va sh_addralign
+If the application is managing the file layout, it must set this
+field to the desired alignment for the section's contents.
+This value must be a power of two.
+.It Va sh_entsize
+Set to the size of each entry, for sections containing fixed size
+elements.
+For section contents of types known to the library, the application
+may leave this field as zero.
 .It Va sh_flags
 Set to the desired section flags.
-.It Va sh_addr
-Set the physical memory address where the section should reside.
+.It Va sh_info
+Set as described in
+.Xr elf 5 .
+.It Va sh_link
+Set as described in
+.Xr elf 5 .
+.It Va sh_name
+Set to the index of the section's name in the string table containing
+section names.
 .It Va sh_offset
-Set to the file offset of the section's data if the application is managing
-the layout.
+If the application is managing the file layout, it must set this
+field to the file offset of the section's contents.
 .It Va sh_size
-Set to the size of the section's data if the application is managing
-the layout.
-.It Va sh_link
-As described in
-.Xr elf 5 .
-.It Va sh_info
-As described in
-.Xr elf 5 .
-.It Va sh_addralign
-Set to the desired alignment constraint if the application is managing
-the file layout.
-.It Va sh_entsize
-Set to the size of each entry, for sections containing fixed size elements.
+If the application is managing the file layout, it must set this
+field to the file size of the section's contents.
+.It Va sh_type
+Set to the type of the section.
 .El
 .El
 .Pp

==== //depot/projects/dtrace/src/lib/libelf/elf_update.c#3 (text+ko) ====

@@ -76,7 +76,7 @@
 	int ec;
 	Elf_Data *d, *td;
 	unsigned int elftype;
-	uint64_t sh_align, sh_offset, sh_size;
+	uint64_t sh_align, sh_entsize, sh_offset, sh_size;
 	uint64_t scn_size, scn_alignment;
 
 	/*
@@ -100,15 +100,17 @@
 	ec = e->e_class;
 
 	if (ec == ELFCLASS32) {
-		elftype   = _libelf_xlate_shtype(s->s_shdr.s_shdr32.sh_type);
-		sh_align  = (uint64_t) s->s_shdr.s_shdr32.sh_addralign;
-		sh_size   = (uint64_t) s->s_shdr.s_shdr32.sh_size;
-		sh_offset = (uint64_t) s->s_shdr.s_shdr32.sh_offset;
+		elftype    = _libelf_xlate_shtype(s->s_shdr.s_shdr32.sh_type);
+		sh_align   = (uint64_t) s->s_shdr.s_shdr32.sh_addralign;
+		sh_entsize = (uint64_t) s->s_shdr.s_shdr32.sh_entsize;
+		sh_offset  = (uint64_t) s->s_shdr.s_shdr32.sh_offset;
+		sh_size    = (uint64_t) s->s_shdr.s_shdr32.sh_size;
 	} else {
-		elftype   = _libelf_xlate_shtype(s->s_shdr.s_shdr64.sh_type);
-		sh_align  = s->s_shdr.s_shdr64.sh_addralign;
-		sh_size   = s->s_shdr.s_shdr64.sh_size;
-		sh_offset = s->s_shdr.s_shdr64.sh_offset;
+		elftype    = _libelf_xlate_shtype(s->s_shdr.s_shdr64.sh_type);
+		sh_align   = s->s_shdr.s_shdr64.sh_addralign;
+		sh_entsize = s->s_shdr.s_shdr64.sh_entsize;
+		sh_offset  = s->s_shdr.s_shdr64.sh_offset;
+		sh_size    = s->s_shdr.s_shdr64.sh_size;
 	}
 
 	if (elftype > ELF_T_LAST) {
@@ -164,17 +166,23 @@
 		if (scn_alignment > sh_align)
 			sh_align = scn_alignment;
 
+		if (sh_entsize == 0)
+			sh_entsize = _libelf_fsize(elftype, ec, e->e_version,
+			    1);
+
 		sh_size = scn_size;
 		sh_offset = roundup(*rc, sh_align);
 
 		if (ec == ELFCLASS32) {
+			s->s_shdr.s_shdr32.sh_addralign = (uint32_t) sh_align;
+			s->s_shdr.s_shdr32.sh_entsize   = (uint32_t) sh_entsize;
 			s->s_shdr.s_shdr32.sh_offset    = (uint32_t) sh_offset;
 			s->s_shdr.s_shdr32.sh_size      = (uint32_t) sh_size;
-			s->s_shdr.s_shdr32.sh_addralign = (uint32_t) sh_align;
 		} else {
+			s->s_shdr.s_shdr64.sh_addralign = sh_align;
+			s->s_shdr.s_shdr64.sh_entsize   = sh_entsize;
 			s->s_shdr.s_shdr64.sh_offset    = sh_offset;
 			s->s_shdr.s_shdr64.sh_size      = sh_size;
-			s->s_shdr.s_shdr64.sh_addralign = sh_align;
 		}
 	}
 
@@ -342,6 +350,8 @@
 		return ((off_t) -1);
 	}
 
+	e->e_byteorder = eh_byteorder;
+
 #define	INITIALIZE_EHDR(E,EC,V)	do {					\
 		(E)->e_ident[EI_MAG0] = ELFMAG0;			\
 		(E)->e_ident[EI_MAG1] = ELFMAG1;			\
@@ -392,7 +402,8 @@
 			phoff = roundup(rc, align);
 
 		rc = phoff + fsz * phnum;
-	}
+	} else
+		phoff = 0;
 
 	/*
 	 * Compute the layout of the sections associated with the
@@ -424,7 +435,8 @@
 			shoff = roundup(rc, align);
 
 		rc = shoff + fsz * shnum;
-	}
+	} else
+		shoff = 0;
 
 	/*
 	 * Update the `e_phoff' and `e_shoff' fields if the library is
@@ -432,11 +444,11 @@
 	 */
 	if ((e->e_flags & ELF_F_LAYOUT) == 0) {
 		if (ec == ELFCLASS32) {
-			eh32->e_phoff = phoff;
-			eh32->e_shoff = shoff;
+			eh32->e_phoff = (uint32_t) phoff;
+			eh32->e_shoff = (uint32_t) shoff;
 		} else {
-			eh64->e_phoff = phoff;
-			eh64->e_shoff = shoff;
+			eh64->e_phoff = (uint64_t) phoff;
+			eh64->e_shoff = (uint64_t) shoff;
 		}
 	}
 
@@ -724,15 +736,25 @@
 	 * read-only.
 	 */
 
-	if (munmap(e->e_rawfile, e->e_rawsize) < 0 ||
-	    write(e->e_fd, newfile, newsize) != newsize ||
-	    lseek(e->e_fd, 0, SEEK_SET) < 0 ||
-	    (e->e_rawfile = mmap(NULL, e->e_rawsize, PROT_READ, MAP_PRIVATE,
-		e->e_fd, (off_t) 0)) == MAP_FAILED) {
+	if (e->e_rawfile && munmap(e->e_rawfile, e->e_rawsize) < 0) {
+		LIBELF_SET_ERROR(IO, errno);
+		goto error;
+	}
+
+	if (write(e->e_fd, newfile, newsize) != newsize ||
+	    lseek(e->e_fd, 0, SEEK_SET) < 0) {
 		LIBELF_SET_ERROR(IO, errno);
 		goto error;
 	}
-	e->e_rawsize = newsize;
+
+	if (e->e_cmd != ELF_C_WRITE) {
+		if ((e->e_rawfile = mmap(NULL, newsize, PROT_READ, MAP_PRIVATE,
+			 e->e_fd, (off_t) 0)) == MAP_FAILED) {
+			LIBELF_SET_ERROR(IO, errno);
+			goto error;
+		}
+		e->e_rawsize = newsize;
+	}
 
 	/*
 	 * Reset flags, remove existing section descriptors and

==== //depot/projects/dtrace/src/lib/libelf/gelf_newehdr.3#7 (text+ko) ====

@@ -75,8 +75,8 @@
 it returns the value returned by
 .Fn elf64_newehdr "elf" .
 .Pp
-If a fresh header structure is allocated, the following members of the
-structure will be set to zero except the following:
+If a fresh header structure is allocated, the members of the
+structure are initialized as follows:
 .Bl -tag -width indent
 .It Va "e_ident[EI_MAG0..EI_MAG3]"
 Identification bytes at offsets
@@ -109,12 +109,13 @@
 .Dv EM_NONE .
 .It Va e_type
 is set to
-.Dv ELF_K_ELF .
+.Dv ELF_K_NONE .
 .It Va e_version
 is set to the ELF library's operating version set by a prior call to
 .Xr elf_version 3 .
 .El
 .Pp
+Other members of the header are set to zero.
 The application is responsible for changing these values
 as needed before calling
 .Fn elf_update .

==== //depot/projects/dtrace/src/lib/libelf/libelf_ehdr.c#6 (text+ko) ====

@@ -46,8 +46,8 @@
 		eh->e_ident[EI_DATA]  = ELFDATANONE;			\
 		eh->e_ident[EI_VERSION] = LIBELF_PRIVATE(version);	\
 		eh->e_machine = EM_NONE;				\
-		eh->e_type    = ELF_K_ELF;				\
-		eh->e_version = EV_NONE;				\
+		eh->e_type    = ELF_K_NONE;				\
+		eh->e_version = LIBELF_PRIVATE(version);		\
 	} while (0)
 
 void *



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200610262306.k9QN6dOt052292>