Update to 0.139

This commit is contained in:
roland 2009-01-24 01:16:36 +00:00
parent 169e650811
commit 5c16b0814a
10 changed files with 933 additions and 654 deletions

View File

@ -1 +1 @@
elfutils-0.138.tar.bz2
elfutils-0.139.tar.bz2

View File

@ -3,6 +3,8 @@
NAME := elfutils
SPECFILE = elfutils.spec
all:
UPSTREAM_CHECKS := sig
UPSTREAM_FILES = $(NAME)-$(VERSION).tar.bz2
upstream:;
@ -28,20 +30,19 @@ ifneq (,$(CURL))
CURL += -k
endif
patches := $(patsubst %,elfutils-%.patch,robustify portability)
all: $(patches)
branch-portability = portable
branch-master = elfutils-$(VERSION)
elfutils-base = elfutils-$(VERSION)
elfutils-base = master
elfutils-%/configure: .git/refs/heads/* Makefile
@rm -rf $(@D)
git archive --prefix=$(@D)/ $(firstword $(branch-$*) $*) | tar xf -
cd $(@D) && autoreconf -i && rm -rf autom4te.cache
elfutils-%.patch: elfutils-$(VERSION).tar.bz2 Makefile
@rm -rf elfutils-master elfutils-$*
git archive --prefix=elfutils-master/ $(elfutils-base) \
| tar xf -
git archive --prefix=elfutils-$*/ $(firstword $(branch-$*) $*) \
| tar xf -
cd elfutils-master; autoreconf -i; rm -rf autom4te.cache
cd elfutils-$*; autoreconf -i; rm -rf autom4te.cache
diff -Nrpu elfutils-master elfutils-$* | \
elfutils-%.patch: elfutils-master/configure elfutils-%/configure
diff --exclude='.gitignore' -Nrpu $(^D) | \
filterdiff --remove-timestamps --strip=1 --addprefix=elfutils/ > $@.new
mv $@.new $@
@ -52,7 +53,7 @@ elfutils-portable.spec: elfutils.spec
portable-r = 0.$(subst $(DIST),,$(RELEASE))
portable-vr = $(VERSION)-$(portable-r)
portable.srpm = elfutils-$(portable-vr).src.rpm
$(portable.srpm): elfutils-portable.spec elfutils-portability.patch \
$(portable.srpm): elfutils-portable.spec $(patches) \
elfutils-$(VERSION).tar.bz2
$(RPM_WITH_DIRS) --nodeps -bs $<

View File

