From 95fc06c22cc2e36b31234e3fcb8d1ad6c9843fab Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 5 Mar 2013 16:38:58 +0100 Subject: [PATCH 1/8] Revert "remove package 'libelf'" This reverts commit ca5e59d6f6ae1be8490688a47646028549736517. --- packages/toolchain/devel/libelf/build | 37 +++++++++++++++++++++++++++ packages/toolchain/devel/libelf/meta | 36 ++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100755 packages/toolchain/devel/libelf/build create mode 100644 packages/toolchain/devel/libelf/meta diff --git a/packages/toolchain/devel/libelf/build b/packages/toolchain/devel/libelf/build new file mode 100755 index 0000000000..5cd945bc16 --- /dev/null +++ b/packages/toolchain/devel/libelf/build @@ -0,0 +1,37 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +. config/options $1 + +setup_toolchain host + +cd $PKG_BUILD +mkdir -p objdir && cd objdir +../configure --host=$HOST_NAME \ + --build=$HOST_NAME \ + --target=$TARGET_NAME \ + --prefix=$ROOT/$TOOLCHAIN \ + --enable-shared \ + --disable-static \ + +make +make install diff --git a/packages/toolchain/devel/libelf/meta b/packages/toolchain/devel/libelf/meta new file mode 100644 index 0000000000..073a6ba772 --- /dev/null +++ b/packages/toolchain/devel/libelf/meta @@ -0,0 +1,36 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="libelf" +PKG_VERSION="0.8.13" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://www.mr511.de/software/" +PKG_URL="http://www.mr511.de/software/$PKG_NAME-$PKG_VERSION.tar.gz" +PKG_DEPENDS="" +PKG_BUILD_DEPENDS="ccache" +PKG_PRIORITY="optional" +PKG_SECTION="toolchain/devel" +PKG_SHORTDESC="libelf: ELF object file access library" +PKG_LONGDESC="Libelf is a library to access ELF object files." +PKG_IS_ADDON="no" + +PKG_AUTORECONF="no" From b1f4435aa26f5286ea7a5fbcc38599680f8cca36 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 5 Mar 2013 16:41:26 +0100 Subject: [PATCH 2/8] Revert "elfutils: remove package" This reverts commit 12bf1cfe1476bc5aeebe8fe85465e718780968a3. --- packages/toolchain/devel/elfutils/build | 39 + packages/toolchain/devel/elfutils/meta | 36 + ...ils-0.153-dwfl_segment_report_module.patch | 45 + .../patches/elfutils-0.153-robustify.patch | 1763 +++++++++++++++++ 4 files changed, 1883 insertions(+) create mode 100755 packages/toolchain/devel/elfutils/build create mode 100644 packages/toolchain/devel/elfutils/meta create mode 100644 packages/toolchain/devel/elfutils/patches/elfutils-0.153-dwfl_segment_report_module.patch create mode 100644 packages/toolchain/devel/elfutils/patches/elfutils-0.153-robustify.patch diff --git a/packages/toolchain/devel/elfutils/build b/packages/toolchain/devel/elfutils/build new file mode 100755 index 0000000000..0af3d0a2dd --- /dev/null +++ b/packages/toolchain/devel/elfutils/build @@ -0,0 +1,39 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +. config/options $1 + +setup_toolchain host + +cd $PKG_BUILD +mkdir -p objdir && cd objdir +../configure --host=$HOST_NAME \ + --build=$HOST_NAME \ + --target=$TARGET_NAME \ + --prefix=$ROOT/$TOOLCHAIN \ + --program-prefix=eu_ \ + --with-zlib \ + --without-bzlib \ + --with-lzma \ + +make +make install diff --git a/packages/toolchain/devel/elfutils/meta b/packages/toolchain/devel/elfutils/meta new file mode 100644 index 0000000000..643b6fa25a --- /dev/null +++ b/packages/toolchain/devel/elfutils/meta @@ -0,0 +1,36 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="elfutils" +PKG_VERSION="0.153" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="https://fedorahosted.org/elfutils/" +PKG_URL="https://fedorahosted.org/releases/e/l/elfutils/$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.bz2" +PKG_DEPENDS="" +PKG_BUILD_DEPENDS="ccache bison flex zlib-host xz" +PKG_PRIORITY="optional" +PKG_SECTION="toolchain/devel" +PKG_SHORTDESC="elfutils: collection of utilities to handle ELF objects" +PKG_LONGDESC="Elfutils is a collection of utilities, including eu-ld (a linker), eu-nm (for listing symbols from object files), eu-size (for listing the section sizes of an object or archive file), eu-strip (for discarding symbols), eu-readelf (to see the raw ELF file structures), and eu-elflint (to check for well-formed ELF files)." +PKG_IS_ADDON="no" + +PKG_AUTORECONF="no" diff --git a/packages/toolchain/devel/elfutils/patches/elfutils-0.153-dwfl_segment_report_module.patch b/packages/toolchain/devel/elfutils/patches/elfutils-0.153-dwfl_segment_report_module.patch new file mode 100644 index 0000000000..f893c4ff38 --- /dev/null +++ b/packages/toolchain/devel/elfutils/patches/elfutils-0.153-dwfl_segment_report_module.patch @@ -0,0 +1,45 @@ +commit 210c2f03efbbaacc51f2641baa0947d9c316de12 +Author: Roland McGrath +Date: Wed Mar 28 10:22:35 2012 -0700 + + RHBZ#805447: Fix core file grokking for case of truncated .dynstr + +diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog +index 87a0555..86f6fba 100644 +--- a/libdwfl/ChangeLog ++++ b/libdwfl/ChangeLog +@@ -1,3 +1,10 @@ ++2012-03-28 Roland McGrath ++ ++ * dwfl_segment_report_module.c ++ (dwfl_segment_report_module: read_portion): Don't use existing buffer ++ when FILESZ is zero (string mode) and available portion doesn't hold ++ a terminated string. ++ + 2011-12-02 Roland McGrath + + * elf-from-memory.c (elf_from_remote_memory): Fix ELFCLASS64 case +diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c +index 012a0fd..5534180 100644 +--- a/libdwfl/dwfl_segment_report_module.c ++++ b/libdwfl/dwfl_segment_report_module.c +@@ -1,5 +1,5 @@ + /* Sniff out modules from ELF headers visible in memory segments. +- Copyright (C) 2008-2010 Red Hat, Inc. ++ Copyright (C) 2008-2012 Red Hat, Inc. + This file is part of Red Hat elfutils. + + Red Hat elfutils is free software; you can redistribute it and/or modify +@@ -155,7 +155,11 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, + inline bool read_portion (void **data, size_t *data_size, + GElf_Addr vaddr, size_t filesz) + { +- if (vaddr - start + filesz > buffer_available) ++ if (vaddr - start + filesz > buffer_available ++ /* If we're in string mode, then don't consider the buffer we have ++ sufficient unless it contains the terminator of the string. */ ++ || (filesz == 0 && memchr (vaddr - start + buffer, '\0', ++ buffer_available - (vaddr - start)) == NULL)) + { + *data = NULL; + *data_size = filesz; diff --git a/packages/toolchain/devel/elfutils/patches/elfutils-0.153-robustify.patch b/packages/toolchain/devel/elfutils/patches/elfutils-0.153-robustify.patch new file mode 100644 index 0000000000..d4ecbf010c --- /dev/null +++ b/packages/toolchain/devel/elfutils/patches/elfutils-0.153-robustify.patch @@ -0,0 +1,1763 @@ +--- elfutils/libdwfl/ChangeLog ++++ elfutils/libdwfl/ChangeLog +@@ -41,6 +41,11 @@ + * dwfl_module_getdwarf.c (open_elf): Clear errno before CBFAIL. + Reported by Kurt Roeckx . + ++2011-03-23 Petr Machata ++ ++ * relocate.c (relocate_section): Use gelf_fsize instead of relying ++ on shdr->sh_entsize. ++ + 2011-02-11 Roland McGrath + + * linux-kernel-modules.c (try_kernel_name): Try .gz, .bz2, .xz +--- elfutils/libdwfl/relocate.c ++++ elfutils/libdwfl/relocate.c +@@ -1,5 +1,5 @@ + /* Relocate debug information. +- Copyright (C) 2005-2010 Red Hat, Inc. ++ Copyright (C) 2005-2011 Red Hat, Inc. + This file is part of Red Hat elfutils. + + Red Hat elfutils is free software; you can redistribute it and/or modify +@@ -478,7 +478,10 @@ relocate_section (Dwfl_Module *mod, Elf + } + } + +- size_t nrels = shdr->sh_size / shdr->sh_entsize; ++ size_t sh_entsize ++ = gelf_fsize (relocated, shdr->sh_type == SHT_REL ? ELF_T_REL : ELF_T_RELA, ++ 1, EV_CURRENT); ++ size_t nrels = shdr->sh_size / sh_entsize; + size_t complete = 0; + if (shdr->sh_type == SHT_REL) + for (size_t relidx = 0; !result && relidx < nrels; ++relidx) +@@ -580,7 +583,7 @@ relocate_section (Dwfl_Module *mod, Elf + nrels = next; + } + +- shdr->sh_size = reldata->d_size = nrels * shdr->sh_entsize; ++ shdr->sh_size = reldata->d_size = nrels * sh_entsize; + gelf_update_shdr (scn, shdr); + } + +--- elfutils/libelf/ChangeLog ++++ elfutils/libelf/ChangeLog +@@ -663,10 +663,53 @@ + 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-14 Jakub Jelinek ++ ++ * 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 + + * elf.h: Update again. + ++2005-05-17 Jakub Jelinek ++ ++ * 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-09 Ulrich Drepper + + * elf.h: Update from glibc. +--- elfutils/libelf/elf32_getphdr.c ++++ elfutils/libelf/elf32_getphdr.c +@@ -114,6 +114,16 @@ __elfw2(LIBELFBITS,getphdr_wrlock) (elf) + + if (elf->map_address != NULL) + { ++ /* First see whether the information in the ELF header is ++ valid and it does not ask for too much. */ ++ if (unlikely (ehdr->e_phoff >= elf->maximum_size) ++ || unlikely (elf->maximum_size - ehdr->e_phoff < size)) ++ { ++ /* Something is wrong. */ ++ __libelf_seterrno (ELF_E_INVALID_PHDR); ++ goto out; ++ } ++ + /* All the data is already mapped. Use it. */ + void *file_phdr = ((char *) elf->map_address + + elf->start_offset + ehdr->e_phoff); +--- 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, 2009 Red Hat, Inc. ++ Copyright (C) 1998-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 1998. + +@@ -81,7 +81,8 @@ load_shdr_wrlock (Elf_Scn *scn) + goto out; + + size_t shnum; +- if (__elf_getshdrnum_rdlock (elf, &shnum) != 0) ++ if (__elf_getshdrnum_rdlock (elf, &shnum) != 0 ++ || shnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Shdr))) + goto out; + size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr)); + +@@ -98,6 +99,16 @@ load_shdr_wrlock (Elf_Scn *scn) + + if (elf->map_address != NULL) + { ++ /* First see whether the information in the ELF header is ++ valid and it does not ask for too much. */ ++ if (unlikely (ehdr->e_shoff >= elf->maximum_size) ++ || unlikely (elf->maximum_size - ehdr->e_shoff < size)) ++ { ++ /* Something is wrong. */ ++ __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER); ++ goto free_and_out; ++ } ++ + ElfW2(LIBELFBITS,Shdr) *notcvt; + + /* All the data is already mapped. If we could use it +--- elfutils/libelf/elf32_newphdr.c ++++ elfutils/libelf/elf32_newphdr.c +@@ -135,6 +135,12 @@ elfw2(LIBELFBITS,newphdr) (elf, count) + || count == PN_XNUM + || elf->state.ELFW(elf,LIBELFBITS).phdr == NULL) + { ++ if (unlikely (count > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr)))) ++ { ++ result = NULL; ++ goto out; ++ } ++ + /* Allocate a new program header with the appropriate number of + elements. */ + result = (ElfW2(LIBELFBITS,Phdr) *) +--- elfutils/libelf/elf32_updatefile.c ++++ elfutils/libelf/elf32_updatefile.c +@@ -223,6 +223,9 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf + /* Write all the sections. Well, only those which are modified. */ + if (shnum > 0) + { ++ if (unlikely (shnum > SIZE_MAX / sizeof (Elf_Scn *))) ++ return 1; ++ + 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 +@@ -645,6 +648,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf + /* Write all the sections. Well, only those which are modified. */ + if (shnum > 0) + { ++ if (unlikely (shnum > SIZE_MAX / (sizeof (Elf_Scn *) ++ + sizeof (ElfW2(LIBELFBITS,Shdr))))) ++ return 1; ++ + 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/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) + { +- if (ehdr.e32->e_shoff + sizeof (Elf32_Shdr) > maxsize) ++ if (unlikely (ehdr.e32->e_shoff >= maxsize) ++ || unlikely (maxsize - ehdr.e32->e_shoff < sizeof (Elf32_Shdr))) + /* Cannot read the first section header. */ + return 0; + +@@ -213,7 +214,8 @@ get_shnum (void *map_address, unsigned c + + if (unlikely (result == 0) && ehdr.e64->e_shoff != 0) + { +- if (ehdr.e64->e_shoff + sizeof (Elf64_Shdr) > maxsize) ++ if (unlikely (ehdr.e64->e_shoff >= maxsize) ++ || unlikely (ehdr.e64->e_shoff + sizeof (Elf64_Shdr) > maxsize)) + /* Cannot read the first section header. */ + return 0; + +@@ -285,6 +287,15 @@ file_read_elf (int fildes, void *map_add + /* Could not determine the number of sections. */ + return NULL; + ++ /* Check for too many sections. */ ++ if (e_ident[EI_CLASS] == ELFCLASS32) ++ { ++ if (scncnt > SIZE_MAX / (sizeof (Elf_Scn) + sizeof (Elf32_Shdr))) ++ return NULL; ++ } ++ else if (scncnt > SIZE_MAX / (sizeof (Elf_Scn) + sizeof (Elf64_Shdr))) ++ return NULL; ++ + /* We can now allocate the memory. Even if there are no section headers, + we allocate space for a zeroth section in case we need it later. */ + const size_t scnmax = (scncnt ?: (cmd == ELF_C_RDWR || cmd == ELF_C_RDWR_MMAP) +@@ -324,6 +335,16 @@ file_read_elf (int fildes, void *map_add + { + /* We can use the mmapped memory. */ + elf->state.elf32.ehdr = ehdr; ++ ++ if (unlikely (ehdr->e_shoff >= maxsize) ++ || unlikely (maxsize - ehdr->e_shoff ++ < scncnt * sizeof (Elf32_Shdr))) ++ { ++ free_and_out: ++ free (elf); ++ __libelf_seterrno (ELF_E_INVALID_FILE); ++ return NULL; ++ } + elf->state.elf32.shdr + = (Elf32_Shdr *) ((char *) ehdr + ehdr->e_shoff); + +@@ -410,6 +431,11 @@ file_read_elf (int fildes, void *map_add + { + /* We can use the mmapped memory. */ + elf->state.elf64.ehdr = ehdr; ++ ++ if (unlikely (ehdr->e_shoff >= maxsize) ++ || unlikely (ehdr->e_shoff ++ + scncnt * sizeof (Elf32_Shdr) > maxsize)) ++ goto free_and_out; + elf->state.elf64.shdr + = (Elf64_Shdr *) ((char *) ehdr + ehdr->e_shoff); + +--- elfutils/libelf/elf_getarsym.c ++++ elfutils/libelf/elf_getarsym.c +@@ -179,6 +179,9 @@ elf_getarsym (elf, ptr) + size_t index_size = atol (tmpbuf); + + if (SARMAG + sizeof (struct ar_hdr) + index_size > elf->maximum_size ++#if SIZE_MAX <= 4294967295U ++ || n >= SIZE_MAX / sizeof (Elf_Arsym) ++#endif + || n * sizeof (uint32_t) > index_size) + { + /* This index table cannot be right since it does not fit into +--- elfutils/libelf/elf_getshdrstrndx.c ++++ elfutils/libelf/elf_getshdrstrndx.c +@@ -125,10 +125,25 @@ elf_getshdrstrndx (elf, dst) + if (elf->map_address != NULL + && elf->state.elf32.ehdr->e_ident[EI_DATA] == MY_ELFDATA + && (ALLOW_UNALIGNED +- || (((size_t) ((char *) elf->map_address + offset)) ++ || (((size_t) ((char *) elf->map_address ++ + elf->start_offset + offset)) + & (__alignof__ (Elf32_Shdr) - 1)) == 0)) +- /* We can directly access the memory. */ +- num = ((Elf32_Shdr *) (elf->map_address + offset))->sh_link; ++ { ++ /* First see whether the information in the ELF header is ++ valid and it does not ask for too much. */ ++ if (unlikely (elf->maximum_size - offset ++ < sizeof (Elf32_Shdr))) ++ { ++ /* Something is wrong. */ ++ __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER); ++ result = -1; ++ goto out; ++ } ++ ++ /* We can directly access the memory. */ ++ num = ((Elf32_Shdr *) (elf->map_address + elf->start_offset ++ + offset))->sh_link; ++ } + else + { + /* We avoid reading in all the section headers. Just read +@@ -163,10 +178,25 @@ elf_getshdrstrndx (elf, dst) + if (elf->map_address != NULL + && elf->state.elf64.ehdr->e_ident[EI_DATA] == MY_ELFDATA + && (ALLOW_UNALIGNED +- || (((size_t) ((char *) elf->map_address + offset)) ++ || (((size_t) ((char *) elf->map_address ++ + elf->start_offset + offset)) + & (__alignof__ (Elf64_Shdr) - 1)) == 0)) +- /* We can directly access the memory. */ +- num = ((Elf64_Shdr *) (elf->map_address + offset))->sh_link; ++ { ++ /* First see whether the information in the ELF header is ++ valid and it does not ask for too much. */ ++ if (unlikely (elf->maximum_size - offset ++ < sizeof (Elf64_Shdr))) ++ { ++ /* Something is wrong. */ ++ __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER); ++ result = -1; ++ goto out; ++ } ++ ++ /* We can directly access the memory. */ ++ num = ((Elf64_Shdr *) (elf->map_address + elf->start_offset ++ + offset))->sh_link; ++ } + else + { + /* We avoid reading in all the section headers. Just read +--- elfutils/libelf/elf_newscn.c ++++ elfutils/libelf/elf_newscn.c +@@ -104,10 +104,18 @@ elf_newscn (elf) + else + { + /* We must allocate a new element. */ +- Elf_ScnList *newp; ++ Elf_ScnList *newp = NULL; + + assert (elf->state.elf.scnincr > 0); + ++ if ( ++#if SIZE_MAX <= 4294967295U ++ likely (elf->state.elf.scnincr ++ < SIZE_MAX / 2 / sizeof (Elf_Scn) - sizeof (Elf_ScnList)) ++#else ++ 1 ++#endif ++ ) + newp = (Elf_ScnList *) calloc (sizeof (Elf_ScnList) + + ((elf->state.elf.scnincr *= 2) + * sizeof (Elf_Scn)), 1); +--- elfutils/libelf/gelf_getdyn.c ++++ elfutils/libelf/gelf_getdyn.c +@@ -1,5 +1,5 @@ + /* Get information from dynamic table at the given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -93,7 +93,7 @@ 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 + data we are converting the format. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Dyn) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf32_Dyn, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +@@ -114,7 +114,7 @@ gelf_getdyn (data, ndx, dst) + + /* The data is already in the correct form. Just make sure the + index is OK. */ +- if (unlikely ((ndx + 1) * sizeof (GElf_Dyn) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, GElf_Dyn, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_getlib.c ++++ elfutils/libelf/gelf_getlib.c +@@ -1,5 +1,5 @@ + /* Get library from table at the given index. +- Copyright (C) 2004 Red Hat, Inc. ++ Copyright (C) 2004-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2004. + +@@ -86,7 +86,7 @@ gelf_getlib (data, ndx, dst) + /* The data is already in the correct form. Just make sure the + index is OK. */ + GElf_Lib *result = NULL; +- if (unlikely ((ndx + 1) * sizeof (GElf_Lib) > data->d_size)) ++ if (INVALID_NDX (ndx, GElf_Lib, data)) + __libelf_seterrno (ELF_E_INVALID_INDEX); + else + { +--- elfutils/libelf/gelf_getmove.c ++++ elfutils/libelf/gelf_getmove.c +@@ -1,5 +1,5 @@ + /* Get move structure at the given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -83,7 +83,7 @@ gelf_getmove (data, ndx, dst) + + /* The data is already in the correct form. Just make sure the + index is OK. */ +- if (unlikely ((ndx + 1) * sizeof (GElf_Move) > data->d_size)) ++ if (INVALID_NDX (ndx, GElf_Move, data)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_getrela.c ++++ elfutils/libelf/gelf_getrela.c +@@ -1,5 +1,5 @@ + /* Get RELA relocation information at given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -71,12 +71,6 @@ gelf_getrela (data, ndx, dst) + if (data_scn == NULL) + return NULL; + +- if (unlikely (ndx < 0)) +- { +- __libelf_seterrno (ELF_E_INVALID_INDEX); +- return NULL; +- } +- + if (unlikely (data_scn->d.d_type != ELF_T_RELA)) + { + __libelf_seterrno (ELF_E_INVALID_HANDLE); +@@ -93,7 +87,7 @@ gelf_getrela (data, ndx, dst) + if (scn->elf->class == ELFCLASS32) + { + /* We have to convert the data. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Rela) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf32_Rela, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + result = NULL; +@@ -114,7 +108,7 @@ gelf_getrela (data, ndx, dst) + { + /* Simply copy the data after we made sure we are actually getting + correct data. */ +- if (unlikely ((ndx + 1) * sizeof (Elf64_Rela) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf64_Rela, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + result = NULL; +--- elfutils/libelf/gelf_getrel.c ++++ elfutils/libelf/gelf_getrel.c +@@ -1,5 +1,5 @@ + /* Get REL relocation information at given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -71,12 +71,6 @@ gelf_getrel (data, ndx, dst) + if (data_scn == NULL) + return NULL; + +- if (unlikely (ndx < 0)) +- { +- __libelf_seterrno (ELF_E_INVALID_INDEX); +- return NULL; +- } +- + if (unlikely (data_scn->d.d_type != ELF_T_REL)) + { + __libelf_seterrno (ELF_E_INVALID_HANDLE); +@@ -93,7 +87,7 @@ gelf_getrel (data, ndx, dst) + if (scn->elf->class == ELFCLASS32) + { + /* We have to convert the data. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Rel) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf32_Rel, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + result = NULL; +@@ -113,7 +107,7 @@ gelf_getrel (data, ndx, dst) + { + /* Simply copy the data after we made sure we are actually getting + correct data. */ +- if (unlikely ((ndx + 1) * sizeof (Elf64_Rel) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf64_Rel, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + result = NULL; +--- elfutils/libelf/gelf_getsym.c ++++ elfutils/libelf/gelf_getsym.c +@@ -1,5 +1,5 @@ + /* Get symbol information from symbol table at the given index. +- Copyright (C) 1999, 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 1999-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 1999. + +@@ -90,7 +90,7 @@ 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 + data we are converting the format. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > data->d_size)) ++ if (INVALID_NDX (ndx, Elf32_Sym, data)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +@@ -119,7 +119,7 @@ gelf_getsym (data, ndx, dst) + + /* The data is already in the correct form. Just make sure the + index is OK. */ +- if (unlikely ((ndx + 1) * sizeof (GElf_Sym) > data->d_size)) ++ if (INVALID_NDX (ndx, GElf_Sym, data)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_getsyminfo.c ++++ elfutils/libelf/gelf_getsyminfo.c +@@ -1,5 +1,5 @@ + /* Get additional symbol information from symbol table at the given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -84,7 +84,7 @@ gelf_getsyminfo (data, ndx, dst) + + /* The data is already in the correct form. Just make sure the + index is OK. */ +- if (unlikely ((ndx + 1) * sizeof (GElf_Syminfo) > data->d_size)) ++ if (INVALID_NDX (ndx, GElf_Syminfo, data)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_getsymshndx.c ++++ elfutils/libelf/gelf_getsymshndx.c +@@ -1,6 +1,6 @@ + /* Get symbol information and separate section index from symbol table + at the given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -90,7 +90,7 @@ gelf_getsymshndx (symdata, shndxdata, nd + section index table. */ + if (likely (shndxdata_scn != NULL)) + { +- if (unlikely ((ndx + 1) * sizeof (Elf32_Word) > shndxdata_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf32_Word, &shndxdata_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +@@ -110,7 +110,7 @@ gelf_getsymshndx (symdata, shndxdata, nd + table entries has to be adopted. The user better has provided + a buffer where we can store the information. While copying the + data we are converting the format. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > symdata->d_size)) ++ if (INVALID_NDX (ndx, Elf32_Sym, symdata)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +@@ -139,7 +139,7 @@ gelf_getsymshndx (symdata, shndxdata, nd + + /* The data is already in the correct form. Just make sure the + index is OK. */ +- if (unlikely ((ndx + 1) * sizeof (GElf_Sym) > symdata->d_size)) ++ if (INVALID_NDX (ndx, GElf_Sym, symdata)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_getversym.c ++++ elfutils/libelf/gelf_getversym.c +@@ -1,5 +1,5 @@ + /* Get symbol version information at the given index. +- Copyright (C) 1999, 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 1999-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 1999. + +@@ -92,7 +92,7 @@ gelf_getversym (data, ndx, dst) + + /* The data is already in the correct form. Just make sure the + index is OK. */ +- if (unlikely ((ndx + 1) * sizeof (GElf_Versym) > data->d_size)) ++ if (INVALID_NDX (ndx, GElf_Versym, data)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + result = NULL; +--- elfutils/libelf/gelf_update_dyn.c ++++ elfutils/libelf/gelf_update_dyn.c +@@ -1,5 +1,5 @@ + /* Update information in dynamic table at the given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -71,12 +71,6 @@ gelf_update_dyn (data, ndx, src) + if (data == NULL) + return 0; + +- if (unlikely (ndx < 0)) +- { +- __libelf_seterrno (ELF_E_INVALID_INDEX); +- return 0; +- } +- + if (unlikely (data_scn->d.d_type != ELF_T_DYN)) + { + /* The type of the data better should match. */ +@@ -102,7 +96,7 @@ gelf_update_dyn (data, ndx, src) + } + + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Dyn) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf32_Dyn, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +@@ -116,7 +110,7 @@ gelf_update_dyn (data, ndx, src) + else + { + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf64_Dyn) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf64_Dyn, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_update_lib.c ++++ elfutils/libelf/gelf_update_lib.c +@@ -1,5 +1,5 @@ + /* Update library in table at the given index. +- Copyright (C) 2004 Red Hat, Inc. ++ Copyright (C) 2004-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2004. + +@@ -68,12 +68,6 @@ gelf_update_lib (data, ndx, src) + if (data == NULL) + return 0; + +- if (unlikely (ndx < 0)) +- { +- __libelf_seterrno (ELF_E_INVALID_INDEX); +- return 0; +- } +- + Elf_Data_Scn *data_scn = (Elf_Data_Scn *) data; + if (unlikely (data_scn->d.d_type != ELF_T_LIB)) + { +@@ -87,7 +81,7 @@ gelf_update_lib (data, ndx, src) + + /* Check whether we have to resize the data buffer. */ + int result = 0; +- if (unlikely ((ndx + 1) * sizeof (Elf64_Lib) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf64_Lib, &data_scn->d)) + __libelf_seterrno (ELF_E_INVALID_INDEX); + else + { +--- elfutils/libelf/gelf_update_move.c ++++ elfutils/libelf/gelf_update_move.c +@@ -1,5 +1,5 @@ + /* Update move structure at the given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -75,8 +75,7 @@ gelf_update_move (data, ndx, src) + assert (sizeof (GElf_Move) == sizeof (Elf64_Move)); + + /* Check whether we have to resize the data buffer. */ +- if (unlikely (ndx < 0) +- || unlikely ((ndx + 1) * sizeof (GElf_Move) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, GElf_Move, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + return 0; +--- elfutils/libelf/gelf_update_rela.c ++++ elfutils/libelf/gelf_update_rela.c +@@ -1,5 +1,5 @@ + /* Update RELA relocation information at given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -68,12 +68,6 @@ gelf_update_rela (Elf_Data *dst, int ndx + if (dst == NULL) + return 0; + +- if (unlikely (ndx < 0)) +- { +- __libelf_seterrno (ELF_E_INVALID_INDEX); +- return 0; +- } +- + if (unlikely (data_scn->d.d_type != ELF_T_RELA)) + { + /* The type of the data better should match. */ +@@ -101,7 +95,7 @@ gelf_update_rela (Elf_Data *dst, int ndx + } + + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Rela) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf32_Rela, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +@@ -117,7 +111,7 @@ gelf_update_rela (Elf_Data *dst, int ndx + else + { + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf64_Rela) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf64_Rela, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_update_rel.c ++++ elfutils/libelf/gelf_update_rel.c +@@ -1,5 +1,5 @@ + /* Update REL relocation information at given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -68,12 +68,6 @@ gelf_update_rel (Elf_Data *dst, int ndx, + if (dst == NULL) + return 0; + +- if (unlikely (ndx < 0)) +- { +- __libelf_seterrno (ELF_E_INVALID_INDEX); +- return 0; +- } +- + if (unlikely (data_scn->d.d_type != ELF_T_REL)) + { + /* The type of the data better should match. */ +@@ -99,7 +93,7 @@ gelf_update_rel (Elf_Data *dst, int ndx, + } + + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Rel) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf32_Rel, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +@@ -114,7 +108,7 @@ gelf_update_rel (Elf_Data *dst, int ndx, + else + { + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf64_Rel) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf64_Rel, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_update_sym.c ++++ elfutils/libelf/gelf_update_sym.c +@@ -1,5 +1,5 @@ + /* Update symbol information in symbol table at the given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -72,12 +72,6 @@ gelf_update_sym (data, ndx, src) + if (data == NULL) + return 0; + +- if (unlikely (ndx < 0)) +- { +- __libelf_seterrno (ELF_E_INVALID_INDEX); +- return 0; +- } +- + if (unlikely (data_scn->d.d_type != ELF_T_SYM)) + { + /* The type of the data better should match. */ +@@ -102,7 +96,7 @@ gelf_update_sym (data, ndx, src) + } + + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf32_Sym, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +@@ -125,7 +119,7 @@ gelf_update_sym (data, ndx, src) + else + { + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf64_Sym) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf64_Sym, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_update_syminfo.c ++++ elfutils/libelf/gelf_update_syminfo.c +@@ -1,5 +1,5 @@ + /* Update additional symbol information in symbol table at the given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -72,12 +72,6 @@ gelf_update_syminfo (data, ndx, src) + if (data == NULL) + return 0; + +- if (unlikely (ndx < 0)) +- { +- __libelf_seterrno (ELF_E_INVALID_INDEX); +- return 0; +- } +- + if (unlikely (data_scn->d.d_type != ELF_T_SYMINFO)) + { + /* The type of the data better should match. */ +@@ -93,7 +87,7 @@ gelf_update_syminfo (data, ndx, src) + rwlock_wrlock (scn->elf->lock); + + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (GElf_Syminfo) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, GElf_Syminfo, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_update_symshndx.c ++++ elfutils/libelf/gelf_update_symshndx.c +@@ -1,6 +1,6 @@ + /* Update symbol information and section index in symbol table at the + given index. +- Copyright (C) 2000, 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2000-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2000. + +@@ -77,12 +77,6 @@ gelf_update_symshndx (symdata, shndxdata + if (symdata == NULL) + return 0; + +- if (unlikely (ndx < 0)) +- { +- __libelf_seterrno (ELF_E_INVALID_INDEX); +- return 0; +- } +- + if (unlikely (symdata_scn->d.d_type != ELF_T_SYM)) + { + /* The type of the data better should match. */ +@@ -128,7 +122,7 @@ gelf_update_symshndx (symdata, shndxdata + } + + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > symdata_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf32_Sym, &symdata_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +@@ -151,7 +145,7 @@ gelf_update_symshndx (symdata, shndxdata + else + { + /* Check whether we have to resize the data buffer. */ +- if (unlikely ((ndx + 1) * sizeof (Elf64_Sym) > symdata_scn->d.d_size)) ++ if (INVALID_NDX (ndx, Elf64_Sym, &symdata_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + goto out; +--- elfutils/libelf/gelf_update_versym.c ++++ elfutils/libelf/gelf_update_versym.c +@@ -1,5 +1,5 @@ + /* Update symbol version information. +- Copyright (C) 2001, 2002 Red Hat, Inc. ++ Copyright (C) 2001-2009 Red Hat, Inc. + This file is part of Red Hat elfutils. + Written by Ulrich Drepper , 2001. + +@@ -75,8 +75,7 @@ gelf_update_versym (data, ndx, src) + assert (sizeof (GElf_Versym) == sizeof (Elf64_Versym)); + + /* Check whether we have to resize the data buffer. */ +- if (unlikely (ndx < 0) +- || unlikely ((ndx + 1) * sizeof (GElf_Versym) > data_scn->d.d_size)) ++ if (INVALID_NDX (ndx, GElf_Versym, &data_scn->d)) + { + __libelf_seterrno (ELF_E_INVALID_INDEX); + return 0; +--- elfutils/libelf/libelfP.h ++++ elfutils/libelf/libelfP.h +@@ -608,4 +608,8 @@ 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) + ++/* Convenience macro. */ ++#define INVALID_NDX(ndx, type, data) \ ++ unlikely ((data)->d_size / sizeof (type) <= (unsigned int) (ndx)) ++ + #endif /* libelfP.h */ +--- elfutils/src/ChangeLog ++++ elfutils/src/ChangeLog +@@ -228,6 +228,12 @@ + + * readelf.c (dwarf_attr_string): Grok DW_AT_GNU_odr_signature. + ++2011-03-23 Petr Machata ++ ++ * readelf.c (handle_dynamic, handle_relocs_rel) ++ (handle_relocs_rela, handle_versym, print_liblist): ++ Use gelf_fsize instead of relying on shdr->sh_entsize. ++ + 2011-02-11 Roland McGrath + + * elfcmp.c (verbose): New variable. +@@ -1940,6 +1946,16 @@ + object symbols or symbols with unknown type. + (check_rel): Likewise. + ++2005-06-09 Roland McGrath ++ ++ * 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 + + * readelf.c (print_ops): Add consts. +@@ -1985,6 +2001,19 @@ + + * readelf.c (dwarf_tag_string): Add new tags. + ++2005-05-17 Jakub Jelinek ++ ++ * elflint.c (check_hash): Don't check entries beyond end of section. ++ (check_note): Don't crash if gelf_rawchunk fails. ++ (section_name): Return if gelf_getshdr returns NULL. ++ ++2005-05-14 Jakub Jelinek ++ ++ * elflint.c (section_name): Return "" 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 + + * strip.c (handle_elf): Don't translate hash and versym data formats, +--- elfutils/src/elflint.c ++++ elfutils/src/elflint.c +@@ -131,6 +131,10 @@ static uint32_t shstrndx; + /* Array to count references in section groups. */ + static int *scnref; + ++/* Numbers of sections and program headers. */ ++static unsigned int shnum; ++static unsigned int phnum; ++ + + int + main (int argc, char *argv[]) +@@ -319,10 +323,19 @@ section_name (Ebl *ebl, int idx) + { + GElf_Shdr shdr_mem; + GElf_Shdr *shdr; ++ const char *ret; ++ ++ if ((unsigned int) idx > shnum) ++ return ""; + + shdr = gelf_getshdr (elf_getscn (ebl->elf, idx), &shdr_mem); ++ if (shdr == NULL) ++ return ""; + +- return elf_strptr (ebl->elf, shstrndx, shdr->sh_name); ++ ret = elf_strptr (ebl->elf, shstrndx, shdr->sh_name); ++ if (ret == NULL) ++ return ""; ++ return ret; + } + + +@@ -344,11 +357,6 @@ static const int valid_e_machine[] = + (sizeof (valid_e_machine) / sizeof (valid_e_machine[0])) + + +-/* Numbers of sections and program headers. */ +-static unsigned int shnum; +-static unsigned int phnum; +- +- + static void + check_elf_header (Ebl *ebl, GElf_Ehdr *ehdr, size_t size) + { +@@ -632,7 +640,8 @@ section [%2d] '%s': symbol table cannot + } + } + +- if (shdr->sh_entsize != gelf_fsize (ebl->elf, ELF_T_SYM, 1, EV_CURRENT)) ++ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_SYM, 1, EV_CURRENT); ++ if (shdr->sh_entsize != sh_entsize) + ERROR (gettext ("\ + section [%2u] '%s': entry size is does not match ElfXX_Sym\n"), + idx, section_name (ebl, idx)); +@@ -670,7 +679,7 @@ section [%2d] '%s': XINDEX for zeroth en + xndxscnidx, section_name (ebl, xndxscnidx)); + } + +- for (size_t cnt = 1; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt) ++ for (size_t cnt = 1; cnt < shdr->sh_size / sh_entsize; ++cnt) + { + sym = gelf_getsymshndx (data, xndxdata, cnt, &sym_mem, &xndx); + if (sym == NULL) +@@ -690,7 +699,8 @@ section [%2d] '%s': symbol %zu: invalid + else + { + name = elf_strptr (ebl->elf, shdr->sh_link, sym->st_name); +- assert (name != NULL); ++ assert (name != NULL ++ || strshdr->sh_type != SHT_STRTAB); + } + + if (sym->st_shndx == SHN_XINDEX) +@@ -1039,9 +1049,11 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e + { + GElf_Shdr rcshdr_mem; + const GElf_Shdr *rcshdr = gelf_getshdr (scn, &rcshdr_mem); +- assert (rcshdr != NULL); + +- if (rcshdr->sh_type == SHT_DYNAMIC) ++ if (rcshdr == NULL) ++ break; ++ ++ if (rcshdr->sh_type == SHT_DYNAMIC && rcshdr->sh_entsize) + { + /* Found the dynamic section. Look through it. */ + Elf_Data *d = elf_getdata (scn, NULL); +@@ -1051,7 +1063,9 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e + { + GElf_Dyn dyn_mem; + GElf_Dyn *dyn = gelf_getdyn (d, cnt, &dyn_mem); +- assert (dyn != NULL); ++ ++ if (dyn == NULL) ++ break; + + if (dyn->d_tag == DT_RELCOUNT) + { +@@ -1065,7 +1079,9 @@ section [%2d] '%s': DT_RELCOUNT used for + /* Does the number specified number of relative + relocations exceed the total number of + relocations? */ +- if (dyn->d_un.d_val > shdr->sh_size / shdr->sh_entsize) ++ if (shdr->sh_entsize != 0 ++ && dyn->d_un.d_val > (shdr->sh_size ++ / shdr->sh_entsize)) + ERROR (gettext ("\ + section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"), + idx, section_name (ebl, idx), +@@ -1225,7 +1241,8 @@ section [%2d] '%s': no relocations for m + } + } + +- if (shdr->sh_entsize != gelf_fsize (ebl->elf, reltype, 1, EV_CURRENT)) ++ size_t sh_entsize = gelf_fsize (ebl->elf, reltype, 1, EV_CURRENT); ++ if (shdr->sh_entsize != sh_entsize) + 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"), +@@ -1448,7 +1465,8 @@ check_rela (Ebl *ebl, GElf_Ehdr *ehdr, G + Elf_Data *symdata = elf_getdata (symscn, NULL); + enum load_state state = state_undecided; + +- for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt) ++ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELA, 1, EV_CURRENT); ++ for (size_t cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) + { + GElf_Rela rela_mem; + GElf_Rela *rela = gelf_getrela (data, cnt, &rela_mem); +@@ -1498,7 +1516,8 @@ check_rel (Ebl *ebl, GElf_Ehdr *ehdr, GE + Elf_Data *symdata = elf_getdata (symscn, NULL); + enum load_state state = state_undecided; + +- for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt) ++ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_REL, 1, EV_CURRENT); ++ for (size_t cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) + { + GElf_Rel rel_mem; + GElf_Rel *rel = gelf_getrel (data, cnt, &rel_mem); +@@ -1597,7 +1616,8 @@ section [%2d] '%s': referenced as string + shdr->sh_link, section_name (ebl, shdr->sh_link), + idx, section_name (ebl, idx)); + +- if (shdr->sh_entsize != gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT)) ++ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT); ++ if (shdr->sh_entsize != sh_entsize) + ERROR (gettext ("\ + section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"), + idx, section_name (ebl, idx)); +@@ -1607,7 +1627,7 @@ section [%2d] '%s': section entry size d + idx, section_name (ebl, idx)); + + bool non_null_warned = false; +- for (cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt) ++ for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) + { + GElf_Dyn dyn_mem; + GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dyn_mem); +@@ -1879,6 +1899,8 @@ section [%2d] '%s': entry size does not + idx, section_name (ebl, idx)); + + if (symshdr != NULL ++ && shdr->sh_entsize ++ && symshdr->sh_entsize + && (shdr->sh_size / shdr->sh_entsize + < symshdr->sh_size / symshdr->sh_entsize)) + ERROR (gettext ("\ +@@ -1905,6 +1927,12 @@ section [%2d] '%s': extended section ind + } + + Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL); ++ if (data == NULL) ++ { ++ ERROR (gettext ("section [%2d] '%s': cannot get section data\n"), ++ idx, section_name (ebl, idx)); ++ return; ++ } + + if (*((Elf32_Word *) data->d_buf) != 0) + ERROR (gettext ("symbol 0 should have zero extended section index\n")); +@@ -1947,7 +1975,7 @@ section [%2d] '%s': hash table section i + + size_t maxidx = nchain; + +- if (symshdr != NULL) ++ if (symshdr != NULL && symshdr->sh_entsize != 0) + { + size_t symsize = symshdr->sh_size / symshdr->sh_entsize; + +@@ -1958,18 +1986,28 @@ section [%2d] '%s': hash table section i + maxidx = symsize; + } + ++ Elf32_Word *buf = (Elf32_Word *) data->d_buf; ++ Elf32_Word *end = (Elf32_Word *) ((char *) data->d_buf + shdr->sh_size); + size_t cnt; + for (cnt = 2; cnt < 2 + nbucket; ++cnt) +- if (((Elf32_Word *) data->d_buf)[cnt] >= maxidx) ++ { ++ if (buf + cnt >= end) ++ break; ++ else if (buf[cnt] >= maxidx) + ERROR (gettext ("\ + section [%2d] '%s': hash bucket reference %zu out of bounds\n"), + idx, section_name (ebl, idx), cnt - 2); ++ } + + for (; cnt < 2 + nbucket + nchain; ++cnt) +- if (((Elf32_Word *) data->d_buf)[cnt] >= maxidx) ++ { ++ if (buf + cnt >= end) ++ break; ++ else if (buf[cnt] >= maxidx) + ERROR (gettext ("\ + section [%2d] '%s': hash chain reference %zu out of bounds\n"), + idx, section_name (ebl, idx), cnt - 2 - nbucket); ++ } + } + + +@@ -1999,18 +2037,28 @@ section [%2d] '%s': hash table section i + maxidx = symsize; + } + ++ Elf64_Xword *buf = (Elf64_Xword *) data->d_buf; ++ Elf64_Xword *end = (Elf64_Xword *) ((char *) data->d_buf + shdr->sh_size); + size_t cnt; + for (cnt = 2; cnt < 2 + nbucket; ++cnt) +- if (((Elf64_Xword *) data->d_buf)[cnt] >= maxidx) ++ { ++ if (buf + cnt >= end) ++ break; ++ else if (buf[cnt] >= maxidx) + ERROR (gettext ("\ + section [%2d] '%s': hash bucket reference %zu out of bounds\n"), + idx, section_name (ebl, idx), cnt - 2); ++ } + + for (; cnt < 2 + nbucket + nchain; ++cnt) +- if (((Elf64_Xword *) data->d_buf)[cnt] >= maxidx) ++ { ++ if (buf + cnt >= end) ++ break; ++ else if (buf[cnt] >= maxidx) + ERROR (gettext ("\ + section [%2d] '%s': hash chain reference %" PRIu64 " out of bounds\n"), +- idx, section_name (ebl, idx), (uint64_t) (cnt - 2 - nbucket)); ++ idx, section_name (ebl, idx), (uint64_t) cnt - 2 - nbucket); ++ } + } + + +@@ -2035,7 +2083,7 @@ section [%2d] '%s': bitmask size not pow + if (shdr->sh_size < (4 + bitmask_words + nbuckets) * sizeof (Elf32_Word)) + { + ERROR (gettext ("\ +-section [%2d] '%s': hash table section is too small (is %ld, expected at least%ld)\n"), ++section [%2d] '%s': hash table section is too small (is %ld, expected at least %ld)\n"), + idx, section_name (ebl, idx), (long int) shdr->sh_size, + (long int) ((4 + bitmask_words + nbuckets) * sizeof (Elf32_Word))); + return; +@@ -2707,8 +2755,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. */ +- if (shdr->sh_size / shdr->sh_entsize +- != symshdr->sh_size / symshdr->sh_entsize) ++ if (shdr->sh_entsize && symshdr->sh_entsize ++ && (shdr->sh_size / shdr->sh_entsize ++ != symshdr->sh_size / symshdr->sh_entsize)) + ERROR (gettext ("\ + section [%2d] '%s' has different number of entries than symbol table [%2d] '%s'\n"), + idx, section_name (ebl, idx), +--- elfutils/src/readelf.c ++++ elfutils/src/readelf.c +@@ -1191,6 +1191,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G + Elf32_Word *grpref = (Elf32_Word *) data->d_buf; + + GElf_Sym sym_mem; ++ GElf_Sym *sym = gelf_getsym (symdata, shdr->sh_info, &sym_mem); ++ + printf ((grpref[0] & GRP_COMDAT) + ? ngettext ("\ + \nCOMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n", +@@ -1203,8 +1205,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), +- elf_strptr (ebl->elf, symshdr->sh_link, +- gelf_getsym (symdata, shdr->sh_info, &sym_mem)->st_name) ++ (sym == NULL ? NULL ++ : elf_strptr (ebl->elf, symshdr->sh_link, sym->st_name)) + ?: gettext (""), + data->d_size / sizeof (Elf32_Word) - 1); + +@@ -1355,10 +1357,12 @@ static void + handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) + { + int class = gelf_getclass (ebl->elf); +- GElf_Shdr glink; ++ GElf_Shdr glink_mem; ++ GElf_Shdr *glink; + Elf_Data *data; + size_t cnt; + size_t shstrndx; ++ size_t sh_entsize; + + /* Get the data of the section. */ + data = elf_getdata (scn, NULL); +@@ -1370,21 +1374,26 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, + error (EXIT_FAILURE, 0, + gettext ("cannot get section header string table index")); + ++ sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT); ++ ++ glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem); ++ if (glink == NULL) ++ error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"), ++ elf_ndxscn (scn)); ++ + printf (ngettext ("\ + \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", + "\ + \nDynamic segment contains %lu entries:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", +- shdr->sh_size / shdr->sh_entsize), +- (unsigned long int) (shdr->sh_size / shdr->sh_entsize), ++ shdr->sh_size / sh_entsize), ++ (unsigned long int) (shdr->sh_size / sh_entsize), + class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, + shdr->sh_offset, + (int) shdr->sh_link, +- elf_strptr (ebl->elf, shstrndx, +- gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), +- &glink)->sh_name)); ++ elf_strptr (ebl->elf, shstrndx, glink->sh_name)); + fputs_unlocked (gettext (" Type Value\n"), stdout); + +- for (cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt) ++ for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) + { + GElf_Dyn dynmem; + GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dynmem); +@@ -1533,7 +1542,8 @@ static void + handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr) + { + int class = gelf_getclass (ebl->elf); +- int nentries = shdr->sh_size / shdr->sh_entsize; ++ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_REL, 1, EV_CURRENT); ++ int nentries = shdr->sh_size / sh_entsize; + + /* Get the data of the section. */ + Elf_Data *data = elf_getdata (scn, NULL); +@@ -1719,7 +1729,8 @@ static void + handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr) + { + int class = gelf_getclass (ebl->elf); +- int nentries = shdr->sh_size / shdr->sh_entsize; ++ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELA, 1, EV_CURRENT); ++ int nentries = shdr->sh_size / sh_entsize; + + /* Get the data of the section. */ + Elf_Data *data = elf_getdata (scn, NULL); +@@ -1966,6 +1977,13 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G + error (EXIT_FAILURE, 0, + gettext ("cannot get section header string table index")); + ++ GElf_Shdr glink_mem; ++ GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), ++ &glink_mem); ++ if (glink == NULL) ++ error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"), ++ elf_ndxscn (scn)); ++ + /* Now we can compute the number of entries in the section. */ + unsigned int nsyms = data->d_size / (class == ELFCLASS32 + ? sizeof (Elf32_Sym) +@@ -1976,15 +1994,12 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G + nsyms), + (unsigned int) elf_ndxscn (scn), + elf_strptr (ebl->elf, shstrndx, shdr->sh_name), nsyms); +- GElf_Shdr glink; + printf (ngettext (" %lu local symbol String table: [%2u] '%s'\n", + " %lu local symbols String table: [%2u] '%s'\n", + shdr->sh_info), + (unsigned long int) shdr->sh_info, + (unsigned int) shdr->sh_link, +- elf_strptr (ebl->elf, shstrndx, +- gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), +- &glink)->sh_name)); ++ elf_strptr (ebl->elf, shstrndx, glink->sh_name)); + + fputs_unlocked (class == ELFCLASS32 + ? gettext ("\ +@@ -2220,7 +2235,13 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, + error (EXIT_FAILURE, 0, + gettext ("cannot get section header string table index")); + +- GElf_Shdr glink; ++ GElf_Shdr glink_mem; ++ GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), ++ &glink_mem); ++ if (glink == NULL) ++ error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"), ++ elf_ndxscn (scn)); ++ + printf (ngettext ("\ + \nVersion needs section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", + "\ +@@ -2231,9 +2252,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, + class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, + shdr->sh_offset, + (unsigned int) shdr->sh_link, +- elf_strptr (ebl->elf, shstrndx, +- gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), +- &glink)->sh_name)); ++ elf_strptr (ebl->elf, shstrndx, glink->sh_name)); + + unsigned int offset = 0; + for (int cnt = shdr->sh_info; --cnt >= 0; ) +@@ -2286,8 +2305,14 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G + error (EXIT_FAILURE, 0, + gettext ("cannot get section header string table index")); + ++ GElf_Shdr glink_mem; ++ GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), ++ &glink_mem); ++ if (glink == NULL) ++ error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"), ++ elf_ndxscn (scn)); ++ + int class = gelf_getclass (ebl->elf); +- GElf_Shdr glink; + printf (ngettext ("\ + \nVersion definition section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", + "\ +@@ -2299,9 +2324,7 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G + class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, + shdr->sh_offset, + (unsigned int) shdr->sh_link, +- elf_strptr (ebl->elf, shstrndx, +- gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), +- &glink)->sh_name)); ++ elf_strptr (ebl->elf, shstrndx, glink->sh_name)); + + unsigned int offset = 0; + for (int cnt = shdr->sh_info; --cnt >= 0; ) +@@ -2563,25 +2586,30 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, G + filename = NULL; + } + ++ GElf_Shdr glink_mem; ++ GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), ++ &glink_mem); ++ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_HALF, 1, EV_CURRENT); ++ if (glink == NULL) ++ error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"), ++ elf_ndxscn (scn)); ++ + /* Print the header. */ +- GElf_Shdr glink; + printf (ngettext ("\ + \nVersion symbols section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'", + "\ + \nVersion symbols section [%2u] '%s' contains %d entries:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'", +- shdr->sh_size / shdr->sh_entsize), ++ shdr->sh_size / sh_entsize), + (unsigned int) elf_ndxscn (scn), + elf_strptr (ebl->elf, shstrndx, shdr->sh_name), +- (int) (shdr->sh_size / shdr->sh_entsize), ++ (int) (shdr->sh_size / sh_entsize), + class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, + shdr->sh_offset, + (unsigned int) shdr->sh_link, +- elf_strptr (ebl->elf, shstrndx, +- gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), +- &glink)->sh_name)); ++ elf_strptr (ebl->elf, shstrndx, glink->sh_name)); + + /* 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) ++ for (unsigned int cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) + { + if (cnt % 2 == 0) + printf ("\n %4d:", cnt); +@@ -2630,7 +2658,17 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, + for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt) + ++counts[lengths[cnt]]; + +- GElf_Shdr glink; ++ GElf_Shdr glink_mem; ++ GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, ++ shdr->sh_link), ++ &glink_mem); ++ if (glink == NULL) ++ { ++ error (0, 0, gettext ("invalid sh_link value in section %Zu"), ++ elf_ndxscn (scn)); ++ return; ++ } ++ + 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", + "\ +@@ -2643,9 +2681,7 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, + shdr->sh_addr, + shdr->sh_offset, + (unsigned int) shdr->sh_link, +- elf_strptr (ebl->elf, shstrndx, +- gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), +- &glink)->sh_name)); ++ elf_strptr (ebl->elf, shstrndx, glink->sh_name)); + + if (extrastr != NULL) + fputs (extrastr, stdout); +@@ -2905,7 +2941,8 @@ print_liblist (Ebl *ebl) + + if (shdr != NULL && shdr->sh_type == SHT_GNU_LIBLIST) + { +- int nentries = shdr->sh_size / shdr->sh_entsize; ++ size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_LIB, 1, EV_CURRENT); ++ int nentries = shdr->sh_size / sh_entsize; + printf (ngettext ("\ + \nLibrary list section [%2zu] '%s' at offset %#0" PRIx64 " contains %d entry:\n", + "\ +@@ -4646,6 +4683,16 @@ print_debug_aranges_section (Dwfl_Module + return; + } + ++ GElf_Shdr glink_mem; ++ GElf_Shdr *glink; ++ glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem); ++ if (glink == NULL) ++ { ++ error (0, 0, gettext ("invalid sh_link value in section %Zu"), ++ elf_ndxscn (scn)); ++ return; ++ } ++ + printf (ngettext ("\ + \nDWARF section [%2zu] '%s' at offset %#" PRIx64 " contains %zu entry:\n", + "\ +--- elfutils/src/strip.c ++++ elfutils/src/strip.c +@@ -572,6 +572,11 @@ handle_elf (int fd, Elf *elf, const char + goto fail_close; + } + ++ if (shstrndx >= shnum) ++ goto illformed; ++ ++#define elf_assert(test) do { if (!(test)) goto illformed; } while (0) ++ + /* Storage for section information. We leave room for two more + entries since we unconditionally create a section header string + table. Maybe some weird tool created an ELF file without one. +@@ -593,7 +598,7 @@ handle_elf (int fd, Elf *elf, const char + { + /* This should always be true (i.e., there should not be any + holes in the numbering). */ +- assert (elf_ndxscn (scn) == cnt); ++ elf_assert (elf_ndxscn (scn) == cnt); + + shdr_info[cnt].scn = scn; + +@@ -606,6 +611,7 @@ handle_elf (int fd, Elf *elf, const char + shdr_info[cnt].shdr.sh_name); + if (shdr_info[cnt].name == NULL) + { ++ illformed: + error (0, 0, gettext ("illformed file '%s'"), fname); + goto fail_close; + } +@@ -615,6 +621,8 @@ handle_elf (int fd, Elf *elf, const char + + /* Remember the shdr.sh_link value. */ + shdr_info[cnt].old_sh_link = shdr_info[cnt].shdr.sh_link; ++ if (shdr_info[cnt].old_sh_link >= shnum) ++ goto illformed; + + /* Sections in files other than relocatable object files which + are not loaded can be freely moved by us. In relocatable +@@ -627,7 +635,7 @@ handle_elf (int fd, Elf *elf, const char + appropriate reference. */ + if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB_SHNDX)) + { +- assert (shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx == 0); ++ elf_assert (shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx == 0); + shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx = cnt; + } + else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GROUP)) +@@ -644,7 +652,12 @@ handle_elf (int fd, Elf *elf, const char + for (inner = 1; + inner < shdr_info[cnt].data->d_size / sizeof (Elf32_Word); + ++inner) ++ { ++ if (grpref[inner] < shnum) + shdr_info[grpref[inner]].group_idx = cnt; ++ else ++ goto illformed; ++ } + + if (inner == 1 || (inner == 2 && (grpref[0] & GRP_COMDAT) == 0)) + /* If the section group contains only one element and this +@@ -655,7 +668,7 @@ handle_elf (int fd, Elf *elf, const char + } + else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GNU_versym)) + { +- assert (shdr_info[shdr_info[cnt].shdr.sh_link].version_idx == 0); ++ elf_assert (shdr_info[shdr_info[cnt].shdr.sh_link].version_idx == 0); + shdr_info[shdr_info[cnt].shdr.sh_link].version_idx = cnt; + } + +@@ -663,7 +676,7 @@ handle_elf (int fd, Elf *elf, const char + discarded right away. */ + if ((shdr_info[cnt].shdr.sh_flags & SHF_GROUP) != 0) + { +- assert (shdr_info[cnt].group_idx != 0); ++ elf_assert (shdr_info[cnt].group_idx != 0); + + if (shdr_info[shdr_info[cnt].group_idx].idx == 0) + { +@@ -739,10 +752,14 @@ handle_elf (int fd, Elf *elf, const char + { + /* If a relocation section is marked as being removed make + sure the section it is relocating is removed, too. */ +- if ((shdr_info[cnt].shdr.sh_type == SHT_REL ++ if (shdr_info[cnt].shdr.sh_type == SHT_REL + || shdr_info[cnt].shdr.sh_type == SHT_RELA) +- && shdr_info[shdr_info[cnt].shdr.sh_info].idx != 0) +- shdr_info[cnt].idx = 1; ++ { ++ if (shdr_info[cnt].shdr.sh_info >= shnum) ++ goto illformed; ++ else if (shdr_info[shdr_info[cnt].shdr.sh_info].idx != 0) ++ shdr_info[cnt].idx = 1; ++ } + + /* If a group section is marked as being removed make + sure all the sections it contains are being removed, too. */ +@@ -786,7 +803,7 @@ handle_elf (int fd, Elf *elf, const char + if (shdr_info[cnt].symtab_idx != 0 + && shdr_info[shdr_info[cnt].symtab_idx].data == NULL) + { +- assert (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB); ++ elf_assert (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB); + + shdr_info[shdr_info[cnt].symtab_idx].data + = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn, +@@ -826,6 +843,9 @@ handle_elf (int fd, Elf *elf, const char + else if (scnidx == SHN_XINDEX) + scnidx = xndx; + ++ if (scnidx >= shnum) ++ goto illformed; ++ + if (shdr_info[scnidx].idx == 0) + /* This symbol table has a real symbol in + a discarded section. So preserve the +@@ -856,12 +876,16 @@ handle_elf (int fd, Elf *elf, const char + } + + /* Handle references through sh_info. */ +- if (SH_INFO_LINK_P (&shdr_info[cnt].shdr) +- && shdr_info[shdr_info[cnt].shdr.sh_info].idx == 0) ++ if (SH_INFO_LINK_P (&shdr_info[cnt].shdr)) ++ { ++ if (shdr_info[cnt].shdr.sh_info >= shnum) ++ goto illformed; ++ else if ( shdr_info[shdr_info[cnt].shdr.sh_info].idx == 0) + { + shdr_info[shdr_info[cnt].shdr.sh_info].idx = 1; + changes |= shdr_info[cnt].shdr.sh_info < cnt; + } ++ } + + /* Mark the section as investigated. */ + shdr_info[cnt].idx = 2; +@@ -1002,7 +1026,7 @@ handle_elf (int fd, Elf *elf, const char + error (EXIT_FAILURE, 0, gettext ("while generating output file: %s"), + elf_errmsg (-1)); + +- assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx); ++ elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx); + + /* Add this name to the section header string table. */ + shdr_info[cnt].se = ebl_strtabadd (shst, shdr_info[cnt].name, 0); +@@ -1039,7 +1063,7 @@ handle_elf (int fd, Elf *elf, const char + error (EXIT_FAILURE, 0, + gettext ("while create section header section: %s"), + elf_errmsg (-1)); +- assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx); ++ elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx); + + shdr_info[cnt].data = elf_newdata (shdr_info[cnt].newscn); + if (shdr_info[cnt].data == NULL) +@@ -1095,7 +1119,7 @@ handle_elf (int fd, Elf *elf, const char + error (EXIT_FAILURE, 0, + gettext ("while create section header section: %s"), + elf_errmsg (-1)); +- assert (elf_ndxscn (shdr_info[cnt].newscn) == idx); ++ elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == idx); + + /* Finalize the string table and fill in the correct indices in the + section headers. */ +@@ -1185,20 +1209,20 @@ handle_elf (int fd, Elf *elf, const char + shndxdata = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn, + NULL); + +- assert ((versiondata->d_size / sizeof (Elf32_Word)) ++ elf_assert ((versiondata->d_size / sizeof (Elf32_Word)) + >= shdr_info[cnt].data->d_size / elsize); + } + + if (shdr_info[cnt].version_idx != 0) + { +- assert (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM); ++ elf_assert (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM); + /* This section has associated version + information. We have to modify that + information, too. */ + versiondata = elf_getdata (shdr_info[shdr_info[cnt].version_idx].scn, + NULL); + +- assert ((versiondata->d_size / sizeof (GElf_Versym)) ++ elf_assert ((versiondata->d_size / sizeof (GElf_Versym)) + >= shdr_info[cnt].data->d_size / elsize); + } + +@@ -1253,7 +1277,7 @@ handle_elf (int fd, Elf *elf, const char + sec = shdr_info[sym->st_shndx].idx; + else + { +- assert (shndxdata != NULL); ++ elf_assert (shndxdata != NULL); + + sec = shdr_info[xshndx].idx; + } +@@ -1274,7 +1298,7 @@ handle_elf (int fd, Elf *elf, const char + nxshndx = sec; + } + +- assert (sec < SHN_LORESERVE || shndxdata != NULL); ++ elf_assert (sec < SHN_LORESERVE || shndxdata != NULL); + + if ((inner != destidx || nshndx != sym->st_shndx + || (shndxdata != NULL && nxshndx != xshndx)) +@@ -1301,9 +1325,11 @@ handle_elf (int fd, Elf *elf, const char + { + size_t sidx = (sym->st_shndx != SHN_XINDEX + ? sym->st_shndx : xshndx); +- assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION +- || (shdr_info[sidx].shdr.sh_type == SHT_GROUP +- && shdr_info[sidx].shdr.sh_info == inner)); ++ elf_assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION ++ || ((shdr_info[sidx].shdr.sh_type ++ == SHT_GROUP) ++ && (shdr_info[sidx].shdr.sh_info ++ == inner))); + } + } + +@@ -1491,11 +1517,11 @@ handle_elf (int fd, Elf *elf, const char + { + GElf_Sym sym_mem; + GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem); +- assert (sym != NULL); ++ elf_assert (sym != NULL); + + const char *name = elf_strptr (elf, strshndx, + sym->st_name); +- assert (name != NULL); ++ elf_assert (name != NULL); + size_t hidx = elf_hash (name) % nbucket; + + if (bucket[hidx] == 0) +@@ -1514,8 +1540,8 @@ handle_elf (int fd, Elf *elf, const char + else + { + /* Alpha and S390 64-bit use 64-bit SHT_HASH entries. */ +- assert (shdr_info[cnt].shdr.sh_entsize +- == sizeof (Elf64_Xword)); ++ elf_assert (shdr_info[cnt].shdr.sh_entsize ++ == sizeof (Elf64_Xword)); + + Elf64_Xword *bucket = (Elf64_Xword *) hashd->d_buf; + +@@ -1545,11 +1571,11 @@ handle_elf (int fd, Elf *elf, const char + { + GElf_Sym sym_mem; + GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem); +- assert (sym != NULL); ++ elf_assert (sym != NULL); + + const char *name = elf_strptr (elf, strshndx, + sym->st_name); +- assert (name != NULL); ++ elf_assert (name != NULL); + size_t hidx = elf_hash (name) % nbucket; + + if (bucket[hidx] == 0) From 15902be7bcd45c10caba4ed5e6d6ac7837222bfa Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 5 Mar 2013 19:55:35 +0200 Subject: [PATCH 3/8] slang: fix install --- packages/devel/slang/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devel/slang/install b/packages/devel/slang/install index 88672f35f5..420329f195 100755 --- a/packages/devel/slang/install +++ b/packages/devel/slang/install @@ -23,4 +23,4 @@ . config/options $1 mkdir -p $INSTALL/usr/lib/ - cp -PR $PKG_BUILD/src/elfobjs/libslang.so* $INSTALL/usr/lib/ + cp -PR $PKG_BUILD/src/*/libslang.so* $INSTALL/usr/lib/ From 87c051620d0bae319a5b150e0198a95456ec2f41 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 5 Mar 2013 19:02:01 +0100 Subject: [PATCH 4/8] elfutils: build for target, fix build Signed-off-by: Stephan Raue --- packages/{toolchain => }/devel/elfutils/build | 23 +- packages/{toolchain => }/devel/elfutils/meta | 10 +- .../patches/bk/elfutils-02-argp-support.patch | 92 + .../patches/bk/elfutils-03-memcpy-def.patch | 24 + .../elfutils/patches/bk/elfutils-04-fts.patch | 1307 +++++++++++++ .../patches/elfutils-00-portability.patch | 1684 +++++++++++++++++ .../patches/elfutils-00-robustify.patch} | 291 ++- .../patches/elfutils-no_textrel_check.patch | 77 + .../patches/elfutils-only_libdw_libelf.patch | 26 + ...ils-0.153-dwfl_segment_report_module.patch | 45 - 10 files changed, 3368 insertions(+), 211 deletions(-) rename packages/{toolchain => }/devel/elfutils/build (76%) rename packages/{toolchain => }/devel/elfutils/meta (92%) create mode 100644 packages/devel/elfutils/patches/bk/elfutils-02-argp-support.patch create mode 100644 packages/devel/elfutils/patches/bk/elfutils-03-memcpy-def.patch create mode 100644 packages/devel/elfutils/patches/bk/elfutils-04-fts.patch create mode 100644 packages/devel/elfutils/patches/elfutils-00-portability.patch rename packages/{toolchain/devel/elfutils/patches/elfutils-0.153-robustify.patch => devel/elfutils/patches/elfutils-00-robustify.patch} (87%) create mode 100644 packages/devel/elfutils/patches/elfutils-no_textrel_check.patch create mode 100644 packages/devel/elfutils/patches/elfutils-only_libdw_libelf.patch delete mode 100644 packages/toolchain/devel/elfutils/patches/elfutils-0.153-dwfl_segment_report_module.patch diff --git a/packages/toolchain/devel/elfutils/build b/packages/devel/elfutils/build similarity index 76% rename from packages/toolchain/devel/elfutils/build rename to packages/devel/elfutils/build index 0af3d0a2dd..6075bc06f5 100755 --- a/packages/toolchain/devel/elfutils/build +++ b/packages/devel/elfutils/build @@ -22,18 +22,17 @@ . config/options $1 -setup_toolchain host +strip_lto cd $PKG_BUILD -mkdir -p objdir && cd objdir -../configure --host=$HOST_NAME \ - --build=$HOST_NAME \ - --target=$TARGET_NAME \ - --prefix=$ROOT/$TOOLCHAIN \ - --program-prefix=eu_ \ - --with-zlib \ - --without-bzlib \ - --with-lzma \ +./configure --host=$TARGET_NAME \ + --build=$HOST_NAME \ + --prefix=/usr \ + --disable-werror \ + --disable-progs \ + --with-zlib \ + --without-bzlib \ + --without-lzma \ -make -make install +make V=1 +$MAKEINSTALL diff --git a/packages/toolchain/devel/elfutils/meta b/packages/devel/elfutils/meta similarity index 92% rename from packages/toolchain/devel/elfutils/meta rename to packages/devel/elfutils/meta index 643b6fa25a..112be36013 100644 --- a/packages/toolchain/devel/elfutils/meta +++ b/packages/devel/elfutils/meta @@ -19,18 +19,18 @@ ################################################################################ PKG_NAME="elfutils" -PKG_VERSION="0.153" +PKG_VERSION="0.155" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://fedorahosted.org/elfutils/" PKG_URL="https://fedorahosted.org/releases/e/l/elfutils/$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.bz2" -PKG_DEPENDS="" -PKG_BUILD_DEPENDS="ccache bison flex zlib-host xz" +PKG_DEPENDS="zlib" +PKG_BUILD_DEPENDS="toolchain zlib" PKG_PRIORITY="optional" -PKG_SECTION="toolchain/devel" +PKG_SECTION="devel" PKG_SHORTDESC="elfutils: collection of utilities to handle ELF objects" PKG_LONGDESC="Elfutils is a collection of utilities, including eu-ld (a linker), eu-nm (for listing symbols from object files), eu-size (for listing the section sizes of an object or archive file), eu-strip (for discarding symbols), eu-readelf (to see the raw ELF file structures), and eu-elflint (to check for well-formed ELF files)." PKG_IS_ADDON="no" -PKG_AUTORECONF="no" +PKG_AUTORECONF="yes" diff --git a/packages/devel/elfutils/patches/bk/elfutils-02-argp-support.patch b/packages/devel/elfutils/patches/bk/elfutils-02-argp-support.patch new file mode 100644 index 0000000000..f81ac8f9fa --- /dev/null +++ b/packages/devel/elfutils/patches/bk/elfutils-02-argp-support.patch @@ -0,0 +1,92 @@ +Allow the usage of an external implementation of the argp functions + +uClibc lack the argp family of functions that glibc has. Therefore, we +add a check in the configure script to see if argp_parse is available +in the C library. If not, we look if it is available in the additional +'argp' library. If so, we link against that library. If not, we error +out. + +This allows to build elfutils against uClibc with an external argp +library. + +Signed-off-by: Thomas Petazzoni + +Index: b/configure.ac +=================================================================== +--- a/configure.ac ++++ b/configure.ac +@@ -269,6 +269,13 @@ + enable_progs=yes) + AM_CONDITIONAL(ENABLE_PROGS, test "$enable_progs" = yes) + ++AC_CHECK_FUNC([argp_parse]) ++if test "$ac_cv_func_argp_parse" != yes; then ++ AC_CHECK_LIB([argp],[argp_parse],ARGP_LIBS=-largp, ++ AC_MSG_ERROR([No argp_parse function available.])) ++fi ++AC_SUBST(ARGP_LIBS) ++ + dnl Test for zlib and bzlib, gives ZLIB/BZLIB .am + dnl conditional and config.h USE_ZLIB/USE_BZLIB #define. + save_LIBS="$LIBS" +Index: b/src/Makefile.am +=================================================================== +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -98,26 +98,29 @@ + # Buggy old compilers. + readelf_no_Werror = yes + +-readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl ++readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl \ ++ $(ARGP_LIBS) + nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl \ +- $(demanglelib) +-size_LDADD = $(libelf) $(libeu) $(libmudflap) +-strip_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl +-ld_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl ++ $(demanglelib) $(ARGP_LIBS) ++size_LDADD = $(libelf) $(libeu) $(libmudflap) $(ARGP_LIBS) ++strip_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl $(ARGP_LIBS) ++ld_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl $(ARGP_LIBS) + if NATIVE_LD + # -ldl is always needed for libebl. + ld_LDADD += libld_elf.a + endif + ld_LDFLAGS = -rdynamic +-elflint_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl +-findtextrel_LDADD = $(libdw) $(libelf) $(libmudflap) +-addr2line_LDADD = $(libdw) $(libelf) $(libmudflap) +-elfcmp_LDADD = $(libebl) $(libelf) $(libmudflap) -ldl +-objdump_LDADD = $(libasm) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl +-ranlib_LDADD = libar.a $(libelf) $(libeu) $(libmudflap) +-strings_LDADD = $(libelf) $(libeu) $(libmudflap) +-ar_LDADD = libar.a $(libelf) $(libeu) $(libmudflap) +-unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(libmudflap) -ldl ++elflint_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl $(ARGP_LIBS) ++findtextrel_LDADD = $(libdw) $(libelf) $(libmudflap) $(ARGP_LIBS) ++addr2line_LDADD = $(libdw) $(libelf) $(libmudflap) $(ARGP_LIBS) ++elfcmp_LDADD = $(libebl) $(libelf) $(libmudflap) -ldl $(ARGP_LIBS) ++objdump_LDADD = $(libasm) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl \ ++ $(ARGP_LIBS) ++ranlib_LDADD = libar.a $(libelf) $(libeu) $(libmudflap) $(ARGP_LIBS) ++strings_LDADD = $(libelf) $(libeu) $(libmudflap) $(ARGP_LIBS) ++ar_LDADD = libar.a $(libelf) $(libeu) $(libmudflap) $(ARGP_LIBS) ++unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(libmudflap) -ldl \ ++ $(ARGP_LIBS) + + ldlex.o: ldscript.c + ldlex_no_Werror = yes +Index: b/libdw/Makefile.am +=================================================================== +--- a/libdw/Makefile.am ++++ b/libdw/Makefile.am +@@ -111,7 +111,7 @@ + -Wl,--enable-new-dtags,-rpath,$(pkglibdir) \ + -Wl,--version-script,$<,--no-undefined \ + -Wl,--whole-archive $(filter-out $<,$^) -Wl,--no-whole-archive\ +- -ldl $(zip_LIBS) ++ -ldl $(zip_LIBS) $(ARGP_LIBS) + if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi + ln -fs $@ $@.$(VERSION) + diff --git a/packages/devel/elfutils/patches/bk/elfutils-03-memcpy-def.patch b/packages/devel/elfutils/patches/bk/elfutils-03-memcpy-def.patch new file mode 100644 index 0000000000..eb50cf654d --- /dev/null +++ b/packages/devel/elfutils/patches/bk/elfutils-03-memcpy-def.patch @@ -0,0 +1,24 @@ +Provide a compatibility alias __memcpy + +For some reason, libelf uses the internal glibc alias __memcpy, which +doesn't exist in uClibc. Add a manual alias so that the build can +proceed with uClibc. + +Signed-off-by: Thomas Petazzoni + +Index: b/libelf/libelf.h +=================================================================== +--- a/libelf/libelf.h ++++ b/libelf/libelf.h +@@ -34,6 +34,11 @@ + /* Get the ELF types. */ + #include + ++#ifndef _LIBC ++#ifndef __mempcpy ++#define __mempcpy mempcpy ++#endif ++#endif + + /* Known translation types. */ + typedef enum diff --git a/packages/devel/elfutils/patches/bk/elfutils-04-fts.patch b/packages/devel/elfutils/patches/bk/elfutils-04-fts.patch new file mode 100644 index 0000000000..7318236d29 --- /dev/null +++ b/packages/devel/elfutils/patches/bk/elfutils-04-fts.patch @@ -0,0 +1,1307 @@ +Add an implementation of the fts_*() functions + +The fts_*() functions are optional in uClibc, and not compiled in our +default configuration. The best option would be to migrate this +elfutils code to the nftw family of functions, but it requires quite +some work. + +So we have several options here: + + *) Enable fts_*() functions in our default uClibc configuration. Not + nice since only one package needs them (the help text of uClibc + for fts_*() functions explicitly mention that they have been added + to be able to build elfutils). + + *) Use gnulib, but it is quite heavy to setup, requires modifications + to configure.ac, and other things. + + *) Copy the fts function from uClibc into elfutils source code. This + is the solution used below. uClibc is LGPL, and elfutils is + LGPL/GPL, so there should not be any licensing issue. + +Of course, the fts_*() functions are only built if they are not +already provided by the C library. + +Signed-off-by: Thomas Petazzoni + +Index: b/configure.ac +=================================================================== +--- a/configure.ac ++++ b/configure.ac +@@ -276,6 +276,10 @@ + fi + AC_SUBST(ARGP_LIBS) + ++AC_CHECK_HEADER([fts.h], ++ AC_DEFINE([HAVE_FTS_H], [], [Define if is available in C library])) ++AM_CONDITIONAL(HAVE_FTS, test "$ac_cv_header_fts_h" = yes) ++ + dnl Test for zlib and bzlib, gives ZLIB/BZLIB .am + dnl conditional and config.h USE_ZLIB/USE_BZLIB #define. + save_LIBS="$LIBS" +Index: b/libdwfl/Makefile.am +=================================================================== +--- a/libdwfl/Makefile.am ++++ b/libdwfl/Makefile.am +@@ -79,6 +79,9 @@ + if LZMA + libdwfl_a_SOURCES += lzma.c + endif ++if !HAVE_FTS ++libdwfl_a_SOURCES += fts.c ++endif + + if MUDFLAP + libdwfl = libdwfl.a $(libdw) $(libebl) $(libelf) $(libeu) +Index: b/libdwfl/fts.c +=================================================================== +--- /dev/null ++++ b/libdwfl/fts.c +@@ -0,0 +1,1095 @@ ++/*- ++ * Copyright (c) 1990, 1993, 1994 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 4. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include "fts_.h" ++#include ++#include ++#include ++ ++/* Largest alignment size needed, minus one. ++ Usually long double is the worst case. */ ++#ifndef ALIGNBYTES ++#define ALIGNBYTES (__alignof__ (long double) - 1) ++#endif ++/* Align P to that size. */ ++#ifndef ALIGN ++#define ALIGN(p) (((unsigned long int) (p) + ALIGNBYTES) & ~ALIGNBYTES) ++#endif ++ ++ ++static FTSENT *fts_alloc (FTS *, const char *, size_t); ++static FTSENT *fts_build (FTS *, int); ++static void fts_lfree (FTSENT *); ++static void fts_load (FTS *, FTSENT *); ++static size_t fts_maxarglen (char * const *); ++static void fts_padjust (FTS *, FTSENT *); ++static int fts_palloc (FTS *, size_t); ++static FTSENT *fts_sort (FTS *, FTSENT *, int); ++static u_short fts_stat (FTS *, FTSENT *, int); ++static int fts_safe_changedir (FTS *, FTSENT *, int, const char *); ++ ++#ifndef MAX ++#define MAX(a, b) ({ __typeof__ (a) _a = (a); \ ++ __typeof__ (b) _b = (b); \ ++ _a > _b ? _a : _b; }) ++#endif ++ ++#define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2]))) ++ ++#define CLR(opt) (sp->fts_options &= ~(opt)) ++#define ISSET(opt) (sp->fts_options & (opt)) ++#define SET(opt) (sp->fts_options |= (opt)) ++ ++#define FCHDIR(sp, fd) (!ISSET(FTS_NOCHDIR) && fchdir(fd)) ++ ++/* fts_build flags */ ++#define BCHILD 1 /* fts_children */ ++#define BNAMES 2 /* fts_children, names only */ ++#define BREAD 3 /* fts_read */ ++ ++FTS * ++fts_open( char * const *argv, register int options, ++ int (*compar) (const FTSENT **, const FTSENT **)) ++{ ++ register FTS *sp; ++ register FTSENT *p, *root; ++ register int nitems; ++ FTSENT *parent = NULL; ++ FTSENT *tmp = NULL; ++ ++ /* Options check. */ ++ if (options & ~FTS_OPTIONMASK) { ++ errno = EINVAL; ++ return (NULL); ++ } ++ ++ /* Allocate/initialize the stream */ ++ if ((sp = malloc((u_int)sizeof(FTS))) == NULL) ++ return (NULL); ++ memset(sp, 0, sizeof(FTS)); ++ sp->fts_compar = (int (*) (const void *, const void *)) compar; ++ sp->fts_options = options; ++ ++ /* Logical walks turn on NOCHDIR; symbolic links are too hard. */ ++ if (ISSET(FTS_LOGICAL)) ++ SET(FTS_NOCHDIR); ++ ++ /* ++ * Start out with 1K of path space, and enough, in any case, ++ * to hold the user's paths. ++ */ ++#ifndef MAXPATHLEN ++#define MAXPATHLEN 1024 ++#endif ++ size_t maxarglen = fts_maxarglen(argv); ++ if (fts_palloc(sp, MAX(maxarglen, MAXPATHLEN))) ++ goto mem1; ++ ++ /* Allocate/initialize root's parent. */ ++ if (*argv != NULL) { ++ if ((parent = fts_alloc(sp, "", 0)) == NULL) ++ goto mem2; ++ parent->fts_level = FTS_ROOTPARENTLEVEL; ++ } ++ ++ /* Allocate/initialize root(s). */ ++ for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) { ++ /* Don't allow zero-length paths. */ ++ size_t len = strlen(*argv); ++ if (len == 0) { ++ errno = ENOENT; ++ goto mem3; ++ } ++ ++ p = fts_alloc(sp, *argv, len); ++ p->fts_level = FTS_ROOTLEVEL; ++ p->fts_parent = parent; ++ p->fts_accpath = p->fts_name; ++ p->fts_info = fts_stat(sp, p, ISSET(FTS_COMFOLLOW)); ++ ++ /* Command-line "." and ".." are real directories. */ ++ if (p->fts_info == FTS_DOT) ++ p->fts_info = FTS_D; ++ ++ /* ++ * If comparison routine supplied, traverse in sorted ++ * order; otherwise traverse in the order specified. ++ */ ++ if (compar) { ++ p->fts_link = root; ++ root = p; ++ } else { ++ p->fts_link = NULL; ++ if (root == NULL) ++ tmp = root = p; ++ else { ++ tmp->fts_link = p; ++ tmp = p; ++ } ++ } ++ } ++ if (compar && nitems > 1) ++ root = fts_sort(sp, root, nitems); ++ ++ /* ++ * Allocate a dummy pointer and make fts_read think that we've just ++ * finished the node before the root(s); set p->fts_info to FTS_INIT ++ * so that everything about the "current" node is ignored. ++ */ ++ if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL) ++ goto mem3; ++ sp->fts_cur->fts_link = root; ++ sp->fts_cur->fts_info = FTS_INIT; ++ ++ /* ++ * If using chdir(2), grab a file descriptor pointing to dot to ensure ++ * that we can get back here; this could be avoided for some paths, ++ * but almost certainly not worth the effort. Slashes, symbolic links, ++ * and ".." are all fairly nasty problems. Note, if we can't get the ++ * descriptor we run anyway, just more slowly. ++ */ ++ if (!ISSET(FTS_NOCHDIR) ++ && (sp->fts_rfd = open(".", O_RDONLY, 0)) < 0) ++ SET(FTS_NOCHDIR); ++ ++ return (sp); ++ ++mem3: fts_lfree(root); ++ free(parent); ++mem2: free(sp->fts_path); ++mem1: free(sp); ++ return (NULL); ++} ++ ++static void ++fts_load(FTS *sp, register FTSENT *p) ++{ ++ register int len; ++ register char *cp; ++ ++ /* ++ * Load the stream structure for the next traversal. Since we don't ++ * actually enter the directory until after the preorder visit, set ++ * the fts_accpath field specially so the chdir gets done to the right ++ * place and the user can access the first node. From fts_open it's ++ * known that the path will fit. ++ */ ++ len = p->fts_pathlen = p->fts_namelen; ++ memmove(sp->fts_path, p->fts_name, len + 1); ++ if ((cp = strrchr(p->fts_name, '/')) && (cp != p->fts_name || cp[1])) { ++ len = strlen(++cp); ++ memmove(p->fts_name, cp, len + 1); ++ p->fts_namelen = len; ++ } ++ p->fts_accpath = p->fts_path = sp->fts_path; ++ sp->fts_dev = p->fts_dev; ++} ++ ++int ++fts_close(FTS *sp) ++{ ++ register FTSENT *freep, *p; ++ int saved_errno; ++ ++ /* ++ * This still works if we haven't read anything -- the dummy structure ++ * points to the root list, so we step through to the end of the root ++ * list which has a valid parent pointer. ++ */ ++ if (sp->fts_cur) { ++ for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) { ++ freep = p; ++ p = p->fts_link != NULL ? p->fts_link : p->fts_parent; ++ free(freep); ++ } ++ free(p); ++ } ++ ++ /* Free up child linked list, sort array, path buffer. */ ++ if (sp->fts_child) ++ fts_lfree(sp->fts_child); ++ free(sp->fts_array); ++ free(sp->fts_path); ++ ++ /* Return to original directory, save errno if necessary. */ ++ if (!ISSET(FTS_NOCHDIR)) { ++ saved_errno = fchdir(sp->fts_rfd) ? errno : 0; ++ (void)close(sp->fts_rfd); ++ ++ /* Set errno and return. */ ++ if (saved_errno != 0) { ++ /* Free up the stream pointer. */ ++ free(sp); ++ errno = saved_errno; ++ return (-1); ++ } ++ } ++ ++ /* Free up the stream pointer. */ ++ free(sp); ++ return (0); ++} ++ ++/* ++ * Special case of "/" at the end of the path so that slashes aren't ++ * appended which would cause paths to be written as "....//foo". ++ */ ++#define NAPPEND(p) \ ++ (p->fts_path[p->fts_pathlen - 1] == '/' \ ++ ? p->fts_pathlen - 1 : p->fts_pathlen) ++ ++FTSENT * ++fts_read(register FTS *sp) ++{ ++ register FTSENT *p, *tmp; ++ register int instr; ++ register char *t; ++ int saved_errno; ++ ++ /* If finished or unrecoverable error, return NULL. */ ++ if (sp->fts_cur == NULL || ISSET(FTS_STOP)) ++ return (NULL); ++ ++ /* Set current node pointer. */ ++ p = sp->fts_cur; ++ ++ /* Save and zero out user instructions. */ ++ instr = p->fts_instr; ++ p->fts_instr = FTS_NOINSTR; ++ ++ /* Any type of file may be re-visited; re-stat and re-turn. */ ++ if (instr == FTS_AGAIN) { ++ p->fts_info = fts_stat(sp, p, 0); ++ return (p); ++ } ++ ++ /* ++ * Following a symlink -- SLNONE test allows application to see ++ * SLNONE and recover. If indirecting through a symlink, have ++ * keep a pointer to current location. If unable to get that ++ * pointer, follow fails. ++ */ ++ if (instr == FTS_FOLLOW && ++ (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) { ++ p->fts_info = fts_stat(sp, p, 1); ++ if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) { ++ if ((p->fts_symfd = open(".", O_RDONLY, 0)) < 0) { ++ p->fts_errno = errno; ++ p->fts_info = FTS_ERR; ++ } else ++ p->fts_flags |= FTS_SYMFOLLOW; ++ } ++ return (p); ++ } ++ ++ /* Directory in pre-order. */ ++ if (p->fts_info == FTS_D) { ++ /* If skipped or crossed mount point, do post-order visit. */ ++ if (instr == FTS_SKIP || ++ (ISSET(FTS_XDEV) && p->fts_dev != sp->fts_dev)) { ++ if (p->fts_flags & FTS_SYMFOLLOW) ++ (void)close(p->fts_symfd); ++ if (sp->fts_child) { ++ fts_lfree(sp->fts_child); ++ sp->fts_child = NULL; ++ } ++ p->fts_info = FTS_DP; ++ return (p); ++ } ++ ++ /* Rebuild if only read the names and now traversing. */ ++ if (sp->fts_child != NULL && ISSET(FTS_NAMEONLY)) { ++ CLR(FTS_NAMEONLY); ++ fts_lfree(sp->fts_child); ++ sp->fts_child = NULL; ++ } ++ ++ /* ++ * Cd to the subdirectory. ++ * ++ * If have already read and now fail to chdir, whack the list ++ * to make the names come out right, and set the parent errno ++ * so the application will eventually get an error condition. ++ * Set the FTS_DONTCHDIR flag so that when we logically change ++ * directories back to the parent we don't do a chdir. ++ * ++ * If haven't read do so. If the read fails, fts_build sets ++ * FTS_STOP or the fts_info field of the node. ++ */ ++ if (sp->fts_child != NULL) { ++ if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) { ++ p->fts_errno = errno; ++ p->fts_flags |= FTS_DONTCHDIR; ++ for (p = sp->fts_child; p != NULL; ++ p = p->fts_link) ++ p->fts_accpath = ++ p->fts_parent->fts_accpath; ++ } ++ } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) { ++ if (ISSET(FTS_STOP)) ++ return (NULL); ++ return (p); ++ } ++ p = sp->fts_child; ++ sp->fts_child = NULL; ++ sp->fts_cur = p; ++ goto name; ++ } ++ ++ /* Move to the next node on this level. */ ++next: tmp = p; ++ if ((p = p->fts_link) != NULL) { ++ sp->fts_cur = p; ++ free(tmp); ++ ++ /* ++ * If reached the top, return to the original directory (or ++ * the root of the tree), and load the paths for the next root. ++ */ ++ if (p->fts_level == FTS_ROOTLEVEL) { ++ if (FCHDIR(sp, sp->fts_rfd)) { ++ SET(FTS_STOP); ++ return (NULL); ++ } ++ fts_load(sp, p); ++ return p; ++ } ++ ++ /* ++ * User may have called fts_set on the node. If skipped, ++ * ignore. If followed, get a file descriptor so we can ++ * get back if necessary. ++ */ ++ if (p->fts_instr == FTS_SKIP) ++ goto next; ++ if (p->fts_instr == FTS_FOLLOW) { ++ p->fts_info = fts_stat(sp, p, 1); ++ if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) { ++ if ((p->fts_symfd = ++ open(".", O_RDONLY, 0)) < 0) { ++ p->fts_errno = errno; ++ p->fts_info = FTS_ERR; ++ } else ++ p->fts_flags |= FTS_SYMFOLLOW; ++ } ++ p->fts_instr = FTS_NOINSTR; ++ } ++ ++name: t = sp->fts_path + NAPPEND(p->fts_parent); ++ *t++ = '/'; ++ memmove(t, p->fts_name, p->fts_namelen + 1); ++ return p; ++ } ++ ++ /* Move up to the parent node. */ ++ p = tmp->fts_parent; ++ sp->fts_cur = p; ++ free(tmp); ++ ++ if (p->fts_level == FTS_ROOTPARENTLEVEL) { ++ /* ++ * Done; free everything up and set errno to 0 so the user ++ * can distinguish between error and EOF. ++ */ ++ free(p); ++ errno = 0; ++ return (sp->fts_cur = NULL); ++ } ++ ++ /* NUL terminate the pathname. */ ++ sp->fts_path[p->fts_pathlen] = '\0'; ++ ++ /* ++ * Return to the parent directory. If at a root node or came through ++ * a symlink, go back through the file descriptor. Otherwise, cd up ++ * one directory. ++ */ ++ if (p->fts_level == FTS_ROOTLEVEL) { ++ if (FCHDIR(sp, sp->fts_rfd)) { ++ SET(FTS_STOP); ++ return (NULL); ++ } ++ } else if (p->fts_flags & FTS_SYMFOLLOW) { ++ if (FCHDIR(sp, p->fts_symfd)) { ++ saved_errno = errno; ++ (void)close(p->fts_symfd); ++ errno = saved_errno; ++ SET(FTS_STOP); ++ return (NULL); ++ } ++ (void)close(p->fts_symfd); ++ } else if (!(p->fts_flags & FTS_DONTCHDIR) && ++ fts_safe_changedir(sp, p->fts_parent, -1, "..")) { ++ SET(FTS_STOP); ++ return (NULL); ++ } ++ p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP; ++ return p; ++} ++ ++/* ++ * Fts_set takes the stream as an argument although it's not used in this ++ * implementation; it would be necessary if anyone wanted to add global ++ * semantics to fts using fts_set. An error return is allowed for similar ++ * reasons. ++ */ ++/* ARGSUSED */ ++int ++fts_set(FTS *sp, FTSENT *p, int instr) ++{ ++ if (instr != 0 && instr != FTS_AGAIN && instr != FTS_FOLLOW && ++ instr != FTS_NOINSTR && instr != FTS_SKIP) { ++ errno = EINVAL; ++ return (1); ++ } ++ p->fts_instr = instr; ++ return (0); ++} ++ ++FTSENT * ++fts_children(register FTS *sp, int instr) ++{ ++ register FTSENT *p; ++ int fd; ++ ++ if (instr != 0 && instr != FTS_NAMEONLY) { ++ errno = EINVAL; ++ return (NULL); ++ } ++ ++ /* Set current node pointer. */ ++ p = sp->fts_cur; ++ ++ /* ++ * Errno set to 0 so user can distinguish empty directory from ++ * an error. ++ */ ++ errno = 0; ++ ++ /* Fatal errors stop here. */ ++ if (ISSET(FTS_STOP)) ++ return (NULL); ++ ++ /* Return logical hierarchy of user's arguments. */ ++ if (p->fts_info == FTS_INIT) ++ return (p->fts_link); ++ ++ /* ++ * If not a directory being visited in pre-order, stop here. Could ++ * allow FTS_DNR, assuming the user has fixed the problem, but the ++ * same effect is available with FTS_AGAIN. ++ */ ++ if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */) ++ return (NULL); ++ ++ /* Free up any previous child list. */ ++ if (sp->fts_child != NULL) ++ fts_lfree(sp->fts_child); ++ ++ if (instr == FTS_NAMEONLY) { ++ SET(FTS_NAMEONLY); ++ instr = BNAMES; ++ } else ++ instr = BCHILD; ++ ++ /* ++ * If using chdir on a relative path and called BEFORE fts_read does ++ * its chdir to the root of a traversal, we can lose -- we need to ++ * chdir into the subdirectory, and we don't know where the current ++ * directory is, so we can't get back so that the upcoming chdir by ++ * fts_read will work. ++ */ ++ if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' || ++ ISSET(FTS_NOCHDIR)) ++ return (sp->fts_child = fts_build(sp, instr)); ++ ++ if ((fd = open(".", O_RDONLY, 0)) < 0) ++ return (NULL); ++ sp->fts_child = fts_build(sp, instr); ++ if (fchdir(fd)) ++ return (NULL); ++ (void)close(fd); ++ return (sp->fts_child); ++} ++ ++/* ++ * This is the tricky part -- do not casually change *anything* in here. The ++ * idea is to build the linked list of entries that are used by fts_children ++ * and fts_read. There are lots of special cases. ++ * ++ * The real slowdown in walking the tree is the stat calls. If FTS_NOSTAT is ++ * set and it's a physical walk (so that symbolic links can't be directories), ++ * we can do things quickly. First, if it's a 4.4BSD file system, the type ++ * of the file is in the directory entry. Otherwise, we assume that the number ++ * of subdirectories in a node is equal to the number of links to the parent. ++ * The former skips all stat calls. The latter skips stat calls in any leaf ++ * directories and for any files after the subdirectories in the directory have ++ * been found, cutting the stat calls by about 2/3. ++ */ ++static FTSENT * ++fts_build(register FTS *sp, int type) ++{ ++ register struct dirent *dp; ++ register FTSENT *p, *head; ++ register int nitems; ++ FTSENT *cur, *tail; ++ DIR *dirp; ++ void *oldaddr; ++ int cderrno, descend, len, level, nlinks, saved_errno, ++ nostat, doadjust; ++ size_t maxlen; ++ char *cp; ++ ++ /* Set current node pointer. */ ++ cur = sp->fts_cur; ++ ++ /* ++ * Open the directory for reading. If this fails, we're done. ++ * If being called from fts_read, set the fts_info field. ++ */ ++#if defined FTS_WHITEOUT && 0 ++ if (ISSET(FTS_WHITEOUT)) ++ oflag = DTF_NODUP|DTF_REWIND; ++ else ++ oflag = DTF_HIDEW|DTF_NODUP|DTF_REWIND; ++#else ++# define opendir2(path, flag) opendir(path) ++#endif ++ if ((dirp = opendir2(cur->fts_accpath, oflag)) == NULL) { ++ if (type == BREAD) { ++ cur->fts_info = FTS_DNR; ++ cur->fts_errno = errno; ++ } ++ return (NULL); ++ } ++ ++ /* ++ * Nlinks is the number of possible entries of type directory in the ++ * directory if we're cheating on stat calls, 0 if we're not doing ++ * any stat calls at all, -1 if we're doing stats on everything. ++ */ ++ if (type == BNAMES) { ++ nlinks = 0; ++ /* Be quiet about nostat, GCC. */ ++ nostat = 0; ++ } else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) { ++ nlinks = cur->fts_nlink - (ISSET(FTS_SEEDOT) ? 0 : 2); ++ nostat = 1; ++ } else { ++ nlinks = -1; ++ nostat = 0; ++ } ++ ++#ifdef notdef ++ (void)printf("nlinks == %d (cur: %d)\n", nlinks, cur->fts_nlink); ++ (void)printf("NOSTAT %d PHYSICAL %d SEEDOT %d\n", ++ ISSET(FTS_NOSTAT), ISSET(FTS_PHYSICAL), ISSET(FTS_SEEDOT)); ++#endif ++ /* ++ * If we're going to need to stat anything or we want to descend ++ * and stay in the directory, chdir. If this fails we keep going, ++ * but set a flag so we don't chdir after the post-order visit. ++ * We won't be able to stat anything, but we can still return the ++ * names themselves. Note, that since fts_read won't be able to ++ * chdir into the directory, it will have to return different path ++ * names than before, i.e. "a/b" instead of "b". Since the node ++ * has already been visited in pre-order, have to wait until the ++ * post-order visit to return the error. There is a special case ++ * here, if there was nothing to stat then it's not an error to ++ * not be able to stat. This is all fairly nasty. If a program ++ * needed sorted entries or stat information, they had better be ++ * checking FTS_NS on the returned nodes. ++ */ ++ cderrno = 0; ++ if (nlinks || type == BREAD) { ++ if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) { ++ if (nlinks && type == BREAD) ++ cur->fts_errno = errno; ++ cur->fts_flags |= FTS_DONTCHDIR; ++ descend = 0; ++ cderrno = errno; ++ (void)closedir(dirp); ++ dirp = NULL; ++ } else ++ descend = 1; ++ } else ++ descend = 0; ++ ++ /* ++ * Figure out the max file name length that can be stored in the ++ * current path -- the inner loop allocates more path as necessary. ++ * We really wouldn't have to do the maxlen calculations here, we ++ * could do them in fts_read before returning the path, but it's a ++ * lot easier here since the length is part of the dirent structure. ++ * ++ * If not changing directories set a pointer so that can just append ++ * each new name into the path. ++ */ ++ len = NAPPEND(cur); ++ if (ISSET(FTS_NOCHDIR)) { ++ cp = sp->fts_path + len; ++ *cp++ = '/'; ++ } else { ++ /* GCC, you're too verbose. */ ++ cp = NULL; ++ } ++ len++; ++ maxlen = sp->fts_pathlen - len; ++ ++ level = cur->fts_level + 1; ++ ++ /* Read the directory, attaching each entry to the `link' pointer. */ ++ doadjust = 0; ++ for (head = tail = NULL, nitems = 0; dirp && (dp = readdir(dirp));) { ++ if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name)) ++ continue; ++ ++ if ((p = fts_alloc(sp, dp->d_name, _D_EXACT_NAMLEN (dp))) == NULL) ++ goto mem1; ++ if (_D_EXACT_NAMLEN (dp) >= maxlen) {/* include space for NUL */ ++ oldaddr = sp->fts_path; ++ if (fts_palloc(sp, _D_EXACT_NAMLEN (dp) + len + 1)) { ++ /* ++ * No more memory for path or structures. Save ++ * errno, free up the current structure and the ++ * structures already allocated. ++ */ ++mem1: saved_errno = errno; ++ free(p); ++ fts_lfree(head); ++ (void)closedir(dirp); ++ cur->fts_info = FTS_ERR; ++ SET(FTS_STOP); ++ errno = saved_errno; ++ return (NULL); ++ } ++ /* Did realloc() change the pointer? */ ++ if (oldaddr != sp->fts_path) { ++ doadjust = 1; ++ if (ISSET(FTS_NOCHDIR)) ++ cp = sp->fts_path + len; ++ } ++ maxlen = sp->fts_pathlen - len; ++ } ++ ++ if (len + _D_EXACT_NAMLEN (dp) >= USHRT_MAX) { ++ /* ++ * In an FTSENT, fts_pathlen is a u_short so it is ++ * possible to wraparound here. If we do, free up ++ * the current structure and the structures already ++ * allocated, then error out with ENAMETOOLONG. ++ */ ++ free(p); ++ fts_lfree(head); ++ (void)closedir(dirp); ++ cur->fts_info = FTS_ERR; ++ SET(FTS_STOP); ++ errno = ENAMETOOLONG; ++ return (NULL); ++ } ++ p->fts_level = level; ++ p->fts_parent = sp->fts_cur; ++ p->fts_pathlen = len + _D_EXACT_NAMLEN (dp); ++ ++#if defined FTS_WHITEOUT && 0 ++ if (dp->d_type == DT_WHT) ++ p->fts_flags |= FTS_ISW; ++#endif ++ ++#if 0 ++ /* Unreachable code. cderrno is only ever set to a nonnull ++ value if dirp is closed at the same time. But then we ++ cannot enter this loop. */ ++ if (cderrno) { ++ if (nlinks) { ++ p->fts_info = FTS_NS; ++ p->fts_errno = cderrno; ++ } else ++ p->fts_info = FTS_NSOK; ++ p->fts_accpath = cur->fts_accpath; ++ } else ++#endif ++ if (nlinks == 0 ++#if defined DT_DIR && defined _DIRENT_HAVE_D_TYPE ++ || (nostat && ++ dp->d_type != DT_DIR && dp->d_type != DT_UNKNOWN) ++#endif ++ ) { ++ p->fts_accpath = ++ ISSET(FTS_NOCHDIR) ? p->fts_path : p->fts_name; ++ p->fts_info = FTS_NSOK; ++ } else { ++ /* Build a file name for fts_stat to stat. */ ++ if (ISSET(FTS_NOCHDIR)) { ++ p->fts_accpath = p->fts_path; ++ memmove(cp, p->fts_name, p->fts_namelen + 1); ++ } else ++ p->fts_accpath = p->fts_name; ++ /* Stat it. */ ++ p->fts_info = fts_stat(sp, p, 0); ++ ++ /* Decrement link count if applicable. */ ++ if (nlinks > 0 && (p->fts_info == FTS_D || ++ p->fts_info == FTS_DC || p->fts_info == FTS_DOT)) ++ --nlinks; ++ } ++ ++ /* We walk in directory order so "ls -f" doesn't get upset. */ ++ p->fts_link = NULL; ++ if (head == NULL) ++ head = tail = p; ++ else { ++ tail->fts_link = p; ++ tail = p; ++ } ++ ++nitems; ++ } ++ if (dirp) ++ (void)closedir(dirp); ++ ++ /* ++ * If realloc() changed the address of the path, adjust the ++ * addresses for the rest of the tree and the dir list. ++ */ ++ if (doadjust) ++ fts_padjust(sp, head); ++ ++ /* ++ * If not changing directories, reset the path back to original ++ * state. ++ */ ++ if (ISSET(FTS_NOCHDIR)) { ++ if (len == sp->fts_pathlen || nitems == 0) ++ --cp; ++ *cp = '\0'; ++ } ++ ++ /* ++ * If descended after called from fts_children or after called from ++ * fts_read and nothing found, get back. At the root level we use ++ * the saved fd; if one of fts_open()'s arguments is a relative path ++ * to an empty directory, we wind up here with no other way back. If ++ * can't get back, we're done. ++ */ ++ if (descend && (type == BCHILD || !nitems) && ++ (cur->fts_level == FTS_ROOTLEVEL ? ++ FCHDIR(sp, sp->fts_rfd) : ++ fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) { ++ cur->fts_info = FTS_ERR; ++ SET(FTS_STOP); ++ fts_lfree(head); ++ return (NULL); ++ } ++ ++ /* If didn't find anything, return NULL. */ ++ if (!nitems) { ++ if (type == BREAD) ++ cur->fts_info = FTS_DP; ++ fts_lfree(head); ++ return (NULL); ++ } ++ ++ /* Sort the entries. */ ++ if (sp->fts_compar && nitems > 1) ++ head = fts_sort(sp, head, nitems); ++ return (head); ++} ++ ++static u_short ++fts_stat(FTS *sp, register FTSENT *p, int follow) ++{ ++ register FTSENT *t; ++ register dev_t dev; ++ register ino_t ino; ++ struct stat *sbp, sb; ++ int saved_errno; ++ ++ /* If user needs stat info, stat buffer already allocated. */ ++ sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp; ++ ++#if defined FTS_WHITEOUT && 0 ++ /* check for whiteout */ ++ if (p->fts_flags & FTS_ISW) { ++ if (sbp != &sb) { ++ memset(sbp, '\0', sizeof (*sbp)); ++ sbp->st_mode = S_IFWHT; ++ } ++ return (FTS_W); ++ } ++#endif ++ ++ /* ++ * If doing a logical walk, or application requested FTS_FOLLOW, do ++ * a stat(2). If that fails, check for a non-existent symlink. If ++ * fail, set the errno from the stat call. ++ */ ++ if (ISSET(FTS_LOGICAL) || follow) { ++ if (stat(p->fts_accpath, sbp)) { ++ saved_errno = errno; ++ if (!lstat(p->fts_accpath, sbp)) { ++ errno = 0; ++ return (FTS_SLNONE); ++ } ++ p->fts_errno = saved_errno; ++ goto err; ++ } ++ } else if (lstat(p->fts_accpath, sbp)) { ++ p->fts_errno = errno; ++err: memset(sbp, 0, sizeof(struct stat)); ++ return (FTS_NS); ++ } ++ ++ if (S_ISDIR(sbp->st_mode)) { ++ /* ++ * Set the device/inode. Used to find cycles and check for ++ * crossing mount points. Also remember the link count, used ++ * in fts_build to limit the number of stat calls. It is ++ * understood that these fields are only referenced if fts_info ++ * is set to FTS_D. ++ */ ++ dev = p->fts_dev = sbp->st_dev; ++ ino = p->fts_ino = sbp->st_ino; ++ p->fts_nlink = sbp->st_nlink; ++ ++ if (ISDOT(p->fts_name)) ++ return (FTS_DOT); ++ ++ /* ++ * Cycle detection is done by brute force when the directory ++ * is first encountered. If the tree gets deep enough or the ++ * number of symbolic links to directories is high enough, ++ * something faster might be worthwhile. ++ */ ++ for (t = p->fts_parent; ++ t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent) ++ if (ino == t->fts_ino && dev == t->fts_dev) { ++ p->fts_cycle = t; ++ return (FTS_DC); ++ } ++ return (FTS_D); ++ } ++ if (S_ISLNK(sbp->st_mode)) ++ return (FTS_SL); ++ if (S_ISREG(sbp->st_mode)) ++ return (FTS_F); ++ return (FTS_DEFAULT); ++} ++ ++static FTSENT * ++fts_sort(FTS *sp, FTSENT *head, register int nitems) ++{ ++ register FTSENT **ap, *p; ++ ++ /* ++ * Construct an array of pointers to the structures and call qsort(3). ++ * Reassemble the array in the order returned by qsort. If unable to ++ * sort for memory reasons, return the directory entries in their ++ * current order. Allocate enough space for the current needs plus ++ * 40 so don't realloc one entry at a time. ++ */ ++ if (nitems > sp->fts_nitems) { ++ struct _ftsent **a; ++ ++ sp->fts_nitems = nitems + 40; ++ if ((a = realloc(sp->fts_array, ++ (size_t)(sp->fts_nitems * sizeof(FTSENT *)))) == NULL) { ++ free(sp->fts_array); ++ sp->fts_array = NULL; ++ sp->fts_nitems = 0; ++ return (head); ++ } ++ sp->fts_array = a; ++ } ++ for (ap = sp->fts_array, p = head; p; p = p->fts_link) ++ *ap++ = p; ++ qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *), sp->fts_compar); ++ for (head = *(ap = sp->fts_array); --nitems; ++ap) ++ ap[0]->fts_link = ap[1]; ++ ap[0]->fts_link = NULL; ++ return (head); ++} ++ ++static FTSENT * ++fts_alloc(FTS *sp, const char *name, size_t namelen) ++{ ++ register FTSENT *p; ++ size_t len; ++ ++ /* ++ * The file name is a variable length array and no stat structure is ++ * necessary if the user has set the nostat bit. Allocate the FTSENT ++ * structure, the file name and the stat structure in one chunk, but ++ * be careful that the stat structure is reasonably aligned. Since the ++ * fts_name field is declared to be of size 1, the fts_name pointer is ++ * namelen + 2 before the first possible address of the stat structure. ++ */ ++ len = sizeof(FTSENT) + namelen; ++ if (!ISSET(FTS_NOSTAT)) ++ len += sizeof(struct stat) + ALIGNBYTES; ++ if ((p = malloc(len)) == NULL) ++ return (NULL); ++ ++ /* Copy the name and guarantee NUL termination. */ ++ memmove(p->fts_name, name, namelen); ++ p->fts_name[namelen] = '\0'; ++ ++ if (!ISSET(FTS_NOSTAT)) ++ p->fts_statp = (struct stat *)ALIGN(p->fts_name + namelen + 2); ++ p->fts_namelen = namelen; ++ p->fts_path = sp->fts_path; ++ p->fts_errno = 0; ++ p->fts_flags = 0; ++ p->fts_instr = FTS_NOINSTR; ++ p->fts_number = 0; ++ p->fts_pointer = NULL; ++ return (p); ++} ++ ++static void ++fts_lfree(register FTSENT *head) ++{ ++ register FTSENT *p; ++ ++ /* Free a linked list of structures. */ ++ while ((p = head)) { ++ head = head->fts_link; ++ free(p); ++ } ++} ++ ++/* ++ * Allow essentially unlimited paths; find, rm, ls should all work on any tree. ++ * Most systems will allow creation of paths much longer than MAXPATHLEN, even ++ * though the kernel won't resolve them. Add the size (not just what's needed) ++ * plus 256 bytes so don't realloc the path 2 bytes at a time. ++ */ ++static int ++fts_palloc(FTS *sp, size_t more) ++{ ++ char *p; ++ ++ sp->fts_pathlen += more + 256; ++ /* ++ * Check for possible wraparound. In an FTS, fts_pathlen is ++ * a signed int but in an FTSENT it is an unsigned short. ++ * We limit fts_pathlen to USHRT_MAX to be safe in both cases. ++ */ ++ if (sp->fts_pathlen < 0 || sp->fts_pathlen >= USHRT_MAX) { ++ free(sp->fts_path); ++ sp->fts_path = NULL; ++ errno = ENAMETOOLONG; ++ return (1); ++ } ++ p = realloc(sp->fts_path, sp->fts_pathlen); ++ if (p == NULL) { ++ free(sp->fts_path); ++ sp->fts_path = NULL; ++ return 1; ++ } ++ sp->fts_path = p; ++ return 0; ++} ++ ++/* ++ * When the path is realloc'd, have to fix all of the pointers in structures ++ * already returned. ++ */ ++static void ++fts_padjust(FTS *sp, FTSENT *head) ++{ ++ FTSENT *p; ++ char *addr = sp->fts_path; ++ ++#define ADJUST(p) do { \ ++ if ((p)->fts_accpath != (p)->fts_name) { \ ++ (p)->fts_accpath = \ ++ (char *)addr + ((p)->fts_accpath - (p)->fts_path); \ ++ } \ ++ (p)->fts_path = addr; \ ++} while (0) ++ /* Adjust the current set of children. */ ++ for (p = sp->fts_child; p; p = p->fts_link) ++ ADJUST(p); ++ ++ /* Adjust the rest of the tree, including the current level. */ ++ for (p = head; p->fts_level >= FTS_ROOTLEVEL;) { ++ ADJUST(p); ++ p = p->fts_link ? p->fts_link : p->fts_parent; ++ } ++} ++ ++static size_t ++fts_maxarglen(char * const *argv) ++{ ++ size_t len, max; ++ ++ for (max = 0; *argv; ++argv) ++ if ((len = strlen(*argv)) > max) ++ max = len; ++ return (max + 1); ++} ++ ++/* ++ * Change to dir specified by fd or p->fts_accpath without getting ++ * tricked by someone changing the world out from underneath us. ++ * Assumes p->fts_dev and p->fts_ino are filled in. ++ */ ++static int ++fts_safe_changedir(FTS *sp, FTSENT *p, int fd, const char *path) ++{ ++ int ret, oerrno, newfd; ++ struct stat64 sb; ++ ++ newfd = fd; ++ if (ISSET(FTS_NOCHDIR)) ++ return (0); ++ if (fd < 0 && (newfd = open(path, O_RDONLY, 0)) < 0) ++ return (-1); ++ if (fstat64(newfd, &sb)) { ++ ret = -1; ++ goto bail; ++ } ++ if (p->fts_dev != sb.st_dev || p->fts_ino != sb.st_ino) { ++ errno = ENOENT; /* disinformation */ ++ ret = -1; ++ goto bail; ++ } ++ ret = fchdir(newfd); ++bail: ++ oerrno = errno; ++ if (fd < 0) ++ (void)close(newfd); ++ errno = oerrno; ++ return (ret); ++} +Index: b/libdwfl/fts_.h +=================================================================== +--- /dev/null ++++ b/libdwfl/fts_.h +@@ -0,0 +1,131 @@ ++/* ++ * Copyright (c) 1989, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 4. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ * ++ * @(#)fts.h 8.3 (Berkeley) 8/14/94 ++ */ ++ ++#ifndef _FTS_H ++#define _FTS_H 1 ++ ++#include ++#include ++ ++/* The fts interface is incompatible with the LFS interface which ++ transparently uses the 64-bit file access functions. */ ++#ifdef __USE_FILE_OFFSET64 ++# error " cannot be used with -D_FILE_OFFSET_BITS==64" ++#endif ++ ++ ++typedef struct { ++ struct _ftsent *fts_cur; /* current node */ ++ struct _ftsent *fts_child; /* linked list of children */ ++ struct _ftsent **fts_array; /* sort array */ ++ dev_t fts_dev; /* starting device # */ ++ char *fts_path; /* path for this descent */ ++ int fts_rfd; /* fd for root */ ++ int fts_pathlen; /* sizeof(path) */ ++ int fts_nitems; /* elements in the sort array */ ++ int (*fts_compar) (const void *, const void *); /* compare fn */ ++ ++#define FTS_COMFOLLOW 0x0001 /* follow command line symlinks */ ++#define FTS_LOGICAL 0x0002 /* logical walk */ ++#define FTS_NOCHDIR 0x0004 /* don't change directories */ ++#define FTS_NOSTAT 0x0008 /* don't get stat info */ ++#define FTS_PHYSICAL 0x0010 /* physical walk */ ++#define FTS_SEEDOT 0x0020 /* return dot and dot-dot */ ++#define FTS_XDEV 0x0040 /* don't cross devices */ ++#define FTS_WHITEOUT 0x0080 /* return whiteout information */ ++#define FTS_OPTIONMASK 0x00ff /* valid user option mask */ ++ ++#define FTS_NAMEONLY 0x0100 /* (private) child names only */ ++#define FTS_STOP 0x0200 /* (private) unrecoverable error */ ++ int fts_options; /* fts_open options, global flags */ ++} FTS; ++ ++typedef struct _ftsent { ++ struct _ftsent *fts_cycle; /* cycle node */ ++ struct _ftsent *fts_parent; /* parent directory */ ++ struct _ftsent *fts_link; /* next file in directory */ ++ long fts_number; /* local numeric value */ ++ void *fts_pointer; /* local address value */ ++ char *fts_accpath; /* access path */ ++ char *fts_path; /* root path */ ++ int fts_errno; /* errno for this node */ ++ int fts_symfd; /* fd for symlink */ ++ u_short fts_pathlen; /* strlen(fts_path) */ ++ u_short fts_namelen; /* strlen(fts_name) */ ++ ++ ino_t fts_ino; /* inode */ ++ dev_t fts_dev; /* device */ ++ nlink_t fts_nlink; /* link count */ ++ ++#define FTS_ROOTPARENTLEVEL -1 ++#define FTS_ROOTLEVEL 0 ++ short fts_level; /* depth (-1 to N) */ ++ ++#define FTS_D 1 /* preorder directory */ ++#define FTS_DC 2 /* directory that causes cycles */ ++#define FTS_DEFAULT 3 /* none of the above */ ++#define FTS_DNR 4 /* unreadable directory */ ++#define FTS_DOT 5 /* dot or dot-dot */ ++#define FTS_DP 6 /* postorder directory */ ++#define FTS_ERR 7 /* error; errno is set */ ++#define FTS_F 8 /* regular file */ ++#define FTS_INIT 9 /* initialized only */ ++#define FTS_NS 10 /* stat(2) failed */ ++#define FTS_NSOK 11 /* no stat(2) requested */ ++#define FTS_SL 12 /* symbolic link */ ++#define FTS_SLNONE 13 /* symbolic link without target */ ++#define FTS_W 14 /* whiteout object */ ++ u_short fts_info; /* user flags for FTSENT structure */ ++ ++#define FTS_DONTCHDIR 0x01 /* don't chdir .. to the parent */ ++#define FTS_SYMFOLLOW 0x02 /* followed a symlink to get here */ ++ u_short fts_flags; /* private flags for FTSENT structure */ ++ ++#define FTS_AGAIN 1 /* read node again */ ++#define FTS_FOLLOW 2 /* follow symbolic link */ ++#define FTS_NOINSTR 3 /* no instructions */ ++#define FTS_SKIP 4 /* discard node */ ++ u_short fts_instr; /* fts_set() instructions */ ++ ++ struct stat *fts_statp; /* stat(2) information */ ++ char fts_name[1]; /* file name */ ++} FTSENT; ++ ++__BEGIN_DECLS ++FTSENT *fts_children (FTS *, int); ++int fts_close (FTS *); ++FTS *fts_open (char * const *, int, ++ int (*)(const FTSENT **, const FTSENT **)); ++FTSENT *fts_read (FTS *); ++int fts_set (FTS *, FTSENT *, int) __THROW; ++__END_DECLS ++ ++#endif /* fts.h */ +Index: b/libdwfl/linux-kernel-modules.c +=================================================================== +--- a/libdwfl/linux-kernel-modules.c ++++ b/libdwfl/linux-kernel-modules.c +@@ -29,7 +29,11 @@ + /* We include this before config.h because it can't handle _FILE_OFFSET_BITS. + Everything we need here is fine if its declarations just come first. */ + ++#ifdef HAVE_FTS_H + #include ++#else ++#include "fts_.h" ++#endif + + #include + diff --git a/packages/devel/elfutils/patches/elfutils-00-portability.patch b/packages/devel/elfutils/patches/elfutils-00-portability.patch new file mode 100644 index 0000000000..dd9eeb2238 --- /dev/null +++ b/packages/devel/elfutils/patches/elfutils-00-portability.patch @@ -0,0 +1,1684 @@ +--- elfutils/backends/ChangeLog ++++ elfutils/backends/ChangeLog +@@ -135,6 +135,10 @@ + * ppc_attrs.c (ppc_check_object_attribute): Handle tag + GNU_Power_ABI_Struct_Return. + ++2009-01-23 Roland McGrath ++ ++ * Makefile.am (libebl_%.so): Use $(LD_AS_NEEDED). ++ + 2008-10-04 Ulrich Drepper + + * i386_reloc.def: Fix entries for TLS_GOTDESC, TLS_DESC_CALL, and +@@ -462,6 +466,11 @@ + * sparc_init.c: Likewise. + * x86_64_init.c: Likewise. + ++2005-11-22 Roland McGrath ++ ++ * Makefile.am (LD_AS_NEEDED): New variable, substituted by configure. ++ (libebl_%.so rule): Use it in place of -Wl,--as-needed. ++ + 2005-11-19 Roland McGrath + + * ppc64_reloc.def: REL30 -> ADDR30. +@@ -484,6 +493,9 @@ + * Makefile.am (uninstall): Don't try to remove $(pkgincludedir). + (CLEANFILES): Add libebl_$(m).so. + ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it in place of -Wextra. ++ + * ppc_reloc.def: Update bits per Alan Modra . + * ppc64_reloc.def: Likewise. + +--- elfutils/backends/Makefile.am ++++ elfutils/backends/Makefile.am +@@ -111,7 +111,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a + $(LINK) -shared -o $(@:.map=.so) \ + -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \ + -Wl,--version-script,$(@:.so=.map) \ +- -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw) $(libmudflap) ++ -Wl,-z,defs $(LD_AS_NEEDED) $(libelf) $(libdw) $(libmudflap) + $(textrel_check) + + libebl_i386.so: $(cpu_i386) +--- elfutils/backends/Makefile.in ++++ elfutils/backends/Makefile.in +@@ -38,7 +38,8 @@ build_triplet = @build@ + host_triplet = @host@ + DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog +-@MUDFLAP_TRUE@am__append_1 = -fmudflap ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap + subdir = backends + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ +@@ -172,6 +173,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -201,6 +203,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +@@ -263,10 +266,9 @@ INCLUDES = -I. -I$(srcdir) -I$(top_srcdi + -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \ + -I$(top_srcdir)/libelf -I$(top_srcdir)/libdw + AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ +- $($(*F)_no_Werror),,-Werror) $(if \ +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ ++ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ + $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ +- $(am__append_1) ++ $(am__append_1) $(am__append_2) + @MUDFLAP_FALSE@libmudflap = + @MUDFLAP_TRUE@libmudflap = -lmudflap + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\ +@@ -719,7 +721,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a + $(LINK) -shared -o $(@:.map=.so) \ + -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \ + -Wl,--version-script,$(@:.so=.map) \ +- -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw) $(libmudflap) ++ -Wl,-z,defs $(LD_AS_NEEDED) $(libelf) $(libdw) $(libmudflap) + $(textrel_check) + + libebl_i386.so: $(cpu_i386) +--- elfutils/ChangeLog ++++ elfutils/ChangeLog +@@ -16,6 +16,8 @@ + + 2012-01-24 Mark Wielaard + ++ * configure.ac: Wrap AC_COMPILE_IFELSE sources in AC_LANG_SOURCE. ++ + * COPYING: Fix address. Updated version from gnulib. + + 2012-01-23 Mark Wielaard +@@ -34,6 +36,9 @@ + + 2011-10-08 Mike Frysinger + ++ * configure.ac (--disable-werror): Handle it, controlling BUILD_WERROR ++ automake option. ++ + * configure.ac: Fix use of AC_ARG_ENABLE to handle $enableval correctly. + + 2011-10-02 Ulrich Drepper +@@ -55,6 +60,10 @@ + + * configure.ac (LOCALEDIR, DATADIRNAME): Removed. + ++2009-11-22 Roland McGrath ++ ++ * configure.ac: Use sed and expr instead of modern bash extensions. ++ + 2009-09-21 Ulrich Drepper + + * configure.ac: Update for more modern autoconf. +@@ -63,6 +72,10 @@ + + * configure.ac (zip_LIBS): Check for liblzma too. + ++2009-08-17 Roland McGrath ++ ++ * configure.ac: Check for -fgnu89-inline; add it to WEXTRA if it works. ++ + 2009-04-19 Roland McGrath + + * configure.ac (eu_version): Round down here, not in version.h macros. +@@ -74,6 +87,8 @@ + + 2009-01-23 Roland McGrath + ++ * configure.ac: Check for __builtin_popcount. ++ + * configure.ac (zlib check): Check for gzdirect, need zlib >= 1.2.2.3. + + * configure.ac (__thread check): Use AC_LINK_IFELSE, in case of +@@ -154,6 +169,10 @@ + * configure.ac: Add dummy automake conditional to get dependencies + for non-generic linker right. See src/Makefile.am. + ++2005-11-22 Roland McGrath ++ ++ * configure.ac: Check for --as-needed linker option. ++ + 2005-11-18 Roland McGrath + + * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): New variable. +@@ -201,6 +220,17 @@ + * Makefile.am (all_SUBDIRS): Add libdwfl. + * configure.ac: Write libdwfl/Makefile. + ++2005-05-31 Roland McGrath ++ ++ * configure.ac (WEXTRA): Check for -Wextra and set this substitution. ++ ++ * configure.ac: Check for struct stat st_?tim members. ++ * src/strip.c (process_file): Use st_?time if st_?tim are not there. ++ ++ * configure.ac: Check for futimes function. ++ * src/strip.c (handle_elf) [! HAVE_FUTIMES]: Use utimes instead. ++ (handle_ar) [! HAVE_FUTIMES]: Likewise. ++ + 2005-05-19 Roland McGrath + + * configure.ac [AH_BOTTOM] (INTDECL, _INTDECL): New macros. +--- elfutils/config/ChangeLog ++++ elfutils/config/ChangeLog +@@ -19,6 +19,10 @@ + + * known-dwarf.awk: Use gawk. + ++2011-10-08 Mike Frysinger ++ ++ * eu.am [BUILD_WERROR]: Conditionalize -Werror use on this. ++ + 2010-07-02 Ulrich Drepper + + * elfutils.spec.in: Add more BuildRequires. +--- elfutils/config/eu.am ++++ elfutils/config/eu.am +@@ -1,6 +1,6 @@ + ## Common automake fragments for elfutils subdirectory makefiles. + ## +-## Copyright (C) 2010 Red Hat, Inc. ++## Copyright (C) 2010-2011 Red Hat, Inc. + ## + ## This file is part of elfutils. + ## +@@ -29,14 +29,20 @@ + ## not, see . + ## + ++WEXTRA = @WEXTRA@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ ++ + DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"' + INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. + AM_CFLAGS = -std=gnu99 -Wall -Wshadow \ +- $(if $($(*F)_no_Werror),,-Werror) \ +- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \ ++ $(if $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) \ + $(if $($(*F)_no_Wformat),-Wno-format,-Wformat=2) \ + $($(*F)_CFLAGS) + ++if BUILD_WERROR ++AM_CFLAGS += $(if $($(*F)_no_Werror),,-Werror) ++endif ++ + if MUDFLAP + AM_CFLAGS += -fmudflap + libmudflap = -lmudflap +--- elfutils/config/Makefile.in ++++ elfutils/config/Makefile.in +@@ -76,6 +76,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -105,6 +106,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +--- elfutils/config.h.in ++++ elfutils/config.h.in +@@ -6,6 +6,9 @@ + /* Defined if libdw should support GNU ref_alt FORM, dwz multi files. */ + #undef ENABLE_DWZ + ++/* Have __builtin_popcount. */ ++#undef HAVE_BUILTIN_POPCOUNT ++ + /* $libdir subdirectory containing libebl modules. */ + #undef LIBEBL_SUBDIR + +@@ -64,4 +67,7 @@ + /* Define for large files, on AIX-style hosts. */ + #undef _LARGE_FILES + ++/* Stubbed out if missing compiler support. */ ++#undef __thread ++ + #include +--- elfutils/configure ++++ elfutils/configure +@@ -598,6 +598,8 @@ ZLIB_TRUE + LIBEBL_SUBDIR + TESTS_RPATH_FALSE + TESTS_RPATH_TRUE ++BUILD_WERROR_FALSE ++BUILD_WERROR_TRUE + BUILD_STATIC_FALSE + BUILD_STATIC_TRUE + GCOV_FALSE +@@ -612,6 +614,8 @@ NEVER_TRUE + base_cpu + NATIVE_LD_FALSE + NATIVE_LD_TRUE ++LD_AS_NEEDED ++WEXTRA + LEXLIB + LEX_OUTPUT_ROOT + LEX +@@ -725,6 +729,7 @@ enable_mudflap + enable_debugpred + enable_gprof + enable_gcov ++enable_werror + enable_tests_rpath + enable_libebl_subdir + with_zlib +@@ -1378,6 +1383,7 @@ Optional Features: + prediction + --enable-gprof build binaries with gprof support + --enable-gcov build binaries with gcov support ++ --disable-werror do not build with -Werror + --enable-tests-rpath build $ORIGIN-using rpath into tests + --enable-libebl-subdir=DIR + install libebl_CPU modules in $(libdir)/DIR +@@ -3917,6 +3923,130 @@ if test "x$ac_cv_c99" != xyes; then : + as_fn_error $? "gcc with C99 support required" "$LINENO" 5 + fi + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Wextra option to $CC" >&5 ++$as_echo_n "checking for -Wextra option to $CC... " >&6; } ++if ${ac_cv_cc_wextra+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ old_CFLAGS="$CFLAGS" ++CFLAGS="$CFLAGS -Wextra" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++void foo (void) { } ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_cc_wextra=yes ++else ++ ac_cv_cc_wextra=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++CFLAGS="$old_CFLAGS" ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_wextra" >&5 ++$as_echo "$ac_cv_cc_wextra" >&6; } ++ ++if test "x$ac_cv_cc_wextra" = xyes; then : ++ WEXTRA=-Wextra ++else ++ WEXTRA=-W ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fgnu89-inline option to $CC" >&5 ++$as_echo_n "checking for -fgnu89-inline option to $CC... " >&6; } ++if ${ac_cv_cc_gnu89_inline+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ old_CFLAGS="$CFLAGS" ++CFLAGS="$CFLAGS -fgnu89-inline -Werror" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++void foo (void) ++{ ++ inline void bar (void) {} ++ bar (); ++} ++extern inline void baz (void) {} ++ ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_cc_gnu89_inline=yes ++else ++ ac_cv_cc_gnu89_inline=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++CFLAGS="$old_CFLAGS" ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_gnu89_inline" >&5 ++$as_echo "$ac_cv_cc_gnu89_inline" >&6; } ++if test "x$ac_cv_cc_gnu89_inline" = xyes; then : ++ WEXTRA="${WEXTRA:+$WEXTRA }-fgnu89-inline" ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --as-needed linker option" >&5 ++$as_echo_n "checking for --as-needed linker option... " >&6; } ++if ${ac_cv_as_needed+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat > conftest.c <&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; } ++then ++ ac_cv_as_needed=yes ++else ++ ac_cv_as_needed=no ++fi ++rm -f conftest* ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_as_needed" >&5 ++$as_echo "$ac_cv_as_needed" >&6; } ++if test "x$ac_cv_as_needed" = xyes; then : ++ LD_AS_NEEDED=-Wl,--as-needed ++else ++ LD_AS_NEEDED= ++fi ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_popcount" >&5 ++$as_echo_n "checking for __builtin_popcount... " >&6; } ++if ${ac_cv_popcount+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++exit (__builtin_popcount (127)); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_popcount=yes ++else ++ ac_cv_popcount=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_popcount" >&5 ++$as_echo "$ac_cv_popcount" >&6; } ++if test "x$ac_cv_popcount" = xyes; then : ++ ++$as_echo "#define HAVE_BUILTIN_POPCOUNT 1" >>confdefs.h ++ ++fi ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __thread support" >&5 + $as_echo_n "checking for __thread support... " >&6; } + if ${ac_cv_tls+:} false; then : +@@ -3953,7 +4083,13 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 + $as_echo "$ac_cv_tls" >&6; } + if test "x$ac_cv_tls" != xyes; then : +- as_fn_error $? "__thread support required" "$LINENO" 5 ++ if test "$use_locks" = yes; then : ++ as_fn_error $? "--enable-thread-safety requires __thread support" "$LINENO" 5 ++else ++ ++$as_echo "#define __thread /* empty: no multi-thread support */" >>confdefs.h ++ ++fi + fi + + # Check whether --enable-largefile was given. +@@ -4302,6 +4438,22 @@ else + fi + + ++# Check whether --enable-werror was given. ++if test "${enable_werror+set}" = set; then : ++ enableval=$enable_werror; enable_werror=$enableval ++else ++ enable_werror=yes ++fi ++ ++ if test "$enable_werror" = yes; then ++ BUILD_WERROR_TRUE= ++ BUILD_WERROR_FALSE='#' ++else ++ BUILD_WERROR_TRUE='#' ++ BUILD_WERROR_FALSE= ++fi ++ ++ + # Check whether --enable-tests-rpath was given. + if test "${enable_tests_rpath+set}" = set; then : + enableval=$enable_tests_rpath; tests_use_rpath=$enableval +@@ -5022,7 +5174,7 @@ case "$eu_version" in + esac + + # Round up to the next release API (x.y) version. +-eu_version=$(( (eu_version + 999) / 1000 )) ++eu_version=`expr \( $eu_version + 999 \) / 1000` + + cat >confcache <<\_ACEOF + # This file is a shell script that caches the results of configure +@@ -5185,6 +5337,10 @@ if test -z "${BUILD_STATIC_TRUE}" && tes + as_fn_error $? "conditional \"BUILD_STATIC\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${BUILD_WERROR_TRUE}" && test -z "${BUILD_WERROR_FALSE}"; then ++ as_fn_error $? "conditional \"BUILD_WERROR\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${TESTS_RPATH_TRUE}" && test -z "${TESTS_RPATH_FALSE}"; then + as_fn_error $? "conditional \"TESTS_RPATH\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 +--- elfutils/configure.ac ++++ elfutils/configure.ac +@@ -90,6 +90,54 @@ CFLAGS="$old_CFLAGS"]) + AS_IF([test "x$ac_cv_c99" != xyes], + AC_MSG_ERROR([gcc with C99 support required])) + ++AC_CACHE_CHECK([for -Wextra option to $CC], ac_cv_cc_wextra, [dnl ++old_CFLAGS="$CFLAGS" ++CFLAGS="$CFLAGS -Wextra" ++AC_COMPILE_IFELSE([AC_LANG_SOURCE([void foo (void) { }])], ++ ac_cv_cc_wextra=yes, ac_cv_cc_wextra=no) ++CFLAGS="$old_CFLAGS"]) ++AC_SUBST(WEXTRA) ++AS_IF([test "x$ac_cv_cc_wextra" = xyes], [WEXTRA=-Wextra], [WEXTRA=-W]) ++ ++AC_CACHE_CHECK([for -fgnu89-inline option to $CC], ac_cv_cc_gnu89_inline, [dnl ++old_CFLAGS="$CFLAGS" ++CFLAGS="$CFLAGS -fgnu89-inline -Werror" ++AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ++void foo (void) ++{ ++ inline void bar (void) {} ++ bar (); ++} ++extern inline void baz (void) {} ++])], ac_cv_cc_gnu89_inline=yes, ac_cv_cc_gnu89_inline=no) ++CFLAGS="$old_CFLAGS"]) ++AS_IF([test "x$ac_cv_cc_gnu89_inline" = xyes], ++ [WEXTRA="${WEXTRA:+$WEXTRA }-fgnu89-inline"]) ++ ++AC_CACHE_CHECK([for --as-needed linker option], ++ ac_cv_as_needed, [dnl ++cat > conftest.c <&AS_MESSAGE_LOG_FD]) ++then ++ ac_cv_as_needed=yes ++else ++ ac_cv_as_needed=no ++fi ++rm -f conftest*]) ++AS_IF([test "x$ac_cv_as_needed" = xyes], ++ [LD_AS_NEEDED=-Wl,--as-needed], [LD_AS_NEEDED=]) ++AC_SUBST(LD_AS_NEEDED) ++ ++AC_CACHE_CHECK([for __builtin_popcount], ac_cv_popcount, [dnl ++AC_LINK_IFELSE([AC_LANG_PROGRAM([], [[exit (__builtin_popcount (127));]])], ++ ac_cv_popcount=yes, ac_cv_popcount=no)]) ++AS_IF([test "x$ac_cv_popcount" = xyes], ++ [AC_DEFINE([HAVE_BUILTIN_POPCOUNT], [1], [Have __builtin_popcount.])]) ++ + AC_CACHE_CHECK([for __thread support], ac_cv_tls, [dnl + # Use the same flags that we use for our DSOs, so the test is representative. + # Some old compiler/linker/libc combinations fail some ways and not others. +@@ -105,7 +153,10 @@ static __thread int a; int foo (int b) { + CFLAGS="$save_CFLAGS" + LDFLAGS="$save_LDFLAGS"]) + AS_IF([test "x$ac_cv_tls" != xyes], +- AC_MSG_ERROR([__thread support required])) ++ [AS_IF([test "$use_locks" = yes], ++ [AC_MSG_ERROR([--enable-thread-safety requires __thread support])], ++ [AC_DEFINE([__thread], [/* empty: no multi-thread support */], ++ [Stubbed out if missing compiler support.])])]) + + dnl This test must come as early as possible after the compiler configuration + dnl tests, because the choice of the file model can (in principle) affect +@@ -193,6 +244,11 @@ AM_CONDITIONAL(GCOV, test "$use_gcov" = + AM_CONDITIONAL(BUILD_STATIC, [dnl + test "$use_mudflap" = yes -o "$use_gprof" = yes -o "$use_gcov" = yes]) + ++AC_ARG_ENABLE([werror], ++AS_HELP_STRING([--disable-werror],[do not build with -Werror]), ++ [enable_werror=$enableval], [enable_werror=yes]) ++AM_CONDITIONAL(BUILD_WERROR, test "$enable_werror" = yes) ++ + AC_ARG_ENABLE([tests-rpath], + AS_HELP_STRING([--enable-tests-rpath],[build $ORIGIN-using rpath into tests]), + [tests_use_rpath=$enableval], [tests_use_rpath=no]) +@@ -304,6 +360,6 @@ case "$eu_version" in + esac + + # Round up to the next release API (x.y) version. +-eu_version=$(( (eu_version + 999) / 1000 )) ++eu_version=`expr \( $eu_version + 999 \) / 1000` + + AC_OUTPUT +--- elfutils/lib/ChangeLog ++++ elfutils/lib/ChangeLog +@@ -35,6 +35,9 @@ + + 2009-01-23 Roland McGrath + ++ * eu-config.h [! HAVE_BUILTIN_POPCOUNT] ++ (__builtin_popcount): New inline function. ++ + * eu-config.h: Add multiple inclusion protection. + + 2009-01-17 Ulrich Drepper +@@ -91,6 +94,11 @@ + * Makefile.am (libeu_a_SOURCES): Add it. + * system.h: Declare crc32_file. + ++2005-02-07 Roland McGrath ++ ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it in place of -Wextra. ++ + 2005-04-30 Ulrich Drepper + + * Makefile.am: Use -ffunction-sections for xmalloc.c. +--- elfutils/lib/eu-config.h ++++ elfutils/lib/eu-config.h +@@ -162,6 +162,17 @@ asm (".section predict_data, \"aw\"; .pr + /* This macro is used by the tests conditionalize for standalone building. */ + #define ELFUTILS_HEADER(name) + ++#ifndef HAVE_BUILTIN_POPCOUNT ++# define __builtin_popcount hakmem_popcount ++static inline unsigned int __attribute__ ((unused)) ++hakmem_popcount (unsigned int x) ++{ ++ /* HAKMEM 169 */ ++ unsigned int n = x - ((x >> 1) & 033333333333) - ((x >> 2) & 011111111111); ++ return ((n + (n >> 3)) & 030707070707) % 63; ++} ++#endif /* HAVE_BUILTIN_POPCOUNT */ ++ + + #ifdef SHARED + # define OLD_VERSION(name, version) \ +--- elfutils/lib/Makefile.in ++++ elfutils/lib/Makefile.in +@@ -37,7 +37,8 @@ build_triplet = @build@ + host_triplet = @host@ + DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog +-@MUDFLAP_TRUE@am__append_1 = -fmudflap ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap + subdir = lib + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ +@@ -100,6 +101,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -129,6 +131,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +@@ -190,10 +193,9 @@ zip_LIBS = @zip_LIBS@ + INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \ + -I$(srcdir)/../libelf + AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ +- $($(*F)_no_Werror),,-Werror) $(if \ +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ ++ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ + $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ +- $(am__append_1) -fpic ++ $(am__append_1) $(am__append_2) -fpic + @MUDFLAP_FALSE@libmudflap = + @MUDFLAP_TRUE@libmudflap = -lmudflap + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\ +--- elfutils/libasm/ChangeLog ++++ elfutils/libasm/ChangeLog +@@ -71,6 +71,11 @@ + * asm_error.c: Add new error ASM_E_IOERROR. + * libasmP.h: Add ASM_E_IOERROR definition. + ++2005-05-31 Roland McGrath ++ ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it in place of -Wextra. ++ + 2005-02-15 Ulrich Drepper + + * Makefile.am (AM_CFLAGS): Add -Wunused -Wextra -Wformat=2. +--- elfutils/libasm/Makefile.in ++++ elfutils/libasm/Makefile.in +@@ -39,10 +39,11 @@ host_triplet = @host@ + DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/config/eu.am ChangeLog +-@MUDFLAP_TRUE@am__append_1 = -fmudflap ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap + @MUDFLAP_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1) + @MUDFLAP_TRUE@am_libasm_pic_a_OBJECTS = +-@MUDFLAP_FALSE@@USE_LOCKS_TRUE@am__append_2 = -lpthread ++@MUDFLAP_FALSE@@USE_LOCKS_TRUE@am__append_3 = -lpthread + subdir = libasm + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ +@@ -147,6 +148,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -176,6 +178,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = 1 ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +@@ -238,10 +241,9 @@ INCLUDES = -I. -I$(srcdir) -I$(top_srcdi + -I$(top_srcdir)/libelf -I$(top_srcdir)/libebl \ + -I$(top_srcdir)/libdw + AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ +- $($(*F)_no_Werror),,-Werror) $(if \ +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ ++ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ + $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ +- $(am__append_1) ++ $(am__append_1) $(am__append_2) + @MUDFLAP_FALSE@libmudflap = + @MUDFLAP_TRUE@libmudflap = -lmudflap + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\ +@@ -270,7 +272,7 @@ libasm_a_SOURCES = asm_begin.c asm_abort + + @MUDFLAP_FALSE@libasm_pic_a_SOURCES = + @MUDFLAP_FALSE@am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os) +-@MUDFLAP_FALSE@libasm_so_LDLIBS = $(am__append_2) ++@MUDFLAP_FALSE@libasm_so_LDLIBS = $(am__append_3) + @MUDFLAP_FALSE@libasm_so_SOURCES = + noinst_HEADERS = libasmP.h symbolhash.h + EXTRA_DIST = libasm.map +--- elfutils/libcpu/ChangeLog ++++ elfutils/libcpu/ChangeLog +@@ -38,6 +38,9 @@ + + 2009-01-23 Roland McGrath + ++ * i386_disasm.c (i386_disasm): Add abort after assert-constant for old ++ compilers that don't realize it's noreturn. ++ + * Makefile.am (i386_parse_CFLAGS): Use quotes around command + substitution that can produce leading whitespace. + +@@ -367,6 +370,11 @@ + * defs/i386.doc: New file. + * defs/x86_64: New file. + ++2005-04-04 Roland McGrath ++ ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it instead of -Wextra. ++ + 2005-02-15 Ulrich Drepper + + * Makefile (AM_CFLAGS): Add -Wunused -Wextra -Wformat=2. +--- elfutils/libcpu/i386_disasm.c ++++ elfutils/libcpu/i386_disasm.c +@@ -822,6 +822,7 @@ i386_disasm (const uint8_t **startp, con + + default: + assert (! "INVALID not handled"); ++ abort (); + } + } + else +--- elfutils/libcpu/Makefile.in ++++ elfutils/libcpu/Makefile.in +@@ -39,7 +39,8 @@ host_triplet = @host@ + DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog \ + i386_lex.c i386_parse.c +-@MUDFLAP_TRUE@am__append_1 = -fmudflap ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap + @MAINTAINER_MODE_TRUE@noinst_PROGRAMS = i386_gendis$(EXEEXT) + subdir = libcpu + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +@@ -117,6 +118,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = lex.$( ++ ++ * dwarf_begin_elf.c: Add fallback for be64toh if not defined. ++ + 2011-07-14 Mark Wielaard + + * libdw.h (dwarf_offdie): Fix documentation to mention .debug_info. +@@ -441,6 +445,10 @@ + + * dwarf_hasattr_integrate.c: Integrate DW_AT_specification too. + ++2009-08-17 Roland McGrath ++ ++ * libdw.h: Disable extern inlines for GCC 4.2. ++ + 2009-08-10 Roland McGrath + + * dwarf_getscopevar.c: Use dwarf_diename. +@@ -1209,6 +1217,11 @@ + + 2005-05-31 Roland McGrath + ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it in place of -Wextra. ++ ++2005-05-31 Roland McGrath ++ + * dwarf_formref_die.c (dwarf_formref_die): Add CU header offset to + formref offset. + +--- elfutils/libdw/dwarf_begin_elf.c ++++ elfutils/libdw/dwarf_begin_elf.c +@@ -48,6 +48,14 @@ + #if USE_ZLIB + # include + # define crc32 loser_crc32 ++# ifndef be64toh ++# include ++# if __BYTE_ORDER == __LITTLE_ENDIAN ++# define be64toh(x) bswap_64 (x) ++# else ++# define be64toh(x) (x) ++# endif ++# endif + # include + # undef crc32 + #endif +--- elfutils/libdw/libdw.h ++++ elfutils/libdw/libdw.h +@@ -831,7 +831,7 @@ extern Dwarf_OOM dwarf_new_oom_handler ( + + + /* Inline optimizations. */ +-#ifdef __OPTIMIZE__ ++#if defined __OPTIMIZE__ && !(__GNUC__ == 4 && __GNUC_MINOR__ == 2) + /* Return attribute code of given attribute. */ + __libdw_extern_inline unsigned int + dwarf_whatattr (Dwarf_Attribute *attr) +--- elfutils/libdw/Makefile.in ++++ elfutils/libdw/Makefile.in +@@ -39,8 +39,9 @@ host_triplet = @host@ + DIST_COMMON = $(include_HEADERS) $(noinst_HEADERS) \ + $(pkginclude_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog +-@MUDFLAP_TRUE@am__append_1 = -fmudflap +-@BUILD_STATIC_TRUE@am__append_2 = -fpic ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap ++@BUILD_STATIC_TRUE@am__append_3 = -fpic + @MUDFLAP_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1) + @MUDFLAP_TRUE@am_libdw_pic_a_OBJECTS = + subdir = libdw +@@ -192,6 +193,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -221,6 +223,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = 1 ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +@@ -282,10 +285,9 @@ zip_LIBS = @zip_LIBS@ + INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \ + -I$(srcdir)/../libelf + AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ +- $($(*F)_no_Werror),,-Werror) $(if \ +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ ++ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ + $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ +- $(am__append_1) $(am__append_2) ++ $(am__append_1) $(am__append_2) $(am__append_3) + @MUDFLAP_FALSE@libmudflap = + @MUDFLAP_TRUE@libmudflap = -lmudflap + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\ +--- elfutils/libdwfl/ChangeLog ++++ elfutils/libdwfl/ChangeLog +@@ -1420,6 +1420,11 @@ + + 2005-07-21 Roland McGrath + ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it in place of -Wextra. ++ ++2005-07-21 Roland McGrath ++ + * Makefile.am (noinst_HEADERS): Add loc2c.c. + + * test2.c (main): Check sscanf result to quiet warning. +--- elfutils/libdwfl/Makefile.in ++++ elfutils/libdwfl/Makefile.in +@@ -38,11 +38,12 @@ host_triplet = @host@ + DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/config/eu.am ChangeLog +-@MUDFLAP_TRUE@am__append_1 = -fmudflap +-@MUDFLAP_FALSE@am__append_2 = libdwfl_pic.a +-@ZLIB_TRUE@am__append_3 = gzip.c +-@BZLIB_TRUE@am__append_4 = bzip2.c +-@LZMA_TRUE@am__append_5 = lzma.c ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap ++@MUDFLAP_FALSE@am__append_3 = libdwfl_pic.a ++@ZLIB_TRUE@am__append_4 = gzip.c ++@BZLIB_TRUE@am__append_5 = bzip2.c ++@LZMA_TRUE@am__append_6 = lzma.c + @MUDFLAP_TRUE@am_libdwfl_pic_a_OBJECTS = + subdir = libdwfl + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +@@ -182,6 +183,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -211,6 +213,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = 1 ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +@@ -273,10 +276,9 @@ INCLUDES = -I. -I$(srcdir) -I$(top_srcdi + -I$(srcdir)/../libelf -I$(srcdir)/../libebl \ + -I$(srcdir)/../libdw + AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ +- $($(*F)_no_Werror),,-Werror) $(if \ +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ ++ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ + $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ +- $(am__append_1) ++ $(am__append_1) $(am__append_2) + @MUDFLAP_FALSE@libmudflap = + @MUDFLAP_TRUE@libmudflap = -lmudflap + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\ +@@ -284,7 +286,7 @@ COMPILE.os = $(filter-out -fprofile-arcs + + CLEANFILES = *.gcno *.gcda $(am_libdwfl_pic_a_OBJECTS) + textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi +-noinst_LIBRARIES = libdwfl.a $(am__append_2) ++noinst_LIBRARIES = libdwfl.a $(am__append_3) + pkginclude_HEADERS = libdwfl.h + libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c \ + dwfl_version.c dwfl_module.c dwfl_report_elf.c relocate.c \ +@@ -305,8 +307,8 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_en + dwfl_module_getsym.c dwfl_module_addrname.c \ + dwfl_module_addrsym.c dwfl_module_return_value_location.c \ + dwfl_module_register_names.c dwfl_segment_report_module.c \ +- link_map.c core-file.c open.c image-header.c $(am__append_3) \ +- $(am__append_4) $(am__append_5) ++ link_map.c core-file.c open.c image-header.c $(am__append_4) \ ++ $(am__append_5) $(am__append_6) + @MUDFLAP_FALSE@libdwfl = $(libdw) + @MUDFLAP_TRUE@libdwfl = libdwfl.a $(libdw) $(libebl) $(libelf) $(libeu) + @MUDFLAP_FALSE@libdw = ../libdw/libdw.so +--- elfutils/libebl/ChangeLog ++++ elfutils/libebl/ChangeLog +@@ -658,6 +658,11 @@ + * Makefile.am (libebl_*_so_SOURCES): Set to $(*_SRCS) so dependency + tracking works right. + ++2005-05-31 Roland McGrath ++ ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it in place of -Wextra. ++ + 2005-05-21 Ulrich Drepper + + * libebl_x86_64.map: Add x86_64_core_note. +--- elfutils/libebl/Makefile.in ++++ elfutils/libebl/Makefile.in +@@ -38,7 +38,8 @@ host_triplet = @host@ + DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/config/eu.am ChangeLog +-@MUDFLAP_TRUE@am__append_1 = -fmudflap ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap + subdir = libebl + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ +@@ -144,6 +145,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -173,6 +175,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = 1 ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +@@ -235,10 +238,9 @@ INCLUDES = -I. -I$(srcdir) -I$(top_srcdi + -I$(srcdir)/../libelf -I$(srcdir)/../libdw \ + -I$(srcdir)/../libasm + AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ +- $($(*F)_no_Werror),,-Werror) $(if \ +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ ++ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ + $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ +- $(am__append_1) -fpic ++ $(am__append_1) $(am__append_2) -fpic + @MUDFLAP_FALSE@libmudflap = + @MUDFLAP_TRUE@libmudflap = -lmudflap + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\ +--- elfutils/libelf/ChangeLog ++++ elfutils/libelf/ChangeLog +@@ -34,6 +34,11 @@ + + * elf-knowledge.h (SECTION_STRIP_P): Remove < SHT_NUM check. + ++2011-03-10 Roland McGrath ++ ++ * gnuhash_xlate.h (elf_cvt_gnuhash): Avoid post-increment in bswap_32 ++ argument, since some implementations are buggy macros. ++ + 2011-02-26 Mark Wielaard + + * elf_end.c (elf_end): Call rwlock_unlock before rwlock_fini. +@@ -711,6 +716,11 @@ + + * elf.h: Update from glibc. + ++2005-05-31 Roland McGrath ++ ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it in place of -Wextra. ++ + 2005-05-08 Roland McGrath + + * elf_begin.c (read_file) [_MUDFLAP]: Don't use mmap for now. +--- elfutils/libelf/common.h ++++ elfutils/libelf/common.h +@@ -139,7 +139,7 @@ libelf_release_all (Elf *elf) + (Var) = (sizeof (Var) == 1 \ + ? (unsigned char) (Var) \ + : (sizeof (Var) == 2 \ +- ? bswap_16 (Var) \ ++ ? (unsigned short int) bswap_16 (Var) \ + : (sizeof (Var) == 4 \ + ? bswap_32 (Var) \ + : bswap_64 (Var)))) +@@ -148,7 +148,7 @@ libelf_release_all (Elf *elf) + (Dst) = (sizeof (Var) == 1 \ + ? (unsigned char) (Var) \ + : (sizeof (Var) == 2 \ +- ? bswap_16 (Var) \ ++ ? (unsigned short int) bswap_16 (Var) \ + : (sizeof (Var) == 4 \ + ? bswap_32 (Var) \ + : bswap_64 (Var)))) +--- elfutils/libelf/gnuhash_xlate.h ++++ elfutils/libelf/gnuhash_xlate.h +@@ -1,5 +1,5 @@ + /* Conversion functions for versioning information. +- Copyright (C) 2006, 2007 Red Hat, Inc. ++ Copyright (C) 2006-2011 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 2006. + +@@ -68,7 +68,9 @@ elf_cvt_gnuhash (void *dest, const void + dest32 = (Elf32_Word *) &dest64[bitmask_words]; + while (len >= 4) + { +- *dest32++ = bswap_32 (*src32++); ++ *dest32 = bswap_32 (*src32); ++ ++dest32; ++ ++src32; + len -= 4; + } + } +--- elfutils/libelf/Makefile.in ++++ elfutils/libelf/Makefile.in +@@ -39,11 +39,12 @@ host_triplet = @host@ + DIST_COMMON = $(include_HEADERS) $(noinst_HEADERS) \ + $(pkginclude_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog +-@MUDFLAP_TRUE@am__append_1 = -fmudflap +-@BUILD_STATIC_TRUE@am__append_2 = -fpic ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap ++@BUILD_STATIC_TRUE@am__append_3 = -fpic + @MUDFLAP_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1) + @MUDFLAP_TRUE@am_libelf_pic_a_OBJECTS = +-@MUDFLAP_FALSE@@USE_LOCKS_TRUE@am__append_3 = -lpthread ++@MUDFLAP_FALSE@@USE_LOCKS_TRUE@am__append_4 = -lpthread + subdir = libelf + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ +@@ -189,6 +190,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -218,6 +220,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = 1 ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +@@ -278,10 +281,9 @@ top_srcdir = @top_srcdir@ + zip_LIBS = @zip_LIBS@ + INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. + AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ +- $($(*F)_no_Werror),,-Werror) $(if \ +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ ++ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ + $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ +- $(am__append_1) $(am__append_2) ++ $(am__append_1) $(am__append_2) $(am__append_3) + @MUDFLAP_FALSE@libmudflap = + @MUDFLAP_TRUE@libmudflap = -lmudflap + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\ +@@ -346,7 +348,7 @@ libelf_a_SOURCES = elf_version.c elf_has + + @MUDFLAP_FALSE@libelf_pic_a_SOURCES = + @MUDFLAP_FALSE@am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os) +-@MUDFLAP_FALSE@libelf_so_LDLIBS = $(am__append_3) ++@MUDFLAP_FALSE@libelf_so_LDLIBS = $(am__append_4) + @MUDFLAP_FALSE@libelf_so_SOURCES = + noinst_HEADERS = elf.h abstract.h common.h exttypes.h gelf_xlate.h libelfP.h \ + version_xlate.h gnuhash_xlate.h note_xlate.h dl-hash.h +--- elfutils/m4/Makefile.in ++++ elfutils/m4/Makefile.in +@@ -75,6 +75,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -104,6 +105,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +--- elfutils/Makefile.in ++++ elfutils/Makefile.in +@@ -155,6 +155,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -184,6 +185,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +--- elfutils/src/addr2line.c ++++ elfutils/src/addr2line.c +@@ -447,10 +447,10 @@ handle_address (const char *string, Dwfl + bool parsed = false; + int i, j; + char *name = NULL; +- if (sscanf (string, "(%m[^)])%" PRIiMAX "%n", &name, &addr, &i) == 2 ++ if (sscanf (string, "(%a[^)])%" PRIiMAX "%n", &name, &addr, &i) == 2 + && string[i] == '\0') + parsed = adjust_to_section (name, &addr, dwfl); +- switch (sscanf (string, "%m[^-+]%n%" PRIiMAX "%n", &name, &i, &addr, &j)) ++ switch (sscanf (string, "%a[^-+]%n%" PRIiMAX "%n", &name, &i, &addr, &j)) + { + default: + break; +--- elfutils/src/ChangeLog ++++ elfutils/src/ChangeLog +@@ -606,8 +606,16 @@ + * readelf.c (attr_callback): Use print_block only when we don't use + print_ops. + ++2009-08-17 Roland McGrath ++ ++ * ld.h: Disable extern inlines for GCC 4.2. ++ + 2009-08-14 Roland McGrath + ++ * strings.c (read_block): Conditionalize posix_fadvise use ++ on [POSIX_FADV_SEQUENTIAL]. ++ From Petr Salinger . ++ + * ar.c (do_oper_extract): Use pathconf instead of statfs. + + 2009-08-01 Ulrich Drepper +@@ -771,6 +779,8 @@ + * readelf.c (print_debug_frame_section): Use t instead of j formats + for ptrdiff_t OFFSET. + ++ * addr2line.c (handle_address): Use %a instead of %m for compatibility. ++ + 2009-01-21 Ulrich Drepper + + * elflint.c (check_program_header): Fix typo in .eh_frame_hdr section +@@ -954,6 +964,11 @@ + that matches its PT_LOAD's p_flags &~ PF_W. On sparc, PF_X really + is valid in RELRO. + ++2008-03-01 Roland McGrath ++ ++ * readelf.c (dump_archive_index): Tweak portability hack ++ to match [__GNUC__ < 4] too. ++ + 2008-02-29 Roland McGrath + + * readelf.c (print_attributes): Add a cast. +@@ -1205,6 +1220,8 @@ + + * readelf.c (hex_dump): Fix rounding error in whitespace calculation. + ++ * Makefile.am (readelf_no_Werror): New variable. ++ + 2007-10-15 Roland McGrath + + * make-debug-archive.in: New file. +@@ -1644,6 +1661,10 @@ + * elflint.c (valid_e_machine): Add EM_ALPHA. + Reported by Christian Aichinger . + ++ * strings.c (map_file): Define POSIX_MADV_SEQUENTIAL to ++ MADV_SEQUENTIAL if undefined. Don't call posix_madvise ++ if neither is defined. ++ + 2006-08-08 Ulrich Drepper + + * elflint.c (check_dynamic): Don't require DT_HASH for DT_SYMTAB. +@@ -1720,6 +1741,10 @@ + * Makefile.am: Add hacks to create dependency files for non-generic + linker. + ++2006-04-05 Roland McGrath ++ ++ * strings.c (MAP_POPULATE): Define to 0 if undefined. ++ + 2006-06-12 Ulrich Drepper + + * ldgeneric.c (ld_generic_generate_sections): Don't create .interp +@@ -2068,6 +2093,11 @@ + * readelf.c (print_debug_loc_section): Fix indentation for larger + address size. + ++2005-05-31 Roland McGrath ++ ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it in place of -Wextra. ++ + 2005-05-30 Roland McGrath + + * readelf.c (print_debug_line_section): Print section offset of each +--- elfutils/src/findtextrel.c ++++ elfutils/src/findtextrel.c +@@ -496,7 +496,11 @@ ptrcompare (const void *p1, const void * + + + static void +-check_rel (size_t nsegments, struct segments segments[nsegments], ++check_rel (size_t nsegments, struct segments segments[ ++#if __GNUC__ >= 4 ++ nsegments ++#endif ++ ], + GElf_Addr addr, Elf *elf, Elf_Scn *symscn, Dwarf *dw, + const char *fname, bool more_than_one, void **knownsrcs) + { +--- elfutils/src/ld.h ++++ elfutils/src/ld.h +@@ -1114,6 +1114,7 @@ extern bool dynamically_linked_p (void); + + /* Checked whether the symbol is undefined and referenced from a DSO. */ + extern bool linked_from_dso_p (struct scninfo *scninfo, size_t symidx); ++#if defined __OPTIMIZE__ && !(__GNUC__ == 4 && __GNUC_MINOR__ == 2) + #ifdef __GNUC_STDC_INLINE__ + __attribute__ ((__gnu_inline__)) + #endif +@@ -1131,5 +1132,6 @@ linked_from_dso_p (struct scninfo *scnin + + return sym->defined && sym->in_dso; + } ++#endif /* Optimizing and not GCC 4.2. */ + + #endif /* ld.h */ +--- elfutils/src/Makefile.am ++++ elfutils/src/Makefile.am +@@ -95,6 +95,9 @@ addr2line_no_Wformat = yes + # XXX While the file is not finished, don't warn about this + ldgeneric_no_Wunused = yes + ++# Buggy old compilers. ++readelf_no_Werror = yes ++ + readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl + nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl \ + $(demanglelib) +--- elfutils/src/Makefile.in ++++ elfutils/src/Makefile.in +@@ -40,7 +40,8 @@ host_triplet = @host@ + DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog \ + ldlex.c ldscript.c +-@MUDFLAP_TRUE@am__append_1 = -fmudflap ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap + bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEEXT) size$(EXEEXT) \ + strip$(EXEEXT) ld$(EXEEXT) elflint$(EXEEXT) \ + findtextrel$(EXEEXT) addr2line$(EXEEXT) elfcmp$(EXEEXT) \ +@@ -49,9 +50,9 @@ bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEE + @NATIVE_LD_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1) + # We never build this library but we need to get the dependency files + # of all the linker backends that might be used in a non-generic linker. +-@NEVER_TRUE@am__append_2 = libdummy.a ++@NEVER_TRUE@am__append_3 = libdummy.a + # -ldl is always needed for libebl. +-@NATIVE_LD_TRUE@am__append_3 = libld_elf.a ++@NATIVE_LD_TRUE@am__append_4 = libld_elf.a + @NATIVE_LD_TRUE@am_libld_elf_i386_pic_a_OBJECTS = + subdir = src + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +@@ -115,7 +116,7 @@ am_ld_OBJECTS = ld.$(OBJEXT) ldgeneric.$ + versionhash.$(OBJEXT) + ld_OBJECTS = $(am_ld_OBJECTS) + ld_DEPENDENCIES = $(libebl) $(libelf) $(libeu) $(am__DEPENDENCIES_1) \ +- $(am__append_3) ++ $(am__append_4) + ld_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(ld_LDFLAGS) $(LDFLAGS) -o \ + $@ + am_libld_elf_i386_so_OBJECTS = +@@ -229,6 +230,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -258,6 +260,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +@@ -321,10 +324,9 @@ INCLUDES = -I. -I$(srcdir) -I$(top_srcdi + -I$(srcdir)/../libdw -I$(srcdir)/../libdwfl \ + -I$(srcdir)/../libasm + AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ +- $($(*F)_no_Werror),,-Werror) $(if \ +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ ++ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ + $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ +- $(am__append_1) ++ $(am__append_1) $(am__append_2) + @MUDFLAP_FALSE@libmudflap = + @MUDFLAP_TRUE@libmudflap = -lmudflap + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\ +@@ -340,8 +342,8 @@ AM_LFLAGS = -Pld -olex.yy.c + native_ld = @native_ld@ + ld_dsos = libld_elf_i386_pic.a + @NATIVE_LD_FALSE@noinst_LIBRARIES = libld_elf.a libar.a $(ld_dsos) \ +-@NATIVE_LD_FALSE@ $(am__append_2) +-@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_2) ++@NATIVE_LD_FALSE@ $(am__append_3) ++@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_3) + @NATIVE_LD_TRUE@native_ld_cflags = -DBASE_ELF_NAME=elf_$(base_cpu) + @NEVER_TRUE@libdummy_a_SOURCES = i386_ld.c + ld_SOURCES = ld.c ldgeneric.c ldlex.l ldscript.y symbolhash.c sectionhash.c \ +@@ -370,6 +372,9 @@ strings_no_Wformat = yes + addr2line_no_Wformat = yes + # XXX While the file is not finished, don't warn about this + ldgeneric_no_Wunused = yes ++ ++# Buggy old compilers. ++readelf_no_Werror = yes + readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl + nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl \ + $(demanglelib) +@@ -377,7 +382,7 @@ nm_LDADD = $(libdw) $(libebl) $(libelf) + size_LDADD = $(libelf) $(libeu) $(libmudflap) + strip_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl + ld_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl \ +- $(am__append_3) ++ $(am__append_4) + ld_LDFLAGS = -rdynamic + elflint_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl + findtextrel_LDADD = $(libdw) $(libelf) $(libmudflap) +--- elfutils/src/readelf.c ++++ elfutils/src/readelf.c +@@ -3949,10 +3949,11 @@ struct listptr + #define listptr_offset_size(p) ((p)->dwarf64 ? 8 : 4) + #define listptr_address_size(p) ((p)->addr64 ? 8 : 4) + ++static const char *listptr_name; + static int +-compare_listptr (const void *a, const void *b, void *arg) ++compare_listptr (const void *a, const void *b) + { +- const char *name = arg; ++ const char *const name = listptr_name; + struct listptr *p1 = (void *) a; + struct listptr *p2 = (void *) b; + +@@ -4033,8 +4034,11 @@ static void + sort_listptr (struct listptr_table *table, const char *name) + { + if (table->n > 0) +- qsort_r (table->table, table->n, sizeof table->table[0], +- &compare_listptr, (void *) name); ++ { ++ listptr_name = name; ++ qsort (table->table, table->n, sizeof table->table[0], ++ &compare_listptr); ++ } + } + + static bool +@@ -8442,7 +8446,7 @@ dump_archive_index (Elf *elf, const char + if (unlikely (elf_rand (elf, as_off) == 0) + || unlikely ((subelf = elf_begin (-1, ELF_C_READ_MMAP, elf)) + == NULL)) +-#if __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 7) ++#if __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 7) || __GNUC__ < 4 + while (1) + #endif + error (EXIT_FAILURE, 0, +--- elfutils/src/strings.c ++++ elfutils/src/strings.c +@@ -43,6 +43,10 @@ + + #include + ++#ifndef MAP_POPULATE ++# define MAP_POPULATE 0 ++#endif ++ + + /* Prototypes of local functions. */ + static int read_fd (int fd, const char *fname, off64_t fdlen); +@@ -483,8 +487,13 @@ map_file (int fd, off64_t start_off, off + fd, start_off); + if (mem != MAP_FAILED) + { ++#if !defined POSIX_MADV_SEQUENTIAL && defined MADV_SEQUENTIAL ++# define POSIX_MADV_SEQUENTIAL MADV_SEQUENTIAL ++#endif ++#ifdef POSIX_MADV_SEQUENTIAL + /* We will go through the mapping sequentially. */ + (void) posix_madvise (mem, map_size, POSIX_MADV_SEQUENTIAL); ++#endif + break; + } + if (errno != EINVAL && errno != ENOMEM) +@@ -576,9 +585,11 @@ read_block (int fd, const char *fname, o + elfmap_off = from & ~(ps - 1); + elfmap_base = elfmap = map_file (fd, elfmap_off, fdlen, &elfmap_size); + ++#ifdef POSIX_FADV_SEQUENTIAL + if (unlikely (elfmap == MAP_FAILED)) + /* Let the kernel know we are going to read everything in sequence. */ + (void) posix_fadvise (fd, 0, 0, POSIX_FADV_SEQUENTIAL); ++#endif + } + + if (unlikely (elfmap == MAP_FAILED)) +--- elfutils/src/strip.c ++++ elfutils/src/strip.c +@@ -45,6 +45,12 @@ + #include + #include + ++#ifdef HAVE_FUTIMES ++# define FUTIMES(fd, fname, tvp) futimes (fd, tvp) ++#else ++# define FUTIMES(fd, fname, tvp) utimes (fname, tvp) ++#endif ++ + typedef uint8_t GElf_Byte; + + /* Name and version of program. */ +@@ -318,8 +324,18 @@ process_file (const char *fname) + + /* If we have to preserve the timestamp, we need it in the + format utimes() understands. */ ++#ifdef HAVE_STRUCT_STAT_ST_ATIM + TIMESPEC_TO_TIMEVAL (&tv[0], &pre_st.st_atim); ++#else ++ tv[0].tv_sec = pre_st.st_atime; ++ tv[0].tv_usec = 0; ++#endif ++#ifdef HAVE_STRUCT_STAT_ST_MTIM + TIMESPEC_TO_TIMEVAL (&tv[1], &pre_st.st_mtim); ++#else ++ tv[1].tv_sec = pre_st.st_atime; ++ tv[1].tv_usec = 0; ++#endif + } + + /* Open the file. */ +@@ -2055,7 +2071,7 @@ while computing checksum for debug infor + /* If requested, preserve the timestamp. */ + if (tvp != NULL) + { +- if (futimes (fd, tvp) != 0) ++ if (FUTIMES (fd, output_fname, tvp) != 0) + { + error (0, errno, gettext ("\ + cannot set access and modification date of '%s'"), +@@ -2112,7 +2128,7 @@ handle_ar (int fd, Elf *elf, const char + + if (tvp != NULL) + { +- if (unlikely (futimes (fd, tvp) != 0)) ++ if (unlikely (FUTIMES (fd, fname, tvp) != 0)) + { + error (0, errno, gettext ("\ + cannot set access and modification date of '%s'"), fname); +--- elfutils/tests/ChangeLog ++++ elfutils/tests/ChangeLog +@@ -439,6 +439,8 @@ + + 2008-01-21 Roland McGrath + ++ * line2addr.c (main): Revert last change. ++ + * testfile45.S.bz2: Add tests for cltq, cqto. + * testfile45.expect.bz2: Adjust. + +@@ -1147,6 +1149,11 @@ + * Makefile.am (TESTS): Add run-elflint-test.sh. + (EXTRA_DIST): Add run-elflint-test.sh and testfile18.bz2. + ++2005-05-31 Roland McGrath ++ ++ * Makefile.am (WEXTRA): New variable, substituted by configure. ++ (AM_CFLAGS): Use it in place of -Wextra. ++ + 2005-05-24 Ulrich Drepper + + * get-files.c (main): Use correct format specifier. +--- elfutils/tests/line2addr.c ++++ elfutils/tests/line2addr.c +@@ -124,7 +124,7 @@ main (int argc, char *argv[]) + { + struct args a = { .arg = argv[cnt] }; + +- switch (sscanf (a.arg, "%m[^:]:%d", &a.file, &a.line)) ++ switch (sscanf (a.arg, "%a[^:]:%d", &a.file, &a.line)) + { + default: + case 0: +--- elfutils/tests/Makefile.in ++++ elfutils/tests/Makefile.in +@@ -35,14 +35,15 @@ build_triplet = @build@ + host_triplet = @host@ + DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/config/eu.am ChangeLog +-@MUDFLAP_TRUE@am__append_1 = -fmudflap +-@STANDALONE_FALSE@am__append_2 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \ ++@BUILD_WERROR_TRUE@am__append_1 = $(if $($(*F)_no_Werror),,-Werror) ++@MUDFLAP_TRUE@am__append_2 = -fmudflap ++@STANDALONE_FALSE@am__append_3 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \ + @STANDALONE_FALSE@ -I$(top_srcdir)/libdwfl \ + @STANDALONE_FALSE@ -I$(top_srcdir)/libebl -I$(top_srcdir)/libelf \ + @STANDALONE_FALSE@ -I$(top_srcdir)/lib -I.. + +-@STANDALONE_FALSE@am__append_3 = -Wl,-rpath-link,../libasm:../libdw:../libelf +-@TESTS_RPATH_TRUE@am__append_4 = -Wl,-rpath,$(BUILD_RPATH) ++@STANDALONE_FALSE@am__append_4 = -Wl,-rpath-link,../libasm:../libdw:../libelf ++@TESTS_RPATH_TRUE@am__append_5 = -Wl,-rpath,$(BUILD_RPATH) + check_PROGRAMS = arextract$(EXEEXT) arsymtest$(EXEEXT) \ + newfile$(EXEEXT) saridx$(EXEEXT) scnnames$(EXEEXT) \ + sectiondump$(EXEEXT) showptable$(EXEEXT) update1$(EXEEXT) \ +@@ -92,12 +93,12 @@ TESTS = run-arextract.sh run-arsymtest.s + run-readelf-gdb_index.sh run-unstrip-n.sh run-low_high_pc.sh \ + run-macro-test.sh run-elf_cntl_gelf_getshdr.sh \ + run-test-archive64.sh $(am__EXEEXT_1) $(am__EXEEXT_3) \ +- $(am__append_9) +-@STANDALONE_FALSE@am__append_5 = msg_tst md5-sha1-test ++ $(am__append_10) + @STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test +-@HAVE_LIBASM_TRUE@am__append_7 = $(asm_TESTS) ++@STANDALONE_FALSE@am__append_7 = msg_tst md5-sha1-test + @HAVE_LIBASM_TRUE@am__append_8 = $(asm_TESTS) +-@ENABLE_DWZ_TRUE@am__append_9 = run-readelf-dwz-multi.sh ++@HAVE_LIBASM_TRUE@am__append_9 = $(asm_TESTS) ++@ENABLE_DWZ_TRUE@am__append_10 = run-readelf-dwz-multi.sh + subdir = tests + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ +@@ -412,6 +413,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ + LDFLAGS = @LDFLAGS@ ++LD_AS_NEEDED = @LD_AS_NEEDED@ + LEX = @LEX@ + LEXLIB = @LEXLIB@ + LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +@@ -441,6 +443,7 @@ SHELL = @SHELL@ + STRIP = @STRIP@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ ++WEXTRA = @WEXTRA@ + XGETTEXT = @XGETTEXT@ + XGETTEXT_015 = @XGETTEXT_015@ + XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +@@ -499,12 +502,11 @@ top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ + zip_LIBS = @zip_LIBS@ +-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_2) ++INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_3) + AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \ +- $($(*F)_no_Werror),,-Werror) $(if \ +- $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \ ++ $($(*F)_no_Wunused),,-Wunused $(WEXTRA)) $(if \ + $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \ +- $(am__append_1) ++ $(am__append_1) $(am__append_2) + @MUDFLAP_FALSE@libmudflap = + @MUDFLAP_TRUE@libmudflap = -lmudflap + COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\ +@@ -514,7 +516,7 @@ CLEANFILES = *.gcno *.gcda + textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi + @MUDFLAP_FALSE@BUILD_RPATH = \$$ORIGIN/../libasm:\$$ORIGIN/../libdw:\$$ORIGIN/../backends:\$$ORIGIN/../libelf + @MUDFLAP_TRUE@BUILD_RPATH = \$$ORIGIN/../backends +-AM_LDFLAGS = $(am__append_3) $(am__append_4) ++AM_LDFLAGS = $(am__append_4) $(am__append_5) + @TESTS_RPATH_FALSE@tests_rpath = no + @TESTS_RPATH_TRUE@tests_rpath = yes + asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \ diff --git a/packages/toolchain/devel/elfutils/patches/elfutils-0.153-robustify.patch b/packages/devel/elfutils/patches/elfutils-00-robustify.patch similarity index 87% rename from packages/toolchain/devel/elfutils/patches/elfutils-0.153-robustify.patch rename to packages/devel/elfutils/patches/elfutils-00-robustify.patch index d4ecbf010c..9eee98412d 100644 --- a/packages/toolchain/devel/elfutils/patches/elfutils-0.153-robustify.patch +++ b/packages/devel/elfutils/patches/elfutils-00-robustify.patch @@ -1,6 +1,6 @@ --- elfutils/libdwfl/ChangeLog +++ elfutils/libdwfl/ChangeLog -@@ -41,6 +41,11 @@ +@@ -52,6 +52,11 @@ * dwfl_module_getdwarf.c (open_elf): Clear errno before CBFAIL. Reported by Kurt Roeckx . @@ -18,10 +18,10 @@ /* Relocate debug information. - Copyright (C) 2005-2010 Red Hat, Inc. + Copyright (C) 2005-2011 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. - Red Hat elfutils is free software; you can redistribute it and/or modify -@@ -478,7 +478,10 @@ relocate_section (Dwfl_Module *mod, Elf + This file is free software; you can redistribute it and/or modify +@@ -457,7 +457,10 @@ relocate_section (Dwfl_Module *mod, Elf } } @@ -33,7 +33,7 @@ size_t complete = 0; if (shdr->sh_type == SHT_REL) for (size_t relidx = 0; !result && relidx < nrels; ++relidx) -@@ -580,7 +583,7 @@ relocate_section (Dwfl_Module *mod, Elf +@@ -559,7 +562,7 @@ relocate_section (Dwfl_Module *mod, Elf nrels = next; } @@ -44,7 +44,7 @@ --- elfutils/libelf/ChangeLog +++ elfutils/libelf/ChangeLog -@@ -663,10 +663,53 @@ +@@ -703,10 +703,53 @@ 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. @@ -100,7 +100,7 @@ * elf.h: Update from glibc. --- elfutils/libelf/elf32_getphdr.c +++ elfutils/libelf/elf32_getphdr.c -@@ -114,6 +114,16 @@ __elfw2(LIBELFBITS,getphdr_wrlock) (elf) +@@ -93,6 +93,16 @@ __elfw2(LIBELFBITS,getphdr_wrlock) (elf) if (elf->map_address != NULL) { @@ -119,14 +119,7 @@ + elf->start_offset + ehdr->e_phoff); --- 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, 2009 Red Hat, Inc. -+ Copyright (C) 1998-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. - Written by Ulrich Drepper , 1998. - -@@ -81,7 +81,8 @@ load_shdr_wrlock (Elf_Scn *scn) +@@ -60,7 +60,8 @@ load_shdr_wrlock (Elf_Scn *scn) goto out; size_t shnum; @@ -136,7 +129,7 @@ goto out; size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr)); -@@ -98,6 +99,16 @@ load_shdr_wrlock (Elf_Scn *scn) +@@ -77,6 +78,16 @@ load_shdr_wrlock (Elf_Scn *scn) if (elf->map_address != NULL) { @@ -155,7 +148,7 @@ /* All the data is already mapped. If we could use it --- elfutils/libelf/elf32_newphdr.c +++ elfutils/libelf/elf32_newphdr.c -@@ -135,6 +135,12 @@ elfw2(LIBELFBITS,newphdr) (elf, count) +@@ -114,6 +114,12 @@ elfw2(LIBELFBITS,newphdr) (elf, count) || count == PN_XNUM || elf->state.ELFW(elf,LIBELFBITS).phdr == NULL) { @@ -170,7 +163,7 @@ result = (ElfW2(LIBELFBITS,Phdr) *) --- elfutils/libelf/elf32_updatefile.c +++ elfutils/libelf/elf32_updatefile.c -@@ -223,6 +223,9 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf +@@ -202,6 +202,9 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf /* Write all the sections. Well, only those which are modified. */ if (shnum > 0) { @@ -180,7 +173,7 @@ 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 -@@ -645,6 +648,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf +@@ -624,6 +627,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf /* Write all the sections. Well, only those which are modified. */ if (shnum > 0) { @@ -193,7 +186,7 @@ xfct_t shdr_fctp = __elf_xfctstom[__libelf_version - 1][EV_CURRENT - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][ELF_T_SHDR]; --- elfutils/libelf/elf_begin.c +++ elfutils/libelf/elf_begin.c -@@ -165,7 +165,8 @@ get_shnum (void *map_address, unsigned c +@@ -144,7 +144,8 @@ get_shnum (void *map_address, unsigned c if (unlikely (result == 0) && ehdr.e32->e_shoff != 0) { @@ -203,7 +196,7 @@ /* Cannot read the first section header. */ return 0; -@@ -213,7 +214,8 @@ get_shnum (void *map_address, unsigned c +@@ -192,7 +193,8 @@ get_shnum (void *map_address, unsigned c if (unlikely (result == 0) && ehdr.e64->e_shoff != 0) { @@ -213,7 +206,7 @@ /* Cannot read the first section header. */ return 0; -@@ -285,6 +287,15 @@ file_read_elf (int fildes, void *map_add +@@ -264,6 +266,15 @@ file_read_elf (int fildes, void *map_add /* Could not determine the number of sections. */ return NULL; @@ -229,7 +222,7 @@ /* We can now allocate the memory. Even if there are no section headers, we allocate space for a zeroth section in case we need it later. */ const size_t scnmax = (scncnt ?: (cmd == ELF_C_RDWR || cmd == ELF_C_RDWR_MMAP) -@@ -324,6 +335,16 @@ file_read_elf (int fildes, void *map_add +@@ -303,6 +314,16 @@ file_read_elf (int fildes, void *map_add { /* We can use the mmapped memory. */ elf->state.elf32.ehdr = ehdr; @@ -246,7 +239,7 @@ elf->state.elf32.shdr = (Elf32_Shdr *) ((char *) ehdr + ehdr->e_shoff); -@@ -410,6 +431,11 @@ file_read_elf (int fildes, void *map_add +@@ -389,6 +410,11 @@ file_read_elf (int fildes, void *map_add { /* We can use the mmapped memory. */ elf->state.elf64.ehdr = ehdr; @@ -260,19 +253,19 @@ --- elfutils/libelf/elf_getarsym.c +++ elfutils/libelf/elf_getarsym.c -@@ -179,6 +179,9 @@ elf_getarsym (elf, ptr) +@@ -181,6 +181,9 @@ elf_getarsym (elf, ptr) size_t index_size = atol (tmpbuf); if (SARMAG + sizeof (struct ar_hdr) + index_size > elf->maximum_size +#if SIZE_MAX <= 4294967295U + || n >= SIZE_MAX / sizeof (Elf_Arsym) +#endif - || n * sizeof (uint32_t) > index_size) + || n * w > index_size) { /* This index table cannot be right since it does not fit into --- elfutils/libelf/elf_getshdrstrndx.c +++ elfutils/libelf/elf_getshdrstrndx.c -@@ -125,10 +125,25 @@ elf_getshdrstrndx (elf, dst) +@@ -104,10 +104,25 @@ elf_getshdrstrndx (elf, dst) if (elf->map_address != NULL && elf->state.elf32.ehdr->e_ident[EI_DATA] == MY_ELFDATA && (ALLOW_UNALIGNED @@ -301,7 +294,7 @@ else { /* We avoid reading in all the section headers. Just read -@@ -163,10 +178,25 @@ elf_getshdrstrndx (elf, dst) +@@ -142,10 +157,25 @@ elf_getshdrstrndx (elf, dst) if (elf->map_address != NULL && elf->state.elf64.ehdr->e_ident[EI_DATA] == MY_ELFDATA && (ALLOW_UNALIGNED @@ -332,7 +325,7 @@ /* We avoid reading in all the section headers. Just read --- elfutils/libelf/elf_newscn.c +++ elfutils/libelf/elf_newscn.c -@@ -104,10 +104,18 @@ elf_newscn (elf) +@@ -83,10 +83,18 @@ elf_newscn (elf) else { /* We must allocate a new element. */ @@ -358,10 +351,10 @@ /* Get information from dynamic table at the given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -93,7 +93,7 @@ gelf_getdyn (data, ndx, dst) +@@ -72,7 +72,7 @@ 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 data we are converting the format. */ @@ -370,7 +363,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); goto out; -@@ -114,7 +114,7 @@ gelf_getdyn (data, ndx, dst) +@@ -93,7 +93,7 @@ gelf_getdyn (data, ndx, dst) /* The data is already in the correct form. Just make sure the index is OK. */ @@ -385,10 +378,10 @@ /* Get library from table at the given index. - Copyright (C) 2004 Red Hat, Inc. + Copyright (C) 2004-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2004. -@@ -86,7 +86,7 @@ gelf_getlib (data, ndx, dst) +@@ -65,7 +65,7 @@ gelf_getlib (data, ndx, dst) /* The data is already in the correct form. Just make sure the index is OK. */ GElf_Lib *result = NULL; @@ -403,10 +396,10 @@ /* Get move structure at the given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -83,7 +83,7 @@ gelf_getmove (data, ndx, dst) +@@ -62,7 +62,7 @@ gelf_getmove (data, ndx, dst) /* The data is already in the correct form. Just make sure the index is OK. */ @@ -421,10 +414,10 @@ /* Get RELA relocation information at given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -71,12 +71,6 @@ gelf_getrela (data, ndx, dst) +@@ -50,12 +50,6 @@ gelf_getrela (data, ndx, dst) if (data_scn == NULL) return NULL; @@ -437,7 +430,7 @@ if (unlikely (data_scn->d.d_type != ELF_T_RELA)) { __libelf_seterrno (ELF_E_INVALID_HANDLE); -@@ -93,7 +87,7 @@ gelf_getrela (data, ndx, dst) +@@ -72,7 +66,7 @@ gelf_getrela (data, ndx, dst) if (scn->elf->class == ELFCLASS32) { /* We have to convert the data. */ @@ -446,7 +439,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); result = NULL; -@@ -114,7 +108,7 @@ gelf_getrela (data, ndx, dst) +@@ -93,7 +87,7 @@ gelf_getrela (data, ndx, dst) { /* Simply copy the data after we made sure we are actually getting correct data. */ @@ -461,10 +454,10 @@ /* Get REL relocation information at given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -71,12 +71,6 @@ gelf_getrel (data, ndx, dst) +@@ -50,12 +50,6 @@ gelf_getrel (data, ndx, dst) if (data_scn == NULL) return NULL; @@ -477,7 +470,7 @@ if (unlikely (data_scn->d.d_type != ELF_T_REL)) { __libelf_seterrno (ELF_E_INVALID_HANDLE); -@@ -93,7 +87,7 @@ gelf_getrel (data, ndx, dst) +@@ -72,7 +66,7 @@ gelf_getrel (data, ndx, dst) if (scn->elf->class == ELFCLASS32) { /* We have to convert the data. */ @@ -486,7 +479,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); result = NULL; -@@ -113,7 +107,7 @@ gelf_getrel (data, ndx, dst) +@@ -92,7 +86,7 @@ gelf_getrel (data, ndx, dst) { /* Simply copy the data after we made sure we are actually getting correct data. */ @@ -501,10 +494,10 @@ /* Get symbol information from symbol table at the given index. - Copyright (C) 1999, 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 1999-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 1999. -@@ -90,7 +90,7 @@ gelf_getsym (data, ndx, dst) +@@ -69,7 +69,7 @@ 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 data we are converting the format. */ @@ -513,7 +506,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); goto out; -@@ -119,7 +119,7 @@ gelf_getsym (data, ndx, dst) +@@ -98,7 +98,7 @@ gelf_getsym (data, ndx, dst) /* The data is already in the correct form. Just make sure the index is OK. */ @@ -528,10 +521,10 @@ /* Get additional symbol information from symbol table at the given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -84,7 +84,7 @@ gelf_getsyminfo (data, ndx, dst) +@@ -63,7 +63,7 @@ gelf_getsyminfo (data, ndx, dst) /* The data is already in the correct form. Just make sure the index is OK. */ @@ -547,10 +540,10 @@ at the given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -90,7 +90,7 @@ gelf_getsymshndx (symdata, shndxdata, nd +@@ -69,7 +69,7 @@ gelf_getsymshndx (symdata, shndxdata, nd section index table. */ if (likely (shndxdata_scn != NULL)) { @@ -559,7 +552,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); goto out; -@@ -110,7 +110,7 @@ gelf_getsymshndx (symdata, shndxdata, nd +@@ -89,7 +89,7 @@ gelf_getsymshndx (symdata, shndxdata, nd table entries has to be adopted. The user better has provided a buffer where we can store the information. While copying the data we are converting the format. */ @@ -568,7 +561,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); goto out; -@@ -139,7 +139,7 @@ gelf_getsymshndx (symdata, shndxdata, nd +@@ -118,7 +118,7 @@ gelf_getsymshndx (symdata, shndxdata, nd /* The data is already in the correct form. Just make sure the index is OK. */ @@ -583,10 +576,10 @@ /* Get symbol version information at the given index. - Copyright (C) 1999, 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 1999-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 1999. -@@ -92,7 +92,7 @@ gelf_getversym (data, ndx, dst) +@@ -71,7 +71,7 @@ gelf_getversym (data, ndx, dst) /* The data is already in the correct form. Just make sure the index is OK. */ @@ -601,10 +594,10 @@ /* Update information in dynamic table at the given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -71,12 +71,6 @@ gelf_update_dyn (data, ndx, src) +@@ -50,12 +50,6 @@ gelf_update_dyn (data, ndx, src) if (data == NULL) return 0; @@ -617,7 +610,7 @@ if (unlikely (data_scn->d.d_type != ELF_T_DYN)) { /* The type of the data better should match. */ -@@ -102,7 +96,7 @@ gelf_update_dyn (data, ndx, src) +@@ -81,7 +75,7 @@ gelf_update_dyn (data, ndx, src) } /* Check whether we have to resize the data buffer. */ @@ -626,7 +619,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); goto out; -@@ -116,7 +110,7 @@ gelf_update_dyn (data, ndx, src) +@@ -95,7 +89,7 @@ gelf_update_dyn (data, ndx, src) else { /* Check whether we have to resize the data buffer. */ @@ -641,10 +634,10 @@ /* Update library in table at the given index. - Copyright (C) 2004 Red Hat, Inc. + Copyright (C) 2004-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2004. -@@ -68,12 +68,6 @@ gelf_update_lib (data, ndx, src) +@@ -47,12 +47,6 @@ gelf_update_lib (data, ndx, src) if (data == NULL) return 0; @@ -657,7 +650,7 @@ Elf_Data_Scn *data_scn = (Elf_Data_Scn *) data; if (unlikely (data_scn->d.d_type != ELF_T_LIB)) { -@@ -87,7 +81,7 @@ gelf_update_lib (data, ndx, src) +@@ -66,7 +60,7 @@ gelf_update_lib (data, ndx, src) /* Check whether we have to resize the data buffer. */ int result = 0; @@ -672,10 +665,10 @@ /* Update move structure at the given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -75,8 +75,7 @@ gelf_update_move (data, ndx, src) +@@ -54,8 +54,7 @@ gelf_update_move (data, ndx, src) assert (sizeof (GElf_Move) == sizeof (Elf64_Move)); /* Check whether we have to resize the data buffer. */ @@ -691,10 +684,10 @@ /* Update RELA relocation information at given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -68,12 +68,6 @@ gelf_update_rela (Elf_Data *dst, int ndx +@@ -47,12 +47,6 @@ gelf_update_rela (Elf_Data *dst, int ndx if (dst == NULL) return 0; @@ -707,7 +700,7 @@ if (unlikely (data_scn->d.d_type != ELF_T_RELA)) { /* The type of the data better should match. */ -@@ -101,7 +95,7 @@ gelf_update_rela (Elf_Data *dst, int ndx +@@ -80,7 +74,7 @@ gelf_update_rela (Elf_Data *dst, int ndx } /* Check whether we have to resize the data buffer. */ @@ -716,7 +709,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); goto out; -@@ -117,7 +111,7 @@ gelf_update_rela (Elf_Data *dst, int ndx +@@ -96,7 +90,7 @@ gelf_update_rela (Elf_Data *dst, int ndx else { /* Check whether we have to resize the data buffer. */ @@ -731,10 +724,10 @@ /* Update REL relocation information at given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -68,12 +68,6 @@ gelf_update_rel (Elf_Data *dst, int ndx, +@@ -47,12 +47,6 @@ gelf_update_rel (Elf_Data *dst, int ndx, if (dst == NULL) return 0; @@ -747,7 +740,7 @@ if (unlikely (data_scn->d.d_type != ELF_T_REL)) { /* The type of the data better should match. */ -@@ -99,7 +93,7 @@ gelf_update_rel (Elf_Data *dst, int ndx, +@@ -78,7 +72,7 @@ gelf_update_rel (Elf_Data *dst, int ndx, } /* Check whether we have to resize the data buffer. */ @@ -756,7 +749,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); goto out; -@@ -114,7 +108,7 @@ gelf_update_rel (Elf_Data *dst, int ndx, +@@ -93,7 +87,7 @@ gelf_update_rel (Elf_Data *dst, int ndx, else { /* Check whether we have to resize the data buffer. */ @@ -771,10 +764,10 @@ /* Update symbol information in symbol table at the given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -72,12 +72,6 @@ gelf_update_sym (data, ndx, src) +@@ -51,12 +51,6 @@ gelf_update_sym (data, ndx, src) if (data == NULL) return 0; @@ -787,7 +780,7 @@ if (unlikely (data_scn->d.d_type != ELF_T_SYM)) { /* The type of the data better should match. */ -@@ -102,7 +96,7 @@ gelf_update_sym (data, ndx, src) +@@ -81,7 +75,7 @@ gelf_update_sym (data, ndx, src) } /* Check whether we have to resize the data buffer. */ @@ -796,7 +789,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); goto out; -@@ -125,7 +119,7 @@ gelf_update_sym (data, ndx, src) +@@ -104,7 +98,7 @@ gelf_update_sym (data, ndx, src) else { /* Check whether we have to resize the data buffer. */ @@ -811,10 +804,10 @@ /* Update additional symbol information in symbol table at the given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -72,12 +72,6 @@ gelf_update_syminfo (data, ndx, src) +@@ -51,12 +51,6 @@ gelf_update_syminfo (data, ndx, src) if (data == NULL) return 0; @@ -827,7 +820,7 @@ if (unlikely (data_scn->d.d_type != ELF_T_SYMINFO)) { /* The type of the data better should match. */ -@@ -93,7 +87,7 @@ gelf_update_syminfo (data, ndx, src) +@@ -72,7 +66,7 @@ gelf_update_syminfo (data, ndx, src) rwlock_wrlock (scn->elf->lock); /* Check whether we have to resize the data buffer. */ @@ -843,10 +836,10 @@ given index. - Copyright (C) 2000, 2001, 2002 Red Hat, Inc. + Copyright (C) 2000-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2000. -@@ -77,12 +77,6 @@ gelf_update_symshndx (symdata, shndxdata +@@ -56,12 +56,6 @@ gelf_update_symshndx (symdata, shndxdata if (symdata == NULL) return 0; @@ -859,7 +852,7 @@ if (unlikely (symdata_scn->d.d_type != ELF_T_SYM)) { /* The type of the data better should match. */ -@@ -128,7 +122,7 @@ gelf_update_symshndx (symdata, shndxdata +@@ -107,7 +101,7 @@ gelf_update_symshndx (symdata, shndxdata } /* Check whether we have to resize the data buffer. */ @@ -868,7 +861,7 @@ { __libelf_seterrno (ELF_E_INVALID_INDEX); goto out; -@@ -151,7 +145,7 @@ gelf_update_symshndx (symdata, shndxdata +@@ -130,7 +124,7 @@ gelf_update_symshndx (symdata, shndxdata else { /* Check whether we have to resize the data buffer. */ @@ -883,10 +876,10 @@ /* Update symbol version information. - Copyright (C) 2001, 2002 Red Hat, Inc. + Copyright (C) 2001-2009 Red Hat, Inc. - This file is part of Red Hat elfutils. + This file is part of elfutils. Written by Ulrich Drepper , 2001. -@@ -75,8 +75,7 @@ gelf_update_versym (data, ndx, src) +@@ -54,8 +54,7 @@ gelf_update_versym (data, ndx, src) assert (sizeof (GElf_Versym) == sizeof (Elf64_Versym)); /* Check whether we have to resize the data buffer. */ @@ -898,7 +891,7 @@ return 0; --- elfutils/libelf/libelfP.h +++ elfutils/libelf/libelfP.h -@@ -608,4 +608,8 @@ extern uint32_t __libelf_crc32 (uint32_t +@@ -587,4 +587,8 @@ 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) @@ -909,7 +902,7 @@ #endif /* libelfP.h */ --- elfutils/src/ChangeLog +++ elfutils/src/ChangeLog -@@ -228,6 +228,12 @@ +@@ -344,6 +344,12 @@ * readelf.c (dwarf_attr_string): Grok DW_AT_GNU_odr_signature. @@ -922,7 +915,7 @@ 2011-02-11 Roland McGrath * elfcmp.c (verbose): New variable. -@@ -1940,6 +1946,16 @@ +@@ -2056,6 +2062,16 @@ object symbols or symbols with unknown type. (check_rel): Likewise. @@ -939,7 +932,7 @@ 2005-06-08 Roland McGrath * readelf.c (print_ops): Add consts. -@@ -1985,6 +2001,19 @@ +@@ -2101,6 +2117,19 @@ * readelf.c (dwarf_tag_string): Add new tags. @@ -961,7 +954,7 @@ * strip.c (handle_elf): Don't translate hash and versym data formats, --- elfutils/src/elflint.c +++ elfutils/src/elflint.c -@@ -131,6 +131,10 @@ static uint32_t shstrndx; +@@ -123,6 +123,10 @@ static uint32_t shstrndx; /* Array to count references in section groups. */ static int *scnref; @@ -972,7 +965,7 @@ int main (int argc, char *argv[]) -@@ -319,10 +323,19 @@ section_name (Ebl *ebl, int idx) +@@ -311,10 +315,19 @@ section_name (Ebl *ebl, int idx) { GElf_Shdr shdr_mem; GElf_Shdr *shdr; @@ -993,7 +986,7 @@ } -@@ -344,11 +357,6 @@ static const int valid_e_machine[] = +@@ -337,11 +350,6 @@ static const int valid_e_machine[] = (sizeof (valid_e_machine) / sizeof (valid_e_machine[0])) @@ -1005,7 +998,7 @@ static void check_elf_header (Ebl *ebl, GElf_Ehdr *ehdr, size_t size) { -@@ -632,7 +640,8 @@ section [%2d] '%s': symbol table cannot +@@ -625,7 +633,8 @@ section [%2d] '%s': symbol table cannot } } @@ -1015,7 +1008,7 @@ ERROR (gettext ("\ section [%2u] '%s': entry size is does not match ElfXX_Sym\n"), idx, section_name (ebl, idx)); -@@ -670,7 +679,7 @@ section [%2d] '%s': XINDEX for zeroth en +@@ -663,7 +672,7 @@ section [%2d] '%s': XINDEX for zeroth en xndxscnidx, section_name (ebl, xndxscnidx)); } @@ -1024,7 +1017,7 @@ { sym = gelf_getsymshndx (data, xndxdata, cnt, &sym_mem, &xndx); if (sym == NULL) -@@ -690,7 +699,8 @@ section [%2d] '%s': symbol %zu: invalid +@@ -683,7 +692,8 @@ section [%2d] '%s': symbol %zu: invalid else { name = elf_strptr (ebl->elf, shdr->sh_link, sym->st_name); @@ -1034,7 +1027,7 @@ } if (sym->st_shndx == SHN_XINDEX) -@@ -1039,9 +1049,11 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e +@@ -1032,9 +1042,11 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e { GElf_Shdr rcshdr_mem; const GElf_Shdr *rcshdr = gelf_getshdr (scn, &rcshdr_mem); @@ -1048,7 +1041,7 @@ { /* Found the dynamic section. Look through it. */ Elf_Data *d = elf_getdata (scn, NULL); -@@ -1051,7 +1063,9 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e +@@ -1044,7 +1056,9 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e { GElf_Dyn dyn_mem; GElf_Dyn *dyn = gelf_getdyn (d, cnt, &dyn_mem); @@ -1059,7 +1052,7 @@ if (dyn->d_tag == DT_RELCOUNT) { -@@ -1065,7 +1079,9 @@ section [%2d] '%s': DT_RELCOUNT used for +@@ -1058,7 +1072,9 @@ section [%2d] '%s': DT_RELCOUNT used for /* Does the number specified number of relative relocations exceed the total number of relocations? */ @@ -1070,7 +1063,7 @@ ERROR (gettext ("\ section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"), idx, section_name (ebl, idx), -@@ -1225,7 +1241,8 @@ section [%2d] '%s': no relocations for m +@@ -1218,7 +1234,8 @@ section [%2d] '%s': no relocations for m } } @@ -1080,7 +1073,7 @@ 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"), -@@ -1448,7 +1465,8 @@ check_rela (Ebl *ebl, GElf_Ehdr *ehdr, G +@@ -1441,7 +1458,8 @@ check_rela (Ebl *ebl, GElf_Ehdr *ehdr, G Elf_Data *symdata = elf_getdata (symscn, NULL); enum load_state state = state_undecided; @@ -1090,7 +1083,7 @@ { GElf_Rela rela_mem; GElf_Rela *rela = gelf_getrela (data, cnt, &rela_mem); -@@ -1498,7 +1516,8 @@ check_rel (Ebl *ebl, GElf_Ehdr *ehdr, GE +@@ -1491,7 +1509,8 @@ check_rel (Ebl *ebl, GElf_Ehdr *ehdr, GE Elf_Data *symdata = elf_getdata (symscn, NULL); enum load_state state = state_undecided; @@ -1100,7 +1093,7 @@ { GElf_Rel rel_mem; GElf_Rel *rel = gelf_getrel (data, cnt, &rel_mem); -@@ -1597,7 +1616,8 @@ section [%2d] '%s': referenced as string +@@ -1590,7 +1609,8 @@ section [%2d] '%s': referenced as string shdr->sh_link, section_name (ebl, shdr->sh_link), idx, section_name (ebl, idx)); @@ -1110,7 +1103,7 @@ ERROR (gettext ("\ section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"), idx, section_name (ebl, idx)); -@@ -1607,7 +1627,7 @@ section [%2d] '%s': section entry size d +@@ -1600,7 +1620,7 @@ section [%2d] '%s': section entry size d idx, section_name (ebl, idx)); bool non_null_warned = false; @@ -1119,7 +1112,7 @@ { GElf_Dyn dyn_mem; GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dyn_mem); -@@ -1879,6 +1899,8 @@ section [%2d] '%s': entry size does not +@@ -1872,6 +1892,8 @@ section [%2d] '%s': entry size does not idx, section_name (ebl, idx)); if (symshdr != NULL @@ -1128,7 +1121,7 @@ && (shdr->sh_size / shdr->sh_entsize < symshdr->sh_size / symshdr->sh_entsize)) ERROR (gettext ("\ -@@ -1905,6 +1927,12 @@ section [%2d] '%s': extended section ind +@@ -1898,6 +1920,12 @@ section [%2d] '%s': extended section ind } Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL); @@ -1141,7 +1134,7 @@ if (*((Elf32_Word *) data->d_buf) != 0) ERROR (gettext ("symbol 0 should have zero extended section index\n")); -@@ -1947,7 +1975,7 @@ section [%2d] '%s': hash table section i +@@ -1940,7 +1968,7 @@ section [%2d] '%s': hash table section i size_t maxidx = nchain; @@ -1150,7 +1143,7 @@ { size_t symsize = symshdr->sh_size / symshdr->sh_entsize; -@@ -1958,18 +1986,28 @@ section [%2d] '%s': hash table section i +@@ -1951,18 +1979,28 @@ section [%2d] '%s': hash table section i maxidx = symsize; } @@ -1181,7 +1174,7 @@ } -@@ -1999,18 +2037,28 @@ section [%2d] '%s': hash table section i +@@ -1992,18 +2030,28 @@ section [%2d] '%s': hash table section i maxidx = symsize; } @@ -1213,7 +1206,7 @@ } -@@ -2035,7 +2083,7 @@ section [%2d] '%s': bitmask size not pow +@@ -2028,7 +2076,7 @@ section [%2d] '%s': bitmask size not pow if (shdr->sh_size < (4 + bitmask_words + nbuckets) * sizeof (Elf32_Word)) { ERROR (gettext ("\ @@ -1222,7 +1215,7 @@ idx, section_name (ebl, idx), (long int) shdr->sh_size, (long int) ((4 + bitmask_words + nbuckets) * sizeof (Elf32_Word))); return; -@@ -2707,8 +2755,9 @@ section [%2d] '%s' refers in sh_link to +@@ -2700,8 +2748,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. */ @@ -1236,7 +1229,7 @@ idx, section_name (ebl, idx), --- elfutils/src/readelf.c +++ elfutils/src/readelf.c -@@ -1191,6 +1191,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G +@@ -1189,6 +1189,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G Elf32_Word *grpref = (Elf32_Word *) data->d_buf; GElf_Sym sym_mem; @@ -1245,7 +1238,7 @@ printf ((grpref[0] & GRP_COMDAT) ? ngettext ("\ \nCOMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n", -@@ -1203,8 +1205,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G +@@ -1201,8 +1203,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), @@ -1256,7 +1249,7 @@ ?: gettext (""), data->d_size / sizeof (Elf32_Word) - 1); -@@ -1355,10 +1357,12 @@ static void +@@ -1353,10 +1355,12 @@ static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) { int class = gelf_getclass (ebl->elf); @@ -1270,7 +1263,7 @@ /* Get the data of the section. */ data = elf_getdata (scn, NULL); -@@ -1370,21 +1374,26 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, +@@ -1368,21 +1372,26 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, error (EXIT_FAILURE, 0, gettext ("cannot get section header string table index")); @@ -1303,7 +1296,7 @@ { GElf_Dyn dynmem; GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dynmem); -@@ -1533,7 +1542,8 @@ static void +@@ -1531,7 +1540,8 @@ static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr) { int class = gelf_getclass (ebl->elf); @@ -1313,7 +1306,7 @@ /* Get the data of the section. */ Elf_Data *data = elf_getdata (scn, NULL); -@@ -1719,7 +1729,8 @@ static void +@@ -1717,7 +1727,8 @@ static void handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr) { int class = gelf_getclass (ebl->elf); @@ -1323,7 +1316,7 @@ /* Get the data of the section. */ Elf_Data *data = elf_getdata (scn, NULL); -@@ -1966,6 +1977,13 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G +@@ -1964,6 +1975,13 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G error (EXIT_FAILURE, 0, gettext ("cannot get section header string table index")); @@ -1337,7 +1330,7 @@ /* Now we can compute the number of entries in the section. */ unsigned int nsyms = data->d_size / (class == ELFCLASS32 ? sizeof (Elf32_Sym) -@@ -1976,15 +1994,12 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G +@@ -1974,15 +1992,12 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G nsyms), (unsigned int) elf_ndxscn (scn), elf_strptr (ebl->elf, shstrndx, shdr->sh_name), nsyms); @@ -1354,7 +1347,7 @@ fputs_unlocked (class == ELFCLASS32 ? gettext ("\ -@@ -2220,7 +2235,13 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, +@@ -2218,7 +2233,13 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, error (EXIT_FAILURE, 0, gettext ("cannot get section header string table index")); @@ -1369,7 +1362,7 @@ printf (ngettext ("\ \nVersion needs section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", "\ -@@ -2231,9 +2252,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, +@@ -2229,9 +2250,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, shdr->sh_offset, (unsigned int) shdr->sh_link, @@ -1380,7 +1373,7 @@ unsigned int offset = 0; for (int cnt = shdr->sh_info; --cnt >= 0; ) -@@ -2286,8 +2305,14 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G +@@ -2284,8 +2303,14 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G error (EXIT_FAILURE, 0, gettext ("cannot get section header string table index")); @@ -1396,7 +1389,7 @@ printf (ngettext ("\ \nVersion definition section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", "\ -@@ -2299,9 +2324,7 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G +@@ -2297,9 +2322,7 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, shdr->sh_offset, (unsigned int) shdr->sh_link, @@ -1407,7 +1400,7 @@ unsigned int offset = 0; for (int cnt = shdr->sh_info; --cnt >= 0; ) -@@ -2563,25 +2586,30 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, G +@@ -2561,25 +2584,30 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, G filename = NULL; } @@ -1445,7 +1438,7 @@ { if (cnt % 2 == 0) printf ("\n %4d:", cnt); -@@ -2630,7 +2658,17 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, +@@ -2628,7 +2656,17 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt) ++counts[lengths[cnt]]; @@ -1464,7 +1457,7 @@ 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", "\ -@@ -2643,9 +2681,7 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, +@@ -2641,9 +2679,7 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, shdr->sh_addr, shdr->sh_offset, (unsigned int) shdr->sh_link, @@ -1475,7 +1468,7 @@ if (extrastr != NULL) fputs (extrastr, stdout); -@@ -2905,7 +2941,8 @@ print_liblist (Ebl *ebl) +@@ -2903,7 +2939,8 @@ print_liblist (Ebl *ebl) if (shdr != NULL && shdr->sh_type == SHT_GNU_LIBLIST) { @@ -1485,7 +1478,7 @@ printf (ngettext ("\ \nLibrary list section [%2zu] '%s' at offset %#0" PRIx64 " contains %d entry:\n", "\ -@@ -4646,6 +4683,16 @@ print_debug_aranges_section (Dwfl_Module +@@ -4164,6 +4201,16 @@ print_debug_aranges_section (Dwfl_Module return; } @@ -1504,7 +1497,7 @@ "\ --- elfutils/src/strip.c +++ elfutils/src/strip.c -@@ -572,6 +572,11 @@ handle_elf (int fd, Elf *elf, const char +@@ -564,6 +564,11 @@ handle_elf (int fd, Elf *elf, const char goto fail_close; } @@ -1516,7 +1509,7 @@ /* Storage for section information. We leave room for two more entries since we unconditionally create a section header string table. Maybe some weird tool created an ELF file without one. -@@ -593,7 +598,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -585,7 +590,7 @@ handle_elf (int fd, Elf *elf, const char { /* This should always be true (i.e., there should not be any holes in the numbering). */ @@ -1525,7 +1518,7 @@ shdr_info[cnt].scn = scn; -@@ -606,6 +611,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -598,6 +603,7 @@ handle_elf (int fd, Elf *elf, const char shdr_info[cnt].shdr.sh_name); if (shdr_info[cnt].name == NULL) { @@ -1533,7 +1526,7 @@ error (0, 0, gettext ("illformed file '%s'"), fname); goto fail_close; } -@@ -615,6 +621,8 @@ handle_elf (int fd, Elf *elf, const char +@@ -607,6 +613,8 @@ handle_elf (int fd, Elf *elf, const char /* Remember the shdr.sh_link value. */ shdr_info[cnt].old_sh_link = shdr_info[cnt].shdr.sh_link; @@ -1542,7 +1535,7 @@ /* Sections in files other than relocatable object files which are not loaded can be freely moved by us. In relocatable -@@ -627,7 +635,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -619,7 +627,7 @@ handle_elf (int fd, Elf *elf, const char appropriate reference. */ if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB_SHNDX)) { @@ -1551,7 +1544,7 @@ shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx = cnt; } else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GROUP)) -@@ -644,7 +652,12 @@ handle_elf (int fd, Elf *elf, const char +@@ -636,7 +644,12 @@ handle_elf (int fd, Elf *elf, const char for (inner = 1; inner < shdr_info[cnt].data->d_size / sizeof (Elf32_Word); ++inner) @@ -1564,7 +1557,7 @@ if (inner == 1 || (inner == 2 && (grpref[0] & GRP_COMDAT) == 0)) /* If the section group contains only one element and this -@@ -655,7 +668,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -647,7 +660,7 @@ handle_elf (int fd, Elf *elf, const char } else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GNU_versym)) { @@ -1573,7 +1566,7 @@ shdr_info[shdr_info[cnt].shdr.sh_link].version_idx = cnt; } -@@ -663,7 +676,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -655,7 +668,7 @@ handle_elf (int fd, Elf *elf, const char discarded right away. */ if ((shdr_info[cnt].shdr.sh_flags & SHF_GROUP) != 0) { @@ -1582,7 +1575,7 @@ if (shdr_info[shdr_info[cnt].group_idx].idx == 0) { -@@ -739,10 +752,14 @@ handle_elf (int fd, Elf *elf, const char +@@ -731,10 +744,14 @@ handle_elf (int fd, Elf *elf, const char { /* If a relocation section is marked as being removed make sure the section it is relocating is removed, too. */ @@ -1600,7 +1593,7 @@ /* If a group section is marked as being removed make sure all the sections it contains are being removed, too. */ -@@ -786,7 +803,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -778,7 +795,7 @@ handle_elf (int fd, Elf *elf, const char if (shdr_info[cnt].symtab_idx != 0 && shdr_info[shdr_info[cnt].symtab_idx].data == NULL) { @@ -1609,7 +1602,7 @@ shdr_info[shdr_info[cnt].symtab_idx].data = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn, -@@ -826,6 +843,9 @@ handle_elf (int fd, Elf *elf, const char +@@ -818,6 +835,9 @@ handle_elf (int fd, Elf *elf, const char else if (scnidx == SHN_XINDEX) scnidx = xndx; @@ -1619,7 +1612,7 @@ if (shdr_info[scnidx].idx == 0) /* This symbol table has a real symbol in a discarded section. So preserve the -@@ -856,12 +876,16 @@ handle_elf (int fd, Elf *elf, const char +@@ -848,12 +868,16 @@ handle_elf (int fd, Elf *elf, const char } /* Handle references through sh_info. */ @@ -1638,7 +1631,7 @@ /* Mark the section as investigated. */ shdr_info[cnt].idx = 2; -@@ -1002,7 +1026,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -994,7 +1018,7 @@ handle_elf (int fd, Elf *elf, const char error (EXIT_FAILURE, 0, gettext ("while generating output file: %s"), elf_errmsg (-1)); @@ -1647,7 +1640,7 @@ /* Add this name to the section header string table. */ shdr_info[cnt].se = ebl_strtabadd (shst, shdr_info[cnt].name, 0); -@@ -1039,7 +1063,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -1031,7 +1055,7 @@ handle_elf (int fd, Elf *elf, const char error (EXIT_FAILURE, 0, gettext ("while create section header section: %s"), elf_errmsg (-1)); @@ -1656,7 +1649,7 @@ shdr_info[cnt].data = elf_newdata (shdr_info[cnt].newscn); if (shdr_info[cnt].data == NULL) -@@ -1095,7 +1119,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -1087,7 +1111,7 @@ handle_elf (int fd, Elf *elf, const char error (EXIT_FAILURE, 0, gettext ("while create section header section: %s"), elf_errmsg (-1)); @@ -1665,7 +1658,7 @@ /* Finalize the string table and fill in the correct indices in the section headers. */ -@@ -1185,20 +1209,20 @@ handle_elf (int fd, Elf *elf, const char +@@ -1177,20 +1201,20 @@ handle_elf (int fd, Elf *elf, const char shndxdata = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn, NULL); @@ -1689,7 +1682,7 @@ >= shdr_info[cnt].data->d_size / elsize); } -@@ -1253,7 +1277,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -1245,7 +1269,7 @@ handle_elf (int fd, Elf *elf, const char sec = shdr_info[sym->st_shndx].idx; else { @@ -1698,7 +1691,7 @@ sec = shdr_info[xshndx].idx; } -@@ -1274,7 +1298,7 @@ handle_elf (int fd, Elf *elf, const char +@@ -1266,7 +1290,7 @@ handle_elf (int fd, Elf *elf, const char nxshndx = sec; } @@ -1707,7 +1700,7 @@ if ((inner != destidx || nshndx != sym->st_shndx || (shndxdata != NULL && nxshndx != xshndx)) -@@ -1301,9 +1325,11 @@ handle_elf (int fd, Elf *elf, const char +@@ -1293,9 +1317,11 @@ handle_elf (int fd, Elf *elf, const char { size_t sidx = (sym->st_shndx != SHN_XINDEX ? sym->st_shndx : xshndx); @@ -1722,7 +1715,7 @@ } } -@@ -1491,11 +1517,11 @@ handle_elf (int fd, Elf *elf, const char +@@ -1483,11 +1509,11 @@ handle_elf (int fd, Elf *elf, const char { GElf_Sym sym_mem; GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem); @@ -1736,7 +1729,7 @@ size_t hidx = elf_hash (name) % nbucket; if (bucket[hidx] == 0) -@@ -1514,8 +1540,8 @@ handle_elf (int fd, Elf *elf, const char +@@ -1506,8 +1532,8 @@ handle_elf (int fd, Elf *elf, const char else { /* Alpha and S390 64-bit use 64-bit SHT_HASH entries. */ @@ -1747,7 +1740,7 @@ Elf64_Xword *bucket = (Elf64_Xword *) hashd->d_buf; -@@ -1545,11 +1571,11 @@ handle_elf (int fd, Elf *elf, const char +@@ -1537,11 +1563,11 @@ handle_elf (int fd, Elf *elf, const char { GElf_Sym sym_mem; GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem); diff --git a/packages/devel/elfutils/patches/elfutils-no_textrel_check.patch b/packages/devel/elfutils/patches/elfutils-no_textrel_check.patch new file mode 100644 index 0000000000..d2d0c9d6ad --- /dev/null +++ b/packages/devel/elfutils/patches/elfutils-no_textrel_check.patch @@ -0,0 +1,77 @@ +diff -Naur elfutils-0.155/libasm/Makefile.am elfutils-0.155.patch/libasm/Makefile.am +--- elfutils-0.155/libasm/Makefile.am 2012-08-27 20:27:31.000000000 +0200 ++++ elfutils-0.155.patch/libasm/Makefile.am 2013-03-05 18:11:43.841545009 +0100 +@@ -69,7 +69,6 @@ + -Wl,--version-script,$(srcdir)/libasm.map,--no-undefined \ + -Wl,--soname,$@.$(VERSION) \ + ../libebl/libebl.a ../libelf/libelf.so $(libasm_so_LDLIBS) +- if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi + ln -fs $@ $@.$(VERSION) + + install: install-am libasm.so +diff -Naur elfutils-0.155/libasm/Makefile.in elfutils-0.155.patch/libasm/Makefile.in +--- elfutils-0.155/libasm/Makefile.in 2012-08-27 20:29:45.000000000 +0200 ++++ elfutils-0.155.patch/libasm/Makefile.in 2013-03-05 18:12:05.604432305 +0100 +@@ -654,7 +654,6 @@ + @MUDFLAP_FALSE@ -Wl,--version-script,$(srcdir)/libasm.map,--no-undefined \ + @MUDFLAP_FALSE@ -Wl,--soname,$@.$(VERSION) \ + @MUDFLAP_FALSE@ ../libebl/libebl.a ../libelf/libelf.so $(libasm_so_LDLIBS) +-@MUDFLAP_FALSE@ if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi + @MUDFLAP_FALSE@ ln -fs $@ $@.$(VERSION) + + @MUDFLAP_FALSE@install: install-am libasm.so +diff -Naur elfutils-0.155/libdw/Makefile.am elfutils-0.155.patch/libdw/Makefile.am +--- elfutils-0.155/libdw/Makefile.am 2012-08-27 20:27:31.000000000 +0200 ++++ elfutils-0.155.patch/libdw/Makefile.am 2013-03-05 18:12:26.753322780 +0100 +@@ -112,7 +112,6 @@ + -Wl,--version-script,$<,--no-undefined \ + -Wl,--whole-archive $(filter-out $<,$^) -Wl,--no-whole-archive\ + -ldl $(zip_LIBS) +- if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi + ln -fs $@ $@.$(VERSION) + + install: install-am libdw.so +diff -Naur elfutils-0.155/libdw/Makefile.in elfutils-0.155.patch/libdw/Makefile.in +--- elfutils-0.155/libdw/Makefile.in 2012-08-27 20:29:45.000000000 +0200 ++++ elfutils-0.155.patch/libdw/Makefile.in 2013-03-05 18:12:41.272246520 +0100 +@@ -844,7 +844,6 @@ + @MUDFLAP_FALSE@ -Wl,--version-script,$<,--no-undefined \ + @MUDFLAP_FALSE@ -Wl,--whole-archive $(filter-out $<,$^) -Wl,--no-whole-archive\ + @MUDFLAP_FALSE@ -ldl $(zip_LIBS) +-@MUDFLAP_FALSE@ if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi + @MUDFLAP_FALSE@ ln -fs $@ $@.$(VERSION) + + @MUDFLAP_FALSE@install: install-am libdw.so +diff -Naur elfutils-0.155/libelf/Makefile.am elfutils-0.155.patch/libelf/Makefile.am +--- elfutils-0.155/libelf/Makefile.am 2012-08-27 20:27:31.000000000 +0200 ++++ elfutils-0.155.patch/libelf/Makefile.am 2013-03-05 18:13:23.328024851 +0100 +@@ -106,7 +106,6 @@ + $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \ + -Wl,--version-script,$(srcdir)/libelf.map,--no-undefined \ + -Wl,--soname,$@.$(VERSION),-z,defs,-z,relro $(libelf_so_LDLIBS) +- if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi + ln -fs $@ $@.$(VERSION) + + install: install-am libelf.so +diff -Naur elfutils-0.155/libelf/Makefile.in elfutils-0.155.patch/libelf/Makefile.in +--- elfutils-0.155/libelf/Makefile.in 2012-08-27 20:29:45.000000000 +0200 ++++ elfutils-0.155.patch/libelf/Makefile.in 2013-03-05 18:13:37.270951393 +0100 +@@ -830,7 +830,6 @@ + @MUDFLAP_FALSE@ $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \ + @MUDFLAP_FALSE@ -Wl,--version-script,$(srcdir)/libelf.map,--no-undefined \ + @MUDFLAP_FALSE@ -Wl,--soname,$@.$(VERSION),-z,defs,-z,relro $(libelf_so_LDLIBS) +-@MUDFLAP_FALSE@ if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi + @MUDFLAP_FALSE@ ln -fs $@ $@.$(VERSION) + + @MUDFLAP_FALSE@install: install-am libelf.so +diff -Naur elfutils-0.155/src/Makefile.in elfutils-0.155.patch/src/Makefile.in +--- elfutils-0.155/src/Makefile.in 2012-08-27 20:29:46.000000000 +0200 ++++ elfutils-0.155.patch/src/Makefile.in 2013-03-05 18:14:22.361713943 +0100 +@@ -867,7 +867,6 @@ + @NATIVE_LD_FALSE@ $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \ + @NATIVE_LD_FALSE@ $(libelf) $(libeu) \ + @NATIVE_LD_FALSE@ -Wl,--version-script,$(srcdir)/libld_elf_i386.map +-@NATIVE_LD_FALSE@ $(textrel_check) + + # Special rule to make it possible to define libld_elf_a_SOURCES as we do. + # Otherwise make would complain. diff --git a/packages/devel/elfutils/patches/elfutils-only_libdw_libelf.patch b/packages/devel/elfutils/patches/elfutils-only_libdw_libelf.patch new file mode 100644 index 0000000000..bd9a771a03 --- /dev/null +++ b/packages/devel/elfutils/patches/elfutils-only_libdw_libelf.patch @@ -0,0 +1,26 @@ +diff -Naur elfutils-0.155/Makefile.am elfutils-0.155.patch/Makefile.am +--- elfutils-0.155/Makefile.am 2012-08-27 20:27:31.000000000 +0200 ++++ elfutils-0.155.patch/Makefile.am 2013-03-05 18:38:47.565095550 +0100 +@@ -23,8 +23,7 @@ + pkginclude_HEADERS = version.h + + # Add doc back when we have some real content. +-SUBDIRS = config m4 lib libelf libebl libdwfl libdw libcpu libasm backends \ +- src po tests ++SUBDIRS = config m4 lib libelf libebl libdwfl libdw + + EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \ + COPYING COPYING-GPLV2 COPYING-LGPLV3 +diff -Naur elfutils-0.155/Makefile.in elfutils-0.155.patch/Makefile.in +--- elfutils-0.155/Makefile.in 2012-08-27 20:29:45.000000000 +0200 ++++ elfutils-0.155.patch/Makefile.in 2013-03-05 18:39:11.176974119 +0100 +@@ -256,8 +256,7 @@ + pkginclude_HEADERS = version.h + + # Add doc back when we have some real content. +-SUBDIRS = config m4 lib libelf libebl libdwfl libdw libcpu libasm backends \ +- src po tests ++SUBDIRS = config m4 lib libelf libebl libdwfl libdw + + EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \ + COPYING COPYING-GPLV2 COPYING-LGPLV3 diff --git a/packages/toolchain/devel/elfutils/patches/elfutils-0.153-dwfl_segment_report_module.patch b/packages/toolchain/devel/elfutils/patches/elfutils-0.153-dwfl_segment_report_module.patch deleted file mode 100644 index f893c4ff38..0000000000 --- a/packages/toolchain/devel/elfutils/patches/elfutils-0.153-dwfl_segment_report_module.patch +++ /dev/null @@ -1,45 +0,0 @@ -commit 210c2f03efbbaacc51f2641baa0947d9c316de12 -Author: Roland McGrath -Date: Wed Mar 28 10:22:35 2012 -0700 - - RHBZ#805447: Fix core file grokking for case of truncated .dynstr - -diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog -index 87a0555..86f6fba 100644 ---- a/libdwfl/ChangeLog -+++ b/libdwfl/ChangeLog -@@ -1,3 +1,10 @@ -+2012-03-28 Roland McGrath -+ -+ * dwfl_segment_report_module.c -+ (dwfl_segment_report_module: read_portion): Don't use existing buffer -+ when FILESZ is zero (string mode) and available portion doesn't hold -+ a terminated string. -+ - 2011-12-02 Roland McGrath - - * elf-from-memory.c (elf_from_remote_memory): Fix ELFCLASS64 case -diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c -index 012a0fd..5534180 100644 ---- a/libdwfl/dwfl_segment_report_module.c -+++ b/libdwfl/dwfl_segment_report_module.c -@@ -1,5 +1,5 @@ - /* Sniff out modules from ELF headers visible in memory segments. -- Copyright (C) 2008-2010 Red Hat, Inc. -+ Copyright (C) 2008-2012 Red Hat, Inc. - This file is part of Red Hat elfutils. - - Red Hat elfutils is free software; you can redistribute it and/or modify -@@ -155,7 +155,11 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, - inline bool read_portion (void **data, size_t *data_size, - GElf_Addr vaddr, size_t filesz) - { -- if (vaddr - start + filesz > buffer_available) -+ if (vaddr - start + filesz > buffer_available -+ /* If we're in string mode, then don't consider the buffer we have -+ sufficient unless it contains the terminator of the string. */ -+ || (filesz == 0 && memchr (vaddr - start + buffer, '\0', -+ buffer_available - (vaddr - start)) == NULL)) - { - *data = NULL; - *data_size = filesz; From 92e72d5d89fbcc49d9f30333e1c4a70b722c019b Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 5 Mar 2013 19:03:16 +0100 Subject: [PATCH 5/8] Revert "Revert "remove package 'libelf'"" This reverts commit 95fc06c22cc2e36b31234e3fcb8d1ad6c9843fab. --- packages/toolchain/devel/libelf/build | 37 --------------------------- packages/toolchain/devel/libelf/meta | 36 -------------------------- 2 files changed, 73 deletions(-) delete mode 100755 packages/toolchain/devel/libelf/build delete mode 100644 packages/toolchain/devel/libelf/meta diff --git a/packages/toolchain/devel/libelf/build b/packages/toolchain/devel/libelf/build deleted file mode 100755 index 5cd945bc16..0000000000 --- a/packages/toolchain/devel/libelf/build +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# This Program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This Program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -setup_toolchain host - -cd $PKG_BUILD -mkdir -p objdir && cd objdir -../configure --host=$HOST_NAME \ - --build=$HOST_NAME \ - --target=$TARGET_NAME \ - --prefix=$ROOT/$TOOLCHAIN \ - --enable-shared \ - --disable-static \ - -make -make install diff --git a/packages/toolchain/devel/libelf/meta b/packages/toolchain/devel/libelf/meta deleted file mode 100644 index 073a6ba772..0000000000 --- a/packages/toolchain/devel/libelf/meta +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# This Program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This Program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="libelf" -PKG_VERSION="0.8.13" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://www.mr511.de/software/" -PKG_URL="http://www.mr511.de/software/$PKG_NAME-$PKG_VERSION.tar.gz" -PKG_DEPENDS="" -PKG_BUILD_DEPENDS="ccache" -PKG_PRIORITY="optional" -PKG_SECTION="toolchain/devel" -PKG_SHORTDESC="libelf: ELF object file access library" -PKG_LONGDESC="Libelf is a library to access ELF object files." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="no" From c2333ca728ae1271303180deda0c837fbeca8540 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 5 Mar 2013 19:09:20 +0100 Subject: [PATCH 6/8] elfutils: add install script Signed-off-by: Stephan Raue --- packages/devel/elfutils/install | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100755 packages/devel/elfutils/install diff --git a/packages/devel/elfutils/install b/packages/devel/elfutils/install new file mode 100755 index 0000000000..4d248b18b1 --- /dev/null +++ b/packages/devel/elfutils/install @@ -0,0 +1,28 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +#      Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv) +# +# This Program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This Program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +. config/options $1 + +mkdir -p $INSTALL/usr/lib + cp -P $PKG_BUILD/libdw/*.so* $INSTALL/usr/lib + cp -P $PKG_BUILD/libelf/*.so* $INSTALL/usr/lib From 9621472958e1e22c24fe56ee9932df30cbbb6609 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 5 Mar 2013 19:10:07 +0100 Subject: [PATCH 7/8] linux: perf depends on elfutils and Python Signed-off-by: Stephan Raue --- packages/linux/build | 3 ++- packages/linux/meta | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/linux/build b/packages/linux/build index eec15af69f..6c93154291 100755 --- a/packages/linux/build +++ b/packages/linux/build @@ -77,11 +77,12 @@ if [ "$DEVTOOLS" = yes ]; then export LDFLAGS="$LDFLAGS -L$SYSROOT_PREFIX/lib -L$SYSROOT_PREFIX/usr/lib" make CROSS_COMPILE="$TARGET_PREFIX" \ + ARCH="$TARGET_ARCH" \ V=1 \ DEBUG=false \ NLS=false \ NO_GTK2=true \ - NO_LIBELF=true \ + NO_LIBELF=false \ NO_LIBPERL=true \ NO_LIBPYTHON=false \ PYTHON=$SYSROOT_PREFIX/usr/bin/python \ diff --git a/packages/linux/meta b/packages/linux/meta index cdd8b787e2..e6a40d7309 100644 --- a/packages/linux/meta +++ b/packages/linux/meta @@ -46,6 +46,6 @@ if [ "$LINUX" = "ti-omap4" ]; then fi if [ "$DEVTOOLS" = "yes" ]; then - PKG_DEPENDS="$PKG_DEPENDS newt" - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS newt" + PKG_DEPENDS="$PKG_DEPENDS newt elfutils Python" + PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS newt elfutils Python" fi From 2154b4a4432c03b7f659423c2b44930370cadec0 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 5 Mar 2013 20:26:47 +0200 Subject: [PATCH 8/8] tcpdump: remove addon, build and install on development builds --- .../networking/analyzer/tcpdump/changelog.txt | 12 --------- .../networking/analyzer/tcpdump/icon/icon.png | Bin 81631 -> 0 bytes .../analyzer/tcpdump/source/default.py | 23 ------------------ packages/debug/meta | 2 +- .../analyzer => network}/tcpdump/build | 0 .../tcpdump/addon => network/tcpdump/install} | 5 ++-- .../analyzer => network}/tcpdump/meta | 6 ++--- 7 files changed, 6 insertions(+), 42 deletions(-) delete mode 100644 packages/addons/networking/analyzer/tcpdump/changelog.txt delete mode 100644 packages/addons/networking/analyzer/tcpdump/icon/icon.png delete mode 100644 packages/addons/networking/analyzer/tcpdump/source/default.py rename packages/{addons/networking/analyzer => network}/tcpdump/build (100%) rename packages/{addons/networking/analyzer/tcpdump/addon => network/tcpdump/install} (91%) rename packages/{addons/networking/analyzer => network}/tcpdump/meta (94%) diff --git a/packages/addons/networking/analyzer/tcpdump/changelog.txt b/packages/addons/networking/analyzer/tcpdump/changelog.txt deleted file mode 100644 index 18432df6cf..0000000000 --- a/packages/addons/networking/analyzer/tcpdump/changelog.txt +++ /dev/null @@ -1,12 +0,0 @@ -3.0.1 -- bump addon version - -2.1.3 -- updated to tcpdump-4.3.0 -- updated to libpcap-1.3.0 - -2.1.2 -- rebuild - -2.1.1 -- initial addon based on tcpdump-4.1.1 diff --git a/packages/addons/networking/analyzer/tcpdump/icon/icon.png b/packages/addons/networking/analyzer/tcpdump/icon/icon.png deleted file mode 100644 index b369966677eba857ee444ebc25ebb0adb9a8916d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81631 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