New upstream version 0.131

This commit is contained in:
roland 2007-11-11 23:16:59 +00:00
parent 8b661bd16c
commit a7b828dfce
3 changed files with 24 additions and 371 deletions

View File

@ -1,352 +0,0 @@
libdwfl/
2007-10-17 Roland McGrath <roland@redhat.com>
* dwfl_module_getsym.c (dwfl_module_getsym): Apply MOD->symfile->bias
to relocated st_value.
* dwfl_report_elf.c (__libdwfl_report_elf): Align initial BASE for
ET_REL to 0x100.
2007-10-16 Roland McGrath <roland@redhat.com>
* dwfl_report_elf.c (__libdwfl_report_elf): Readjust BASE when a later
section has larger alignment requirements not met by the original BASE,
rather than padding more between sections.
* dwfl_report_elf.c (__libdwfl_report_elf): Fix bias calculation.
* dwfl_module_build_id.c (__libdwfl_find_build_id): Apply module bias
to sh_addr value.
* dwfl_report_elf.c (__libdwfl_report_elf): Don't be confused by BASE
at zero in ET_REL case. Adjust BASE to necessary alignment.
* dwfl_module_build_id.c (check_notes): Take -1, not 0, as stub value
for DATA_VADDR.
(__libdwfl_find_build_id): Update caller.
* relocate.c (__libdwfl_relocate_value): Don't use sh_offset.
* dwfl_report_elf.c (__libdwfl_report_elf): Likewise.
* offline.c (dwfl_offline_section_address): Bail early if there is
separate debug file.
* relocate.c (__libdwfl_relocate): Don't return DWFL_E_NO_DWARF.
src/
2007-10-16 Roland McGrath <roland@redhat.com>
* readelf.c (hex_dump): Fix rounding error in whitespace calculation.
tests/
2007-10-16 Roland McGrath <roland@redhat.com>
* test-subr.sh (remove_files): Don't pass -Bb to diff.
============================================================
--- libdwfl/dwfl_module_build_id.c ae14fc9f3be468ffff14b4f6247ad38898705132
+++ libdwfl/dwfl_module_build_id.c c67b9be68b69c98f6fd1024f521acdab0678ea02
@@ -73,6 +73,8 @@ found_build_id (Dwfl_Module *mod, bool s
return len;
}
+#define NO_VADDR ((GElf_Addr) -1l)
+
static int
check_notes (Dwfl_Module *mod, bool set, Elf_Data *data, GElf_Addr data_vaddr)
{
@@ -86,7 +88,7 @@ check_notes (Dwfl_Module *mod, bool set,
"GNU", sizeof "GNU"))
return found_build_id (mod, set,
data->d_buf + desc_pos, nhdr.n_descsz,
- data_vaddr == 0 ? 0 : data_vaddr + pos);
+ data_vaddr == NO_VADDR ? 0 : data_vaddr + pos);
return 0;
}
@@ -129,7 +131,7 @@ __libdwfl_find_build_id (Dwfl_Module *mo
if (likely (shdr != NULL) && shdr->sh_type == SHT_NOTE)
result = check_notes (mod, set, elf_getdata (scn, NULL),
(shdr->sh_flags & SHF_ALLOC)
- ? shdr->sh_addr : 0);
+ ? shdr->sh_addr + mod->main.bias : NO_VADDR);
}
while (result == 0 && (scn = elf_nextscn (elf, scn)) != NULL);
============================================================
--- libdwfl/dwfl_module_getsym.c 5596a4a3df363bb27759a0c26519b9818475aa80
+++ libdwfl/dwfl_module_getsym.c c1a0448eecebc039393fb884ff7d0684d1d5001f
@@ -85,10 +85,7 @@ dwfl_module_getsym (Dwfl_Module *mod, in
break;
default:
- if (mod->e_type != ET_REL)
- /* Apply the bias to the symbol value. */
- sym->st_value += mod->symfile->bias;
- else
+ if (mod->e_type == ET_REL)
{
/* In an ET_REL file, the symbol table values are relative
to the section, not to the module's load base. */
@@ -102,6 +99,8 @@ dwfl_module_getsym (Dwfl_Module *mod, in
return NULL;
}
}
+ /* Apply the bias to the symbol value. */
+ sym->st_value += mod->symfile->bias;
break;
}
============================================================
--- libdwfl/dwfl_report_elf.c d9db919b103fc3411d240f3a096af5e57a3adce6
+++ libdwfl/dwfl_report_elf.c ee4a17cd0e3bf27c306b484ab38c34a7de2b7c0e
@@ -51,6 +51,14 @@
#include <fcntl.h>
#include <unistd.h>
+
+/* We start every ET_REL module at a moderately aligned boundary.
+ This keeps the low addresses easy to read compared to a layout
+ starting at 0 (as when using -e). It also makes it unlikely
+ that a middle section will have a larger alignment and require
+ rejiggering (see below). */
+#define REL_MIN_ALIGN ((GElf_Xword) 0x100)
+
Dwfl_Module *
internal_function
__libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
@@ -72,41 +80,91 @@ __libdwfl_report_elf (Dwfl *dwfl, const
By updating the section header in place, we leave the layout
information to be found by relocation. */
- start = end = base;
+ start = end = base = (base + REL_MIN_ALIGN - 1) & -REL_MIN_ALIGN;
+ bool first = true;
Elf_Scn *scn = NULL;
while ((scn = elf_nextscn (elf, scn)) != NULL)
{
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
- if (shdr == NULL)
+ if (unlikely (shdr == NULL))
goto elf_error;
if (shdr->sh_flags & SHF_ALLOC)
{
const GElf_Xword align = shdr->sh_addralign ?: 1;
- if (shdr->sh_addr == 0 || (bias == 0 && end > start))
+ const GElf_Addr next = (end + align - 1) & -align;
+ if (shdr->sh_addr == 0
+ /* Once we've started doing layout we have to do it all,
+ unless we just layed out the first section at 0 when
+ it already was at 0. */
+ || (bias == 0 && end > start && end != next))
{
- shdr->sh_addr = (end + align - 1) & -align;
+ shdr->sh_addr = next;
if (end == base)
/* This is the first section assigned a location.
Use its aligned address as the module's base. */
- start = shdr->sh_addr;
+ start = base = shdr->sh_addr;
+ else if (unlikely (base & (align - 1)))
+ {
+ /* If BASE has less than the maximum alignment of
+ any section, we eat more than the optimal amount
+ of padding and so make the module's apparent
+ size come out larger than it would when placed
+ at zero. So reset the layout with a better base. */
+
+ start = end = base = (base + align - 1) & -align;
+ Elf_Scn *prev_scn = NULL;
+ do
+ {
+ prev_scn = elf_nextscn (elf, prev_scn);
+ GElf_Shdr prev_shdr_mem;
+ GElf_Shdr *prev_shdr = gelf_getshdr (prev_scn,
+ &prev_shdr_mem);
+ if (unlikely (prev_shdr == NULL))
+ goto elf_error;
+ if (prev_shdr->sh_flags & SHF_ALLOC)
+ {
+ const GElf_Xword prev_align
+ = prev_shdr->sh_addralign ?: 1;
+
+ prev_shdr->sh_addr
+ = (end + prev_align - 1) & -prev_align;
+ end = prev_shdr->sh_addr + prev_shdr->sh_size;
+
+ if (unlikely (! gelf_update_shdr (prev_scn,
+ prev_shdr)))
+ goto elf_error;
+ }
+ }
+ while (prev_scn != scn);
+ continue;
+ }
+
end = shdr->sh_addr + shdr->sh_size;
- if (shdr->sh_addr == 0)
- /* This is a marker that this was resolved to zero,
- to prevent a callback. */
- shdr->sh_offset = 0;
- if (! gelf_update_shdr (scn, shdr))
+ if (likely (shdr->sh_addr != 0)
+ && unlikely (! gelf_update_shdr (scn, shdr)))
goto elf_error;
}
else
{
- if (bias == 0 || end < shdr->sh_addr + shdr->sh_size)
+ /* The address is already assigned. Just track it. */
+ if (first || end < shdr->sh_addr + shdr->sh_size)
end = shdr->sh_addr + shdr->sh_size;
- if (bias == 0 || bias > shdr->sh_addr)
+ if (first || bias > shdr->sh_addr)
+ /* This is the lowest address in the module. */
bias = shdr->sh_addr;
+
+ if ((shdr->sh_addr - bias + base) & (align - 1))
+ /* This section winds up misaligned using BASE.
+ Adjust BASE upwards to make it congruent to
+ the lowest section address in the file modulo ALIGN. */
+ base = (((base + align - 1) & -align)
+ + (bias & (align - 1)));
}
+
+ first = false;
}
}
@@ -117,7 +175,7 @@ __libdwfl_report_elf (Dwfl *dwfl, const
Now just compute the bias from the requested base. */
start = base;
end = end - bias + start;
- bias -= start;
+ bias = start - bias;
}
break;
@@ -133,7 +191,7 @@ __libdwfl_report_elf (Dwfl *dwfl, const
for (uint_fast16_t i = 0; i < ehdr->e_phnum; ++i)
{
GElf_Phdr phdr_mem, *ph = gelf_getphdr (elf, i, &phdr_mem);
- if (ph == NULL)
+ if (unlikely (ph == NULL))
goto elf_error;
if (ph->p_type == PT_LOAD)
{
@@ -148,7 +206,7 @@ __libdwfl_report_elf (Dwfl *dwfl, const
for (uint_fast16_t i = ehdr->e_phnum; i-- > 0;)
{
GElf_Phdr phdr_mem, *ph = gelf_getphdr (elf, i, &phdr_mem);
- if (ph == NULL)
+ if (unlikely (ph == NULL))
goto elf_error;
if (ph->p_type == PT_LOAD)
{
============================================================
--- libdwfl/offline.c 1508fb5c96e46f5bf3bbdaa0e18921243cf2ab8b
+++ libdwfl/offline.c d8dc43d35ecff3200099ec421a93cfadbd5a2e17
@@ -53,8 +53,9 @@
/* Since dwfl_report_elf lays out the sections already, this will only be
called when the section headers of the debuginfo file are being
- consulted instead. With binutils strip-to-debug, the symbol table is in
- the debuginfo file and relocation looks there. */
+ consulted instead, or for the section placed at 0. With binutils
+ strip-to-debug, the symbol table is in the debuginfo file and relocation
+ looks there. */
int
dwfl_offline_section_address (Dwfl_Module *mod,
void **userdata __attribute__ ((unused)),
@@ -69,6 +70,11 @@ dwfl_offline_section_address (Dwfl_Modul
assert (shdr->sh_addr == 0);
assert (shdr->sh_flags & SHF_ALLOC);
+ if (mod->debug.elf == NULL)
+ /* We are only here because sh_addr is zero even though layout is complete.
+ The first section in the first file under -e is placed at 0. */
+ return 0;
+
/* The section numbers might not match between the two files.
The best we can rely on is the order of SHF_ALLOC sections. */
============================================================
--- libdwfl/relocate.c 5a08921fcd4b957b0d768e7a140eb5187dcaf69e
+++ libdwfl/relocate.c 51258c3bf6a18602dbd3fd2d8b721d4f7a9aef60
@@ -64,9 +64,7 @@ __libdwfl_relocate_value (Dwfl_Module *m
if (refshdr == NULL)
return DWFL_E_LIBELF;
- if (refshdr->sh_addr == 0
- && (refshdr->sh_flags & SHF_ALLOC)
- && refshdr->sh_offset != 0)
+ if (refshdr->sh_addr == 0 && (refshdr->sh_flags & SHF_ALLOC))
{
/* This is a loaded section. Find its actual
address and update the section header. */
@@ -89,13 +87,11 @@ __libdwfl_relocate_value (Dwfl_Module *m
don't really care. */
refshdr->sh_addr = 0; /* Make no adjustment below. */
- /* Mark it so we don't check it again for the next relocation. */
- refshdr->sh_offset = 0;
-
/* Update the in-core file's section header to show the final
load address (or unloadedness). This serves as a cache,
so we won't get here again for the same section. */
- if (unlikely (! gelf_update_shdr (refscn, refshdr)))
+ if (likely (refshdr->sh_addr != 0)
+ && unlikely (! gelf_update_shdr (refscn, refshdr)))
return DWFL_E_LIBELF;
}
@@ -202,7 +198,7 @@ __libdwfl_relocate (Dwfl_Module *mod, El
/* Look at each section in the debuginfo file, and process the
relocation sections for debugging sections. */
- Dwfl_Error result = DWFL_E_NO_DWARF;
+ Dwfl_Error result = DWFL_E_NOERROR;
Elf_Scn *scn = NULL;
while ((scn = elf_nextscn (debugfile, scn)) != NULL)
{
@@ -369,7 +365,6 @@ __libdwfl_relocate (Dwfl_Module *mod, El
if (reldata == NULL)
return DWFL_E_LIBELF;
- result = DWFL_E_NOERROR;
size_t nrels = shdr->sh_size / shdr->sh_entsize;
if (shdr->sh_type == SHT_REL)
for (size_t relidx = 0; !result && relidx < nrels; ++relidx)
============================================================
--- src/readelf.c a0d9bd8c3fb36429895ee314dd3a874af3f8866e
+++ src/readelf.c 06970982eff8d85287725619dd9eefc51c1bf1c0
@@ -5888,7 +5888,7 @@ hex_dump (const uint8_t *data, size_t le
printf ("%02x", data[pos + i]);
if (chunk < 16)
- printf ("%*s", (int) ((16 - chunk) * 2 + (16 - chunk) / 4), "");
+ printf ("%*s", (int) ((16 - chunk) * 2 + (16 - chunk + 3) / 4), "");
for (size_t i = 0; i < chunk; ++i)
{
============================================================
--- tests/test-subr.sh 5ba4008367c39437a8e8d6ed0b6757d54bc10f4d
+++ tests/test-subr.sh ea1d0339bca3d875076ed15e114e9d47b2ea96e2
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 2005 Red Hat, Inc.
+# Copyright (C) 2005, 2007 Red Hat, Inc.
# This file is part of Red Hat elfutils.
#
# Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -58,7 +58,7 @@ testrun_compare()
{
outfile="${1##*/}.out"
testrun_out $outfile "$@"
- diff -Bbu $outfile -
+ diff -u $outfile -
# diff's exit status will kill the script.
}

View File

@ -1,6 +1,6 @@
--- elfutils/backends/ChangeLog --- elfutils/backends/ChangeLog
+++ elfutils/backends/ChangeLog +++ elfutils/backends/ChangeLog
@@ -229,6 +229,11 @@ @@ -240,6 +240,11 @@
* sparc_init.c: Likewise. * sparc_init.c: Likewise.
* x86_64_init.c: Likewise. * x86_64_init.c: Likewise.
@ -12,7 +12,7 @@
2005-11-19 Roland McGrath <roland@redhat.com> 2005-11-19 Roland McGrath <roland@redhat.com>
* ppc64_reloc.def: REL30 -> ADDR30. * ppc64_reloc.def: REL30 -> ADDR30.
@@ -251,6 +256,9 @@ @@ -262,6 +267,9 @@
* Makefile.am (uninstall): Don't try to remove $(pkgincludedir). * Makefile.am (uninstall): Don't try to remove $(pkgincludedir).
(CLEANFILES): Add libebl_$(m).so. (CLEANFILES): Add libebl_$(m).so.
@ -479,7 +479,7 @@
libcpu_i386_a_SOURCES = i386_dis.c libcpu_i386_a_SOURCES = i386_dis.c
--- elfutils/libdw/ChangeLog --- elfutils/libdw/ChangeLog
+++ elfutils/libdw/ChangeLog +++ elfutils/libdw/ChangeLog
@@ -406,6 +406,11 @@ @@ -425,6 +425,11 @@
2005-05-31 Roland McGrath <roland@redhat.com> 2005-05-31 Roland McGrath <roland@redhat.com>
@ -543,7 +543,7 @@
$(COMPILE))) $(COMPILE)))
--- elfutils/libdwfl/ChangeLog --- elfutils/libdwfl/ChangeLog
+++ elfutils/libdwfl/ChangeLog +++ elfutils/libdwfl/ChangeLog
@@ -647,6 +647,11 @@ @@ -739,6 +739,11 @@
2005-07-21 Roland McGrath <roland@redhat.com> 2005-07-21 Roland McGrath <roland@redhat.com>
@ -604,7 +604,7 @@
--- elfutils/libebl/ChangeLog --- elfutils/libebl/ChangeLog
+++ elfutils/libebl/ChangeLog +++ elfutils/libebl/ChangeLog
@@ -501,6 +501,11 @@ @@ -505,6 +505,11 @@
* Makefile.am (libebl_*_so_SOURCES): Set to $(*_SRCS) so dependency * Makefile.am (libebl_*_so_SOURCES): Set to $(*_SRCS) so dependency
tracking works right. tracking works right.
@ -665,7 +665,7 @@
--- elfutils/libelf/ChangeLog --- elfutils/libelf/ChangeLog
+++ elfutils/libelf/ChangeLog +++ elfutils/libelf/ChangeLog
@@ -295,6 +295,11 @@ @@ -303,6 +303,11 @@
If section content hasn't been read yet, do it before looking for the 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. block size. If no section data present, infer size of section header.
@ -797,15 +797,16 @@
YACC = @YACC@ YACC = @YACC@
--- elfutils/src/ChangeLog --- elfutils/src/ChangeLog
+++ elfutils/src/ChangeLog +++ elfutils/src/ChangeLog
@@ -1,3 +1,7 @@ @@ -30,6 +30,8 @@
+2007-10-16 Roland McGrath <roland@redhat.com>
+ * readelf.c (hex_dump): Fix rounding error in whitespace calculation.
+ * Makefile.am (readelf_no_Werror): New variable. + * Makefile.am (readelf_no_Werror): New variable.
+ +
2007-10-15 Roland McGrath <roland@redhat.com> 2007-10-15 Roland McGrath <roland@redhat.com>
* make-debug-archive.in: New file. * make-debug-archive.in: New file.
@@ -437,6 +441,10 @@ @@ -469,6 +471,10 @@
* elflint.c (valid_e_machine): Add EM_ALPHA. * elflint.c (valid_e_machine): Add EM_ALPHA.
Reported by Christian Aichinger <Greek0@gmx.net>. Reported by Christian Aichinger <Greek0@gmx.net>.
@ -816,7 +817,7 @@
2006-08-08 Ulrich Drepper <drepper@redhat.com> 2006-08-08 Ulrich Drepper <drepper@redhat.com>
* elflint.c (check_dynamic): Don't require DT_HASH for DT_SYMTAB. * elflint.c (check_dynamic): Don't require DT_HASH for DT_SYMTAB.
@@ -513,6 +521,10 @@ @@ -545,6 +551,10 @@
* Makefile.am: Add hacks to create dependency files for non-generic * Makefile.am: Add hacks to create dependency files for non-generic
linker. linker.
@ -827,7 +828,7 @@
2006-06-12 Ulrich Drepper <drepper@redhat.com> 2006-06-12 Ulrich Drepper <drepper@redhat.com>
* ldgeneric.c (ld_generic_generate_sections): Don't create .interp * ldgeneric.c (ld_generic_generate_sections): Don't create .interp
@@ -861,6 +873,11 @@ @@ -893,6 +903,11 @@
* readelf.c (print_debug_loc_section): Fix indentation for larger * readelf.c (print_debug_loc_section): Fix indentation for larger
address size. address size.
@ -1008,7 +1009,7 @@
cannot set access and modification date of '%s'"), fname); cannot set access and modification date of '%s'"), fname);
--- elfutils/tests/ChangeLog --- elfutils/tests/ChangeLog
+++ elfutils/tests/ChangeLog +++ elfutils/tests/ChangeLog
@@ -585,6 +585,11 @@ @@ -606,6 +606,11 @@
* Makefile.am (TESTS): Add run-elflint-test.sh. * Makefile.am (TESTS): Add run-elflint-test.sh.
(EXTRA_DIST): Add run-elflint-test.sh and testfile18.bz2. (EXTRA_DIST): Add run-elflint-test.sh and testfile18.bz2.

View File

@ -1,5 +1,5 @@
%define eu_version 0.130 %define eu_version 0.131
%define eu_release 3 %define eu_release 1
%if %{?_with_compat:1}%{!?_with_compat:0} %if %{?_with_compat:1}%{!?_with_compat:0}
%define compat 1 %define compat 1
@ -35,8 +35,6 @@ Patch0: elfutils-strip-copy-symtab.patch
Source2: testfile16.symtab.bz2 Source2: testfile16.symtab.bz2
Source3: testfile16.symtab.debug.bz2 Source3: testfile16.symtab.debug.bz2
Patch3: elfutils-0.130-fixes.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: bison >= 1.875 BuildRequires: bison >= 1.875
@ -156,8 +154,6 @@ find . \( -name configure -o -name config.h.in \) -print | xargs touch
%patch2 -p1 %patch2 -p1
%patch3 -p0
%build %build
# Remove -Wall from default flags. The makefiles enable enough warnings # Remove -Wall from default flags. The makefiles enable enough warnings
# themselves, and they use -Werror. Appending -Wall defeats the cases where # themselves, and they use -Werror. Appending -Wall defeats the cases where
@ -265,6 +261,14 @@ rm -rf ${RPM_BUILD_ROOT}
%{_libdir}/libelf.a %{_libdir}/libelf.a
%changelog %changelog
* Sun Nov 11 2007 Roland McGrath <roland@redhat.com> - 0.131-1
- Update to 0.131
- libdw: DW_FORM_ref_addr support; dwarf_formref entry point now deprecated;
bug fixes for oddly-formatted DWARF
- libdwfl: bug fixes in offline archive support, symbol table handling;
apply partial relocations for dwfl_module_address_section on ET_REL
- libebl: powerpc backend support for Altivec registers
* Wed Oct 17 2007 Roland McGrath <roland@redhat.com> - 0.130-3 * Wed Oct 17 2007 Roland McGrath <roland@redhat.com> - 0.130-3
- Fix ET_REL support. - Fix ET_REL support.
- Fix odd indentation in eu-readelf -x output. - Fix odd indentation in eu-readelf -x output.