@ -1,236 +0,0 @@
commit ed9d3bc176b3f0318551d9214b1cec4e49197842
Author: Roland McGrath <roland@redhat.com>
Date: Thu Jan 1 21:22:18 2009 -0800
Fill gaps and update bookkeeping between all sections, not only before a dirty one.
---
libelf/ChangeLog | 7 ++
libelf/elf32_updatefile.c | 142 +++++++++++++++++++++++++++------------------
2 files changed, 93 insertions(+), 56 deletions(-)
diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index 9578f8b..bb487b1 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,3 +1,10 @@
+2009-01-01 Roland McGrath <roland@redhat.com>
+
+ * elf32_updatefile.c (__elfw2(LIBELFBITS,updatemmap)):
+ Fill gaps and update bookkeeping between all sections,
+ not only before a dirty one.
+ (__elfw2(LIBELFBITS,updatefile)): Likewise.
+
2008-12-11 Roland McGrath <roland@redhat.com>
* elf32_updatefile.c (__elfw2(LIBELFBITS,updatemmap)): Handle
diff --git a/libelf/elf32_updatefile.c b/libelf/elf32_updatefile.c
index e88f4a4..4e170cb 100644
--- a/libelf/elf32_updatefile.c
+++ b/libelf/elf32_updatefile.c
@@ -1,5 +1,5 @@
/* Write changed data structures.
- Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
+ Copyright (C) 2000,2001,2002,2004,2005,2006,2007,2008,2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -127,7 +127,6 @@ internal_function
__elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
{
ElfW2(LIBELFBITS,Ehdr) *ehdr;
- char *last_position;
/* We need the ELF header several times. */
ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
@@ -204,10 +203,11 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
/* From now on we have to keep track of the last position to eventually
fill the gaps with the prescribed fill byte. */
- last_position = ((char *) elf->map_address + elf->start_offset
- + MAX (elf_typesize (LIBELFBITS, ELF_T_EHDR, 1),
- ehdr->e_phoff)
- + elf_typesize (LIBELFBITS, ELF_T_PHDR, ehdr->e_phnum));
+ char *last_position = ((char *) elf->map_address + elf->start_offset
+ + MAX (elf_typesize (LIBELFBITS, ELF_T_EHDR, 1),
+ ehdr->e_phoff)
+ + elf_typesize (LIBELFBITS,
+ ELF_T_PHDR, ehdr->e_phnum));
/* Write all the sections. Well, only those which are modified. */
if (shnum > 0)
@@ -278,6 +278,35 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
}
}
+ /* Prepare to write at START, and then update LAST_POSITION.
+ If LAST_POSITION was before START, fill in the gap. */
+ inline void prepare_position (char *start)
+ {
+ if (start > last_position)
+ {
+ /* This code assumes that the data blocks for
+ a section are ordered by offset. */
+ size_t written = 0;
+
+ if (last_position < shdr_start)
+ {
+ written = MIN (start - last_position,
+ shdr_start - last_position);
+
+ memset (last_position, __libelf_fill_byte, written);
+ }
+
+ if (last_position + written != start && shdr_end < start)
+ memset (shdr_end, __libelf_fill_byte, start - shdr_end);
+ }
+
+ /* Let it go backward if the sections use a bogus layout with
+ overlaps. We'll overwrite the stupid user's section data
+ with the latest one, rather than crashing. */
+
+ last_position = start;
+ }
+
/* Iterate over all the section in the order in which they
appear in the output file. */
for (size_t cnt = 0; cnt < shnum; ++cnt)
@@ -298,38 +327,10 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
assert (dl->data.d.d_size <= (shdr->sh_size
- (GElf_Off) dl->data.d.d_off));
+ prepare_position (scn_start + dl->data.d.d_off);
+
if ((scn->flags | dl->flags | elf->flags) & ELF_F_DIRTY)
{
- if (scn_start + dl->data.d.d_off > last_position)
- {
- /* This code assumes that the data blocks for
- a section are ordered by offset. */
- size_t written = 0;
-
- if (last_position < shdr_start)
- {
- written = MIN (scn_start + dl->data.d.d_off
- - last_position,
- shdr_start - last_position);
-
- memset (last_position, __libelf_fill_byte,
- written);
- }
-
- if (last_position + written
- != scn_start + dl->data.d.d_off
- && shdr_end < scn_start + dl->data.d.d_off)
- memset (shdr_end, __libelf_fill_byte,
- scn_start + dl->data.d.d_off - shdr_end);
- }
-
- /* Let it go backward if the sections use a bogus
- layout with overlaps. We'll overwrite the stupid
- user's section data with the latest one, rather than
- crashing. */
-
- last_position = scn_start + dl->data.d.d_off;
-
if (unlikely (change_bo))
{
#if EV_NUM != 2
@@ -362,9 +363,19 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
dl = dl->next;
}
while (dl != NULL);
- else if (shdr->sh_type != SHT_NOBITS && scn->index != 0)
- /* We have to trust the existing section header information. */
- last_position += shdr->sh_size;
+ else if (shdr->sh_type != SHT_NOBITS && scn->index != 0
+ && shdr->sh_size != 0)
+ {
+ /* We have to trust the existing section header information.
+
+ If there are any contents at all, we must be sure we've
+ filled in any gap before them, even if it turns out we
+ aren't touching the contents after the gap. */
+
+ prepare_position (scn_start);
+
+ last_position += shdr->sh_size;
+ }
scn->flags &= ~ELF_F_DIRTY;
}
@@ -622,31 +633,39 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
off_t scn_start = elf->start_offset + shdr->sh_offset;
Elf_Data_List *dl = &scn->data_list;
+ /* Prepare to write at START, and then update LAST_OFFSET.
+ If LAST_OFFSET was before START, fill in the gap. */
+ inline bool prepare_offset (off_t start)
+ {
+ if (start > last_offset)
+ {
+ if (unlikely (fill (elf->fildes, last_offset,
+ start - last_offset, fillbuf,
+ &filled) != 0))
+ return true;
+ }
+
+ /* Let it go backward if the sections use a bogus layout with
+ overlaps. We'll overwrite the stupid user's section data
+ with the latest one, rather than crashing. */
+
+ last_offset = start;
+
+ return false;
+ }
+
if (shdr->sh_type != SHT_NOBITS && scn->data_list_rear != NULL
&& scn->index != 0)
do
{
+ if (unlikely (prepare_offset (scn_start + dl->data.d.d_off)))
+ return 1;
+
if ((scn->flags | dl->flags | elf->flags) & ELF_F_DIRTY)
{
char tmpbuf[MAX_TMPBUF];
void *buf = dl->data.d.d_buf;
- if (scn_start + dl->data.d.d_off > last_offset)
- {
- if (unlikely (fill (elf->fildes, last_offset,
- (scn_start + dl->data.d.d_off)
- - last_offset, fillbuf,
- &filled) != 0))
- return 1;
- }
-
- /* Let it go backward if the sections use a bogus
- layout with overlaps. We'll overwrite the stupid
- user's section data with the latest one, rather than
- crashing. */
-
- last_offset = scn_start + dl->data.d.d_off;
-
if (unlikely (change_bo))
{
#if EV_NUM != 2
@@ -696,7 +715,18 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
}
while (dl != NULL);
else if (shdr->sh_type != SHT_NOBITS && scn->index != 0)
- last_offset = scn_start + shdr->sh_size;
+ {
+ /* We have to trust the existing section header information.
+
+ If there are any contents at all, we must be sure we've
+ filled in any gap before them, even if it turns out we
+ aren't touching the contents after the gap. */
+
+ if (shdr->sh_size != 0 && unlikely (prepare_offset (scn_start)))
+ return 1;
+
+ last_offset = scn_start + shdr->sh_size;
+ }
/* Collect the section header table information. */
if (unlikely (change_bo))

Binary file not shown.

BIN
elfutils-0.139.tar.bz2.sig Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,72 +1,57 @@
src/
2005-06-09 Roland McGrath <roland@redhat.com>
* readelf.c (handle_dynamic, handle_symtab): Check for bogus sh_link.
(handle_verneed, handle_verdef, handle_versym, handle_hash): Likewise.
(handle_scngrp): Check for bogus sh_info.
* strip.c (handle_elf): Check for bogus values in sh_link, sh_info,
st_shndx, e_shstrndx, and SHT_GROUP or SHT_SYMTAB_SHNDX data.
Don't use assert on input values, instead bail with "illformed" error.
2005-05-17 Jakub Jelinek <jakub@redhat.com>
libelf/
* elf32_getphdr.c (elfw2(LIBELFBITS,getphdr)): Check if program header
table fits into object's bounds.
* elf_getshstrndx.c (elf_getshstrndx): Add elf->start_offset to
elf->map_address. Check if first section header fits into object's
bounds.
* elf32_getshdr.c (elfw2(LIBELFBITS,getshdr)):
Check if section header table fits into object's bounds.
* elf_begin.c (get_shnum): Ensure section headers fits into
object's bounds.
(file_read_elf): Make sure scncnt is small enough to allocate both
ElfXX_Shdr and Elf_Scn array. Make sure section and program header
tables fit into object's bounds. Avoid memory leak on failure.
src/
* elflint.c (check_hash): Don't check entries beyond end of section.
(check_note): Don't crash if gelf_rawchunk fails.
(section_name): Return <invalid> if gelf_getshdr returns NULL.
2005-05-14 Jakub Jelinek <jakub@redhat.com>
libelf/
* libelfP.h (INVALID_NDX): Define.
* gelf_getdyn.c (gelf_getdyn): Use it. Remove ndx < 0 test if any.
* gelf_getlib.c (gelf_getlib): Likewise.
* gelf_getmove.c (gelf_getmove): Likewise.
* gelf_getrel.c (gelf_getrel): Likewise.
* gelf_getrela.c (gelf_getrela): Likewise.
* gelf_getsym.c (gelf_getsym): Likewise.
* gelf_getsyminfo.c (gelf_getsyminfo): Likewise.
* gelf_getsymshndx.c (gelf_getsymshndx): Likewise.
* gelf_getversym.c (gelf_getversym): Likewise.
* gelf_update_dyn.c (gelf_update_dyn): Likewise.
* gelf_update_lib.c (gelf_update_lib): Likewise.
* gelf_update_move.c (gelf_update_move): Likewise.
* gelf_update_rel.c (gelf_update_rel): Likewise.
* gelf_update_rela.c (gelf_update_rela): Likewise.
* gelf_update_sym.c (gelf_update_sym): Likewise.
* gelf_update_syminfo.c (gelf_update_syminfo): Likewise.
* gelf_update_symshndx.c (gelf_update_symshndx): Likewise.
* gelf_update_versym.c (gelf_update_versym): Likewise.
* elf_newscn.c (elf_newscn): Check for overflow.
* elf32_updatefile.c (__elfw2(LIBELFBITS,updatemmap)): Likewise.
(__elfw2(LIBELFBITS,updatefile)): Likewise.
* elf_begin.c (file_read_elf): Likewise.
* elf32_newphdr.c (elfw2(LIBELFBITS,newphdr)): Likewise.
* elf_getarsym.c (elf_getarsym): Likewise.
* elf32_getshdr.c (elfw2(LIBELFBITS,getshdr)): Likewise.
src/
* elflint.c (section_name): Return "<invalid>" instead of
crashing on invalid section name.
(check_symtab, is_rel_dyn, check_rela, check_rel, check_dynamic,
check_symtab_shndx, check_hash, check_versym): Robustify.
--- elfutils-0.136/libelf/elf32_getphdr.c.robustify
+++ elfutils-0.136/libelf/elf32_getphdr.c
--- elfutils/libelf/ChangeLog
+++ elfutils/libelf/ChangeLog
@@ -507,6 +507,49 @@
If section content hasn't been read yet, do it before looking for the
block size. If no section data present, infer size of section header.
+2005-05-17 Jakub Jelinek <jakub@redhat.com>
+
+ * elf32_getphdr.c (elfw2(LIBELFBITS,getphdr)): Check if program header
+ table fits into object's bounds.
+ * elf_getshstrndx.c (elf_getshstrndx): Add elf->start_offset to
+ elf->map_address. Check if first section header fits into object's
+ bounds.
+ * elf32_getshdr.c (elfw2(LIBELFBITS,getshdr)):
+ Check if section header table fits into object's bounds.
+ * elf_begin.c (get_shnum): Ensure section headers fits into
+ object's bounds.
+ (file_read_elf): Make sure scncnt is small enough to allocate both
+ ElfXX_Shdr and Elf_Scn array. Make sure section and program header
+ tables fit into object's bounds. Avoid memory leak on failure.
+
+2005-05-14 Jakub Jelinek <jakub@redhat.com>
+
+ * libelfP.h (INVALID_NDX): Define.
+ * gelf_getdyn.c (gelf_getdyn): Use it. Remove ndx < 0 test if any.
+ * gelf_getlib.c (gelf_getlib): Likewise.
+ * gelf_getmove.c (gelf_getmove): Likewise.
+ * gelf_getrel.c (gelf_getrel): Likewise.
+ * gelf_getrela.c (gelf_getrela): Likewise.
+ * gelf_getsym.c (gelf_getsym): Likewise.
+ * gelf_getsyminfo.c (gelf_getsyminfo): Likewise.
+ * gelf_getsymshndx.c (gelf_getsymshndx): Likewise.
+ * gelf_getversym.c (gelf_getversym): Likewise.
+ * gelf_update_dyn.c (gelf_update_dyn): Likewise.
+ * gelf_update_lib.c (gelf_update_lib): Likewise.
+ * gelf_update_move.c (gelf_update_move): Likewise.
+ * gelf_update_rel.c (gelf_update_rel): Likewise.
+ * gelf_update_rela.c (gelf_update_rela): Likewise.
+ * gelf_update_sym.c (gelf_update_sym): Likewise.
+ * gelf_update_syminfo.c (gelf_update_syminfo): Likewise.
+ * gelf_update_symshndx.c (gelf_update_symshndx): Likewise.
+ * gelf_update_versym.c (gelf_update_versym): Likewise.
+ * elf_newscn.c (elf_newscn): Check for overflow.
+ * elf32_updatefile.c (__elfw2(LIBELFBITS,updatemmap)): Likewise.
+ (__elfw2(LIBELFBITS,updatefile)): Likewise.
+ * elf_begin.c (file_read_elf): Likewise.
+ * elf32_newphdr.c (elfw2(LIBELFBITS,newphdr)): Likewise.
+ * elf_getarsym.c (elf_getarsym): Likewise.
+ * elf32_getshdr.c (elfw2(LIBELFBITS,getshdr)): Likewise.
2005-05-11 Ulrich Drepper <drepper@redhat.com>
* elf.h: Update again.
--- elfutils/libelf/elf32_getphdr.c
+++ elfutils/libelf/elf32_getphdr.c
@@ -105,6 +105,16 @@ __elfw2(LIBELFBITS,getphdr_wrlock) (elf)
if (elf->map_address != NULL)
@ -84,8 +69,8 @@ src/
/* All the data is already mapped. Use it. */
void *file_phdr = ((char *) elf->map_address
+ elf->start_offset + ehdr->e_phoff);
--- elfutils-0.136/libelf/elf32_getshdr.c.robustify
+++ elfutils-0.136/libelf/elf32_getshdr.c
--- elfutils/libelf/elf32_getshdr.c
+++ elfutils/libelf/elf32_getshdr.c
@@ -1,5 +1,5 @@
/* Return section header.
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2007 Red Hat, Inc.
@ -93,7 +78,7 @@ src/
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -81,7 +81,8 @@ load_shdr_rwlock (Elf_Scn *scn)
@@ -81,7 +81,8 @@ load_shdr_wrlock (Elf_Scn *scn)
goto out;
size_t shnum;
@ -103,7 +88,7 @@ src/
goto out;
size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr));
@@ -98,6 +99,16 @@ load_shdr_rwlock (Elf_Scn *scn)
@@ -98,6 +99,16 @@ load_shdr_wrlock (Elf_Scn *scn)
if (elf->map_address != NULL)
{
@ -120,8 +105,8 @@ src/
ElfW2(LIBELFBITS,Shdr) *notcvt;
/* All the data is already mapped. If we could use it
--- elfutils-0.136/libelf/elf32_newphdr.c.robustify
+++ elfutils-0.136/libelf/elf32_newphdr.c
--- elfutils/libelf/elf32_newphdr.c
+++ elfutils/libelf/elf32_newphdr.c
@@ -124,6 +124,12 @@ elfw2(LIBELFBITS,newphdr) (elf, count)
else if (elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum != count
|| elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
@ -135,9 +120,9 @@ src/
/* Allocate a new program header with the appropriate number of
elements. */
result = (ElfW2(LIBELFBITS,Phdr) *)
--- elfutils-0.136/libelf/elf32_updatefile.c.robustify
+++ elfutils-0.136/libelf/elf32_updatefile.c
@@ -212,6 +212,9 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf
--- elfutils/libelf/elf32_updatefile.c
+++ elfutils/libelf/elf32_updatefile.c
@@ -220,6 +220,9 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf
/* Write all the sections. Well, only those which are modified. */
if (shnum > 0)
{
@ -147,7 +132,7 @@ src/
Elf_ScnList *list = &elf->state.ELFW(elf,LIBELFBITS).scns;
Elf_Scn **scns = (Elf_Scn **) alloca (shnum * sizeof (Elf_Scn *));
char *const shdr_start = ((char *) elf->map_address + elf->start_offset
@@ -582,6 +585,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf
@@ -633,6 +636,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf
/* Write all the sections. Well, only those which are modified. */
if (shnum > 0)
{
@ -158,9 +143,9 @@ src/
off_t shdr_offset = elf->start_offset + ehdr->e_shoff;
#if EV_NUM != 2
xfct_t shdr_fctp = __elf_xfctstom[__libelf_version - 1][EV_CURRENT - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][ELF_T_SHDR];
--- elfutils-0.136/libelf/elf_begin.c.robustify
+++ elfutils-0.136/libelf/elf_begin.c
@@ -155,7 +155,8 @@ get_shnum (void *map_address, unsigned c
--- elfutils/libelf/elf_begin.c
+++ elfutils/libelf/elf_begin.c
@@ -165,7 +165,8 @@ get_shnum (void *map_address, unsigned c
if (unlikely (result == 0) && ehdr.e32->e_shoff != 0)
{
@ -170,7 +155,7 @@ src/
/* Cannot read the first section header. */
return 0;
@@ -203,7 +204,8 @@ get_shnum (void *map_address, unsigned c
@@ -213,7 +214,8 @@ get_shnum (void *map_address, unsigned c
if (unlikely (result == 0) && ehdr.e64->e_shoff != 0)
{
@ -180,7 +165,7 @@ src/
/* Cannot read the first section header. */
return 0;
@@ -275,6 +277,15 @@ file_read_elf (int fildes, void *map_add
@@ -285,6 +287,15 @@ file_read_elf (int fildes, void *map_add
/* Could not determine the number of sections. */
return NULL;
@ -196,7 +181,7 @@ src/
/* We can now allocate the memory. */
Elf *elf = allocate_elf (fildes, map_address, offset, maxsize, cmd, parent,
ELF_K_ELF, scncnt * sizeof (Elf_Scn));
@@ -308,13 +319,31 @@ file_read_elf (int fildes, void *map_add
@@ -318,13 +329,31 @@ file_read_elf (int fildes, void *map_add
{
/* We can use the mmapped memory. */
elf->state.elf32.ehdr = ehdr;
@ -228,7 +213,7 @@ src/
for (size_t cnt = 0; cnt < scncnt; ++cnt)
{
@@ -396,13 +425,26 @@ file_read_elf (int fildes, void *map_add
@@ -406,13 +435,26 @@ file_read_elf (int fildes, void *map_add
{
/* We can use the mmapped memory. */
elf->state.elf64.ehdr = ehdr;
@ -255,8 +240,8 @@ src/
for (size_t cnt = 0; cnt < scncnt; ++cnt)
{
--- elfutils-0.136/libelf/elf_getarsym.c.robustify
+++ elfutils-0.136/libelf/elf_getarsym.c
--- elfutils/libelf/elf_getarsym.c
+++ elfutils/libelf/elf_getarsym.c
@@ -179,6 +179,9 @@ elf_getarsym (elf, ptr)
size_t index_size = atol (tmpbuf);
@ -267,8 +252,8 @@ src/
|| n * sizeof (uint32_t) > index_size)
{
/* This index table cannot be right since it does not fit into
--- elfutils-0.136/libelf/elf_getshstrndx.c.robustify
+++ elfutils-0.136/libelf/elf_getshstrndx.c
--- elfutils/libelf/elf_getshstrndx.c
+++ elfutils/libelf/elf_getshstrndx.c
@@ -125,10 +125,25 @@ elf_getshstrndx (elf, dst)
if (elf->map_address != NULL
&& elf->state.elf32.ehdr->e_ident[EI_DATA] == MY_ELFDATA
@ -325,8 +310,8 @@ src/
else
{
/* We avoid reading in all the section headers. Just read
--- elfutils-0.136/libelf/elf_newscn.c.robustify
+++ elfutils-0.136/libelf/elf_newscn.c
--- elfutils/libelf/elf_newscn.c
+++ elfutils/libelf/elf_newscn.c
@@ -104,10 +104,18 @@ elf_newscn (elf)
else
{
@ -347,8 +332,8 @@ src/
newp = (Elf_ScnList *) calloc (sizeof (Elf_ScnList)
+ ((elf->state.elf.scnincr *= 2)
* sizeof (Elf_Scn)), 1);
--- elfutils-0.136/libelf/gelf_getdyn.c.robustify
+++ elfutils-0.136/libelf/gelf_getdyn.c
--- elfutils/libelf/gelf_getdyn.c
+++ elfutils/libelf/gelf_getdyn.c
@@ -93,7 +93,8 @@ gelf_getdyn (data, ndx, dst)
table entries has to be adopted. The user better has provided
a buffer where we can store the information. While copying the
@ -369,8 +354,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_getlib.c.robustify
+++ elfutils-0.136/libelf/gelf_getlib.c
--- elfutils/libelf/gelf_getlib.c
+++ elfutils/libelf/gelf_getlib.c
@@ -86,7 +86,8 @@ gelf_getlib (data, ndx, dst)
/* The data is already in the correct form. Just make sure the
index is OK. */
@ -381,8 +366,8 @@ src/
__libelf_seterrno (ELF_E_INVALID_INDEX);
else
{
--- elfutils-0.136/libelf/gelf_getmove.c.robustify
+++ elfutils-0.136/libelf/gelf_getmove.c
--- elfutils/libelf/gelf_getmove.c
+++ elfutils/libelf/gelf_getmove.c
@@ -83,7 +83,8 @@ gelf_getmove (data, ndx, dst)
/* The data is already in the correct form. Just make sure the
@ -393,8 +378,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_getrela.c.robustify
+++ elfutils-0.136/libelf/gelf_getrela.c
--- elfutils/libelf/gelf_getrela.c
+++ elfutils/libelf/gelf_getrela.c
@@ -71,12 +71,6 @@ gelf_getrela (data, ndx, dst)
if (data_scn == NULL)
return NULL;
@ -428,8 +413,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
result = NULL;
--- elfutils-0.136/libelf/gelf_getrel.c.robustify
+++ elfutils-0.136/libelf/gelf_getrel.c
--- elfutils/libelf/gelf_getrel.c
+++ elfutils/libelf/gelf_getrel.c
@@ -71,12 +71,6 @@ gelf_getrel (data, ndx, dst)
if (data_scn == NULL)
return NULL;
@ -463,8 +448,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
result = NULL;
--- elfutils-0.136/libelf/gelf_getsym.c.robustify
+++ elfutils-0.136/libelf/gelf_getsym.c
--- elfutils/libelf/gelf_getsym.c
+++ elfutils/libelf/gelf_getsym.c
@@ -90,7 +90,8 @@ gelf_getsym (data, ndx, dst)
table entries has to be adopted. The user better has provided
a buffer where we can store the information. While copying the
@ -485,8 +470,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_getsyminfo.c.robustify
+++ elfutils-0.136/libelf/gelf_getsyminfo.c
--- elfutils/libelf/gelf_getsyminfo.c
+++ elfutils/libelf/gelf_getsyminfo.c
@@ -84,7 +84,8 @@ gelf_getsyminfo (data, ndx, dst)
/* The data is already in the correct form. Just make sure the
@ -497,8 +482,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_getsymshndx.c.robustify
+++ elfutils-0.136/libelf/gelf_getsymshndx.c
--- elfutils/libelf/gelf_getsymshndx.c
+++ elfutils/libelf/gelf_getsymshndx.c
@@ -90,7 +90,9 @@ gelf_getsymshndx (symdata, shndxdata, nd
section index table. */
if (likely (shndxdata_scn != NULL))
@ -530,8 +515,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_getversym.c.robustify
+++ elfutils-0.136/libelf/gelf_getversym.c
--- elfutils/libelf/gelf_getversym.c
+++ elfutils/libelf/gelf_getversym.c
@@ -92,7 +92,8 @@ gelf_getversym (data, ndx, dst)
/* The data is already in the correct form. Just make sure the
@ -542,8 +527,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
result = NULL;
--- elfutils-0.136/libelf/gelf_update_dyn.c.robustify
+++ elfutils-0.136/libelf/gelf_update_dyn.c
--- elfutils/libelf/gelf_update_dyn.c
+++ elfutils/libelf/gelf_update_dyn.c
@@ -71,12 +71,6 @@ gelf_update_dyn (data, ndx, src)
if (data == NULL)
return 0;
@ -577,8 +562,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_update_lib.c.robustify
+++ elfutils-0.136/libelf/gelf_update_lib.c
--- elfutils/libelf/gelf_update_lib.c
+++ elfutils/libelf/gelf_update_lib.c
@@ -68,12 +68,6 @@ gelf_update_lib (data, ndx, src)
if (data == NULL)
return 0;
@ -602,8 +587,8 @@ src/
__libelf_seterrno (ELF_E_INVALID_INDEX);
else
{
--- elfutils-0.136/libelf/gelf_update_move.c.robustify
+++ elfutils-0.136/libelf/gelf_update_move.c
--- elfutils/libelf/gelf_update_move.c
+++ elfutils/libelf/gelf_update_move.c
@@ -75,7 +75,7 @@ gelf_update_move (data, ndx, src)
assert (sizeof (GElf_Move) == sizeof (Elf64_Move));
@ -613,8 +598,8 @@ src/
|| unlikely ((ndx + 1) * sizeof (GElf_Move) > data_scn->d.d_size))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
--- elfutils-0.136/libelf/gelf_update_rela.c.robustify
+++ elfutils-0.136/libelf/gelf_update_rela.c
--- elfutils/libelf/gelf_update_rela.c
+++ elfutils/libelf/gelf_update_rela.c
@@ -68,12 +68,6 @@ gelf_update_rela (Elf_Data *dst, int ndx
if (dst == NULL)
return 0;
@ -648,8 +633,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_update_rel.c.robustify
+++ elfutils-0.136/libelf/gelf_update_rel.c
--- elfutils/libelf/gelf_update_rel.c
+++ elfutils/libelf/gelf_update_rel.c
@@ -68,12 +68,6 @@ gelf_update_rel (Elf_Data *dst, int ndx,
if (dst == NULL)
return 0;
@ -683,8 +668,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_update_sym.c.robustify
+++ elfutils-0.136/libelf/gelf_update_sym.c
--- elfutils/libelf/gelf_update_sym.c
+++ elfutils/libelf/gelf_update_sym.c
@@ -72,12 +72,6 @@ gelf_update_sym (data, ndx, src)
if (data == NULL)
return 0;
@ -718,8 +703,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_update_syminfo.c.robustify
+++ elfutils-0.136/libelf/gelf_update_syminfo.c
--- elfutils/libelf/gelf_update_syminfo.c
+++ elfutils/libelf/gelf_update_syminfo.c
@@ -72,12 +72,6 @@ gelf_update_syminfo (data, ndx, src)
if (data == NULL)
return 0;
@ -743,8 +728,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_update_symshndx.c.robustify
+++ elfutils-0.136/libelf/gelf_update_symshndx.c
--- elfutils/libelf/gelf_update_symshndx.c
+++ elfutils/libelf/gelf_update_symshndx.c
@@ -77,12 +77,6 @@ gelf_update_symshndx (symdata, shndxdata
if (symdata == NULL)
return 0;
@ -778,8 +763,8 @@ src/
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
--- elfutils-0.136/libelf/gelf_update_versym.c.robustify
+++ elfutils-0.136/libelf/gelf_update_versym.c
--- elfutils/libelf/gelf_update_versym.c
+++ elfutils/libelf/gelf_update_versym.c
@@ -75,7 +75,7 @@ gelf_update_versym (data, ndx, src)
assert (sizeof (GElf_Versym) == sizeof (Elf64_Versym));
@ -789,8 +774,8 @@ src/
|| unlikely ((ndx + 1) * sizeof (GElf_Versym) > data_scn->d.d_size))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
--- elfutils-0.136/libelf/libelfP.h.robustify
+++ elfutils-0.136/libelf/libelfP.h
--- elfutils/libelf/libelfP.h
+++ elfutils/libelf/libelfP.h
@@ -611,4 +611,13 @@ extern uint32_t __libelf_crc32 (uint32_t
/* Align offset to 4 bytes as needed for note name and descriptor data. */
#define NOTE_ALIGN(n) (((n) + 3) & -4U)
@ -805,9 +790,48 @@ src/
+#endif
+
#endif /* libelfP.h */
--- elfutils-0.136/src/elflint.c.robustify
+++ elfutils-0.136/src/elflint.c
@@ -131,6 +131,9 @@ static uint32_t shstrndx;
--- elfutils/src/ChangeLog
+++ elfutils/src/ChangeLog
@@ -1297,6 +1297,16 @@
object symbols or symbols with unknown type.
(check_rel): Likewise.
+2005-06-09 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (handle_dynamic, handle_symtab): Check for bogus sh_link.
+ (handle_verneed, handle_verdef, handle_versym, handle_hash): Likewise.
+ (handle_scngrp): Check for bogus sh_info.
+
+ * strip.c (handle_elf): Check for bogus values in sh_link, sh_info,
+ st_shndx, e_shstrndx, and SHT_GROUP or SHT_SYMTAB_SHNDX data.
+ Don't use assert on input values, instead bail with "illformed" error.
+
2005-06-08 Roland McGrath <roland@redhat.com>
* readelf.c (print_ops): Add consts.
@@ -1342,6 +1352,19 @@
* readelf.c (dwarf_tag_string): Add new tags.
+2005-05-17 Jakub Jelinek <jakub@redhat.com>
+
+ * elflint.c (check_hash): Don't check entries beyond end of section.
+ (check_note): Don't crash if gelf_rawchunk fails.
+ (section_name): Return <invalid> if gelf_getshdr returns NULL.
+
+2005-05-14 Jakub Jelinek <jakub@redhat.com>
+
+ * elflint.c (section_name): Return "<invalid>" instead of
+ crashing on invalid section name.
+ (check_symtab, is_rel_dyn, check_rela, check_rel, check_dynamic,
+ check_symtab_shndx, check_hash, check_versym): Robustify.
+
2005-05-08 Roland McGrath <roland@redhat.com>
* strip.c (handle_elf): Don't translate hash and versym data formats,
--- elfutils/src/elflint.c
+++ elfutils/src/elflint.c
@@ -130,6 +130,9 @@ static uint32_t shstrndx;
/* Array to count references in section groups. */
static int *scnref;
@ -817,7 +841,7 @@ src/
int
main (int argc, char *argv[])
@@ -320,10 +323,19 @@ section_name (Ebl *ebl, int idx)
@@ -319,10 +322,19 @@ section_name (Ebl *ebl, int idx)
{
GElf_Shdr shdr_mem;
GElf_Shdr *shdr;
@ -838,7 +862,7 @@ src/
}
@@ -345,10 +357,6 @@ static const int valid_e_machine[] =
@@ -344,10 +356,6 @@ static const int valid_e_machine[] =
(sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))
@ -849,7 +873,7 @@ src/
static void
check_elf_header (Ebl *ebl, GElf_Ehdr *ehdr, size_t size)
{
@@ -613,7 +621,8 @@ section [%2d] '%s': symbol table cannot
@@ -612,7 +620,8 @@ section [%2d] '%s': symbol table cannot
}
}
@ -859,7 +883,7 @@ src/
ERROR (gettext ("\
section [%2u] '%s': entry size is does not match ElfXX_Sym\n"),
idx, section_name (ebl, idx));
@@ -651,7 +660,7 @@ section [%2d] '%s': XINDEX for zeroth en
@@ -650,7 +659,7 @@ section [%2d] '%s': XINDEX for zeroth en
xndxscnidx, section_name (ebl, xndxscnidx));
}
@ -868,7 +892,7 @@ src/
{
sym = gelf_getsymshndx (data, xndxdata, cnt, &sym_mem, &xndx);
if (sym == NULL)
@@ -671,7 +680,8 @@ section [%2d] '%s': symbol %zu: invalid
@@ -670,7 +679,8 @@ section [%2d] '%s': symbol %zu: invalid
else
{
name = elf_strptr (ebl->elf, shdr->sh_link, sym->st_name);
@ -878,7 +902,7 @@ src/
}
if (sym->st_shndx == SHN_XINDEX)
@@ -1001,9 +1011,11 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e
@@ -1000,9 +1010,11 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e
{
GElf_Shdr rcshdr_mem;
const GElf_Shdr *rcshdr = gelf_getshdr (scn, &rcshdr_mem);
@ -892,7 +916,7 @@ src/
{
/* Found the dynamic section. Look through it. */
Elf_Data *d = elf_getdata (scn, NULL);
@@ -1013,7 +1025,9 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e
@@ -1012,7 +1024,9 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e
{
GElf_Dyn dyn_mem;
GElf_Dyn *dyn = gelf_getdyn (d, cnt, &dyn_mem);
@ -903,7 +927,7 @@ src/
if (dyn->d_tag == DT_RELCOUNT)
{
@@ -1027,7 +1041,9 @@ section [%2d] '%s': DT_RELCOUNT used for
@@ -1026,7 +1040,9 @@ section [%2d] '%s': DT_RELCOUNT used for
/* Does the number specified number of relative
relocations exceed the total number of
relocations? */
@ -914,7 +938,7 @@ src/
ERROR (gettext ("\
section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"),
idx, section_name (ebl, idx),
@@ -1187,7 +1203,8 @@ section [%2d] '%s': no relocations for m
@@ -1186,7 +1202,8 @@ section [%2d] '%s': no relocations for m
}
}
@ -924,7 +948,7 @@ src/
ERROR (gettext (reltype == ELF_T_RELA ? "\
section [%2d] '%s': section entry size does not match ElfXX_Rela\n" : "\
section [%2d] '%s': section entry size does not match ElfXX_Rel\n"),
@@ -1410,7 +1427,8 @@ check_rela (Ebl *ebl, GElf_Ehdr *ehdr, G
@@ -1409,7 +1426,8 @@ check_rela (Ebl *ebl, GElf_Ehdr *ehdr, G
Elf_Data *symdata = elf_getdata (symscn, NULL);
enum load_state state = state_undecided;
@ -934,7 +958,7 @@ src/
{
GElf_Rela rela_mem;
GElf_Rela *rela = gelf_getrela (data, cnt, &rela_mem);
@@ -1460,7 +1478,8 @@ check_rel (Ebl *ebl, GElf_Ehdr *ehdr, GE
@@ -1459,7 +1477,8 @@ check_rel (Ebl *ebl, GElf_Ehdr *ehdr, GE
Elf_Data *symdata = elf_getdata (symscn, NULL);
enum load_state state = state_undecided;
@ -944,7 +968,7 @@ src/
{
GElf_Rel rel_mem;
GElf_Rel *rel = gelf_getrel (data, cnt, &rel_mem);
@@ -1563,7 +1582,8 @@ section [%2d] '%s': referenced as string
@@ -1562,7 +1581,8 @@ section [%2d] '%s': referenced as string
shdr->sh_link, section_name (ebl, shdr->sh_link),
idx, section_name (ebl, idx));
@ -954,7 +978,7 @@ src/
ERROR (gettext ("\
section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"),
idx, section_name (ebl, idx));
@@ -1573,7 +1593,7 @@ section [%2d] '%s': section entry size d
@@ -1572,7 +1592,7 @@ section [%2d] '%s': section entry size d
idx, section_name (ebl, idx));
bool non_null_warned = false;
@ -963,7 +987,7 @@ src/
{
GElf_Dyn dyn_mem;
GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dyn_mem);
@@ -1854,6 +1874,8 @@ section [%2d] '%s': entry size does not
@@ -1853,6 +1873,8 @@ section [%2d] '%s': entry size does not
idx, section_name (ebl, idx));
if (symshdr != NULL
@ -972,7 +996,7 @@ src/
&& (shdr->sh_size / shdr->sh_entsize
< symshdr->sh_size / symshdr->sh_entsize))
ERROR (gettext ("\
@@ -1880,6 +1902,12 @@ section [%2d] '%s': extended section ind
@@ -1879,6 +1901,12 @@ section [%2d] '%s': extended section ind
}
Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
@ -985,7 +1009,7 @@ src/
if (*((Elf32_Word *) data->d_buf) != 0)
ERROR (gettext ("symbol 0 should have zero extended section index\n"));
@@ -1922,7 +1950,7 @@ section [%2d] '%s': hash table section i
@@ -1921,7 +1949,7 @@ section [%2d] '%s': hash table section i
size_t maxidx = nchain;
@ -994,7 +1018,7 @@ src/
{
size_t symsize = symshdr->sh_size / symshdr->sh_entsize;
@@ -1933,18 +1961,28 @@ section [%2d] '%s': hash table section i
@@ -1932,18 +1960,28 @@ section [%2d] '%s': hash table section i
maxidx = symsize;
}
@ -1025,7 +1049,7 @@ src/
}
@@ -1974,18 +2012,28 @@ section [%2d] '%s': hash table section i
@@ -1973,18 +2011,28 @@ section [%2d] '%s': hash table section i
maxidx = symsize;
}
@ -1057,7 +1081,7 @@ src/
}
@@ -2010,7 +2058,7 @@ section [%2d] '%s': bitmask size not pow
@@ -2009,7 +2057,7 @@ section [%2d] '%s': bitmask size not pow
if (shdr->sh_size < (4 + bitmask_words + nbuckets) * sizeof (Elf32_Word))
{
ERROR (gettext ("\
@ -1066,7 +1090,7 @@ src/
idx, section_name (ebl, idx), (long int) shdr->sh_size,
(long int) ((4 + bitmask_words + nbuckets) * sizeof (Elf32_Word)));
return;
@@ -2682,8 +2730,9 @@ section [%2d] '%s' refers in sh_link to
@@ -2681,8 +2729,9 @@ section [%2d] '%s' refers in sh_link to
/* The number of elements in the version symbol table must be the
same as the number of symbols. */
@ -1078,9 +1102,9 @@ src/
ERROR (gettext ("\
section [%2d] '%s' has different number of entries than symbol table [%2d] '%s'\n"),
idx, section_name (ebl, idx),
--- elfutils-0.136/src/readelf.c.robustify
+++ elfutils-0.136/src/readelf.c
@@ -1111,6 +1111,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G
--- elfutils/src/readelf.c
+++ elfutils/src/readelf.c
@@ -1130,6 +1130,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G
Elf32_Word *grpref = (Elf32_Word *) data->d_buf;
GElf_Sym sym_mem;
@ -1089,7 +1113,7 @@ src/
printf ((grpref[0] & GRP_COMDAT)
? ngettext ("\
\nCOMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n",
@@ -1123,8 +1125,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G
@@ -1142,8 +1144,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G
data->d_size / sizeof (Elf32_Word) - 1),
elf_ndxscn (scn),
elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
@ -1100,7 +1124,7 @@ src/
?: gettext ("<INVALID SYMBOL>"),
data->d_size / sizeof (Elf32_Word) - 1);
@@ -1275,7 +1277,8 @@ static void
@@ -1294,7 +1296,8 @@ static void
handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
{
int class = gelf_getclass (ebl->elf);
@ -1110,7 +1134,7 @@ src/
Elf_Data *data;
size_t cnt;
size_t shstrndx;
@@ -1290,6 +1293,11 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn,
@@ -1309,6 +1312,11 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn,
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@ -1122,7 +1146,7 @@ src/
printf (ngettext ("\
\nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n",
"\
@@ -1299,9 +1307,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn,
@@ -1318,9 +1326,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn,
class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
shdr->sh_offset,
(int) shdr->sh_link,
@ -1133,7 +1157,7 @@ src/
fputs_unlocked (gettext (" Type Value\n"), stdout);
for (cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
@@ -1801,6 +1807,13 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G
@@ -1820,6 +1826,13 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@ -1147,7 +1171,7 @@ src/
/* Now we can compute the number of entries in the section. */
unsigned int nsyms = data->d_size / (class == ELFCLASS32
? sizeof (Elf32_Sym)
@@ -1811,15 +1824,12 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G
@@ -1830,15 +1843,12 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G
nsyms),
(unsigned int) elf_ndxscn (scn),
elf_strptr (ebl->elf, shstrndx, shdr->sh_name), nsyms);
@ -1164,7 +1188,7 @@ src/
fputs_unlocked (class == ELFCLASS32
? gettext ("\
@@ -2055,7 +2065,13 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn,
@@ -2074,7 +2084,13 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn,
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@ -1179,7 +1203,7 @@ src/
printf (ngettext ("\
\nVersion needs section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n",
"\
@@ -2066,9 +2082,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn,
@@ -2085,9 +2101,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn,
class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
shdr->sh_offset,
(unsigned int) shdr->sh_link,
@ -1190,7 +1214,7 @@ src/
unsigned int offset = 0;
for (int cnt = shdr->sh_info; --cnt >= 0; )
@@ -2121,8 +2135,14 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G
@@ -2140,8 +2154,14 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@ -1206,7 +1230,7 @@ src/
printf (ngettext ("\
\nVersion definition section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n",
"\
@@ -2134,9 +2154,7 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G
@@ -2153,9 +2173,7 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G
class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
shdr->sh_offset,
(unsigned int) shdr->sh_link,
@ -1217,7 +1241,7 @@ src/
unsigned int offset = 0;
for (int cnt = shdr->sh_info; --cnt >= 0; )
@@ -2398,8 +2416,14 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, G
@@ -2417,8 +2435,14 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, G
filename = NULL;
}
@ -1233,7 +1257,7 @@ src/
printf (ngettext ("\
\nVersion symbols section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'",
"\
@@ -2411,9 +2435,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, G
@@ -2430,9 +2454,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, G
class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
shdr->sh_offset,
(unsigned int) shdr->sh_link,
@ -1244,7 +1268,7 @@ src/
/* Now we can finally look at the actual contents of this section. */
for (unsigned int cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
@@ -2465,7 +2487,17 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn,
@@ -2484,7 +2506,17 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn,
for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt)
++counts[lengths[cnt]];
@ -1263,7 +1287,7 @@ src/
printf (ngettext ("\
\nHistogram for bucket list length in section [%2u] '%s' (total of %d bucket):\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n",
"\
@@ -2478,9 +2510,7 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn,
@@ -2497,9 +2529,7 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn,
shdr->sh_addr,
shdr->sh_offset,
(unsigned int) shdr->sh_link,
@ -1274,7 +1298,7 @@ src/
if (extrastr != NULL)
fputs (extrastr, stdout);
@@ -4039,6 +4069,16 @@ print_debug_aranges_section (Dwfl_Module
@@ -4058,6 +4088,16 @@ print_debug_aranges_section (Dwfl_Module
return;
}
@ -1289,10 +1313,10 @@ src/
+ }
+
printf (ngettext ("\
\nDWARF section '%s' at offset %#" PRIx64 " contains %zu entry:\n",
\nDWARF section [%2zu] '%s' at offset %#" PRIx64 " contains %zu entry:\n",
"\
--- elfutils-0.136/src/strip.c.robustify
+++ elfutils-0.136/src/strip.c
--- elfutils/src/strip.c
+++ elfutils/src/strip.c
@@ -544,6 +544,11 @@ handle_elf (int fd, Elf *elf, const char
goto fail_close;
}

View File

@ -1,5 +1,5 @@
%define eu_version 0.138
%define eu_release 2
%define eu_version 0.139
%define eu_release 1
%if %{?_with_compat:1}%{!?_with_compat:0}
%define compat 1
@ -33,13 +33,11 @@ License: GPLv2 with exceptions
Group: Development/Tools
URL: https://fedorahosted.org/elfutils/
Source: http://fedorahosted.org/releases/e/l/elfutils/%{name}-%{version}.tar.bz2
Patch1: elfutils-portability.patch
Patch2: elfutils-robustify.patch
Patch1: elfutils-robustify.patch
Patch2: elfutils-portability.patch
Requires: elfutils-libelf-%{_arch} = %{version}-%{release}
Requires: elfutils-libs-%{_arch} = %{version}-%{release}
Patch3: elfutils-0.138-libelf-padding-fix.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: bison >= 1.875
BuildRequires: flex >= 2.5.4a
@ -52,6 +50,19 @@ BuildRequires: glibc-headers >= 2.3.4-11
BuildRequires: gcc >= 3.2
%endif
%define use_zlib 0
%if 0%{?fedora} >= 5
%define use_zlib 1
%endif
%if 0%{?rhel} >= 5
%define use_zlib 1
%endif
%if %{use_zlib}
BuildRequires: zlib-devel >= 1.2.2.3
BuildRequires: bzip2-devel
%endif
%define _gnu %{nil}
%define _program_prefix eu-
@ -144,21 +155,19 @@ for libelf.
%prep
%setup -q
%if !0%{?scanf_has_m}
sed -i.scanf-m -e 's/%m/%a/' tests/line2addr.c
%endif
%patch1 -p1 -b .robustify
%if %{compat}
%patch1 -p1 -b .portability
%patch2 -p1 -b .portability
sleep 1
find . \( -name Makefile.in -o -name aclocal.m4 \) -print | xargs touch
sleep 1
find . \( -name configure -o -name config.h.in \) -print | xargs touch
%else
%if !0%{?scanf_has_m}
sed -i.scanf-m -e 's/%m/%a/g' src/addr2line.c tests/line2addr.c
%endif
%endif
%patch2 -p1 -b .robustify
%patch3 -p1 -b .fixes
find . -name \*.sh ! -perm -0100 -print | xargs chmod +x
@ -267,6 +276,14 @@ rm -rf ${RPM_BUILD_ROOT}
%{_libdir}/libelf.a
%changelog
* Fri Jan 23 2009 Roland McGrath <roland@redhat.com> - 0.139-1
- Update to 0.139
- libcpu: Add Intel SSE4 disassembler support
- readelf: Implement call frame information and exception handling dumping.
Add -e option. Enable it implicitly for -a.
- elflint: Check PT_GNU_EH_FRAME program header entry.
- libdwfl: Support automatic gzip/bzip2 decompression of ELF files. (#472136)
* Thu Jan 1 2009 Roland McGrath <roland@redhat.com> - 0.138-2
- Fix libelf regression.

View File

@ -1 +1 @@
1a846d275cb6c8ab995fa0fa877113ff elfutils-0.138.tar.bz2
9cfc12ac0d6d14968e253639fa957946 elfutils-0.139.tar.bz2

View File

@ -1,123 +1,109 @@
pub 1024D/7EBBD625 2003-01-10
uid Roland McGrath <roland@frob.com>
uid Roland McGrath <frob@debian.org>
uid Roland McGrath <roland@gnu.org>
uid Roland McGrath <roland@redhat.com>
sub 2048g/17998A93 2003-01-10
pub 1024D/79FF4474 2001-08-24
uid Ulrich Drepper <drepper@akkadia.org>
uid Ulrich Drepper <drepper@redhat.com>
uid [jpeg image of size 2203]
sub 2048g/07FA6550 2001-08-24
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.7 (GNU/Linux)
Version: GnuPG v1.4.5 (GNU/Linux)
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
gTKAnym+PwCfbnwIeEZfbBWgonv4/I3aNNm3FdQ=
=rhf6
=2IML
-----END PGP PUBLIC KEY BLOCK-----