aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2015-04-13 12:50:17 -0700
committerDoug Evans <dje@google.com>2015-04-13 12:50:17 -0700
commit0d2a7a932244fab27d6c4ce211ea8f7708a1a9cc (patch)
tree234fd3f8a7dcb81a20eab1016b9744d653a6a21e
parent0ff6fcb2f0f2e3c0de3708ec41fb849d1461c9d7 (diff)
Fix reading of .debug_str_offsets{,.dwo} twice.HEADmaster
PR binutils/18218 * readelf.c (printable_section_name): Constify sec argument. (apply_relocations): Ditto. New arg "size". All callers updated. (load_specific_debug_section): Constify sec argument. Remove side-effect of modifying sec->sh_size.
-rw-r--r--binutils/ChangeLog8
-rw-r--r--binutils/readelf.c15
2 files changed, 15 insertions, 8 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index bd2c715b7c..31eb7a32ad 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,11 @@
+2015-04-13 Doug Evans <dje@google.com>
+
+ PR binutils/18218
+ * readelf.c (printable_section_name): Constify sec argument.
+ (apply_relocations): Ditto. New arg "size". All callers updated.
+ (load_specific_debug_section): Constify sec argument.
+ Remove side-effect of modifying sec->sh_size.
+
2015-04-09 H.J. Lu <hongjiu.lu@intel.com>
* objcopy.c (do_debug_sections): Use bit patterns.
diff --git a/binutils/readelf.c b/binutils/readelf.c
index db69b5df40..ca251360d0 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -550,7 +550,7 @@ print_symbol (int width, const char *symbol)
to print multibyte characters, it just interprets them as hex values. */
static const char *
-printable_section_name (Elf_Internal_Shdr * sec)
+printable_section_name (const Elf_Internal_Shdr * sec)
{
#define MAX_PRINT_SEC_NAME_LEN 128
static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
@@ -11633,11 +11633,11 @@ is_none_reloc (unsigned int reloc_type)
static void
apply_relocations (void * file,
- Elf_Internal_Shdr * section,
- unsigned char * start)
+ const Elf_Internal_Shdr * section,
+ unsigned char * start, bfd_size_type size)
{
Elf_Internal_Shdr * relsec;
- unsigned char * end = start + section->sh_size;
+ unsigned char * end = start + size;
if (elf_header.e_type != ET_REL)
return;
@@ -11929,7 +11929,7 @@ dump_section_as_bytes (Elf_Internal_Shdr * section,
if (relocate)
{
- apply_relocations (file, section, start);
+ apply_relocations (file, section, start, section->sh_size);
}
else
{
@@ -12069,7 +12069,7 @@ uncompress_section_contents (unsigned char **buffer,
static int
load_specific_debug_section (enum dwarf_section_display_enum debug,
- Elf_Internal_Shdr * sec, void * file)
+ const Elf_Internal_Shdr * sec, void * file)
{
struct dwarf_section * section = &debug_displays [debug].section;
char buf [64];
@@ -12109,7 +12109,6 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
and the section size if uncompress is successful. */
free (section->start);
section->start = start;
- sec->sh_size = size;
}
section->size = size;
}
@@ -12118,7 +12117,7 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
return 0;
if (debug_displays [debug].relocate)
- apply_relocations ((FILE *) file, sec, section->start);
+ apply_relocations ((FILE *) file, sec, section->start, section->size);
return 1;
}