diff options
-rw-r--r-- | bfd/ChangeLog | 13 | ||||
-rw-r--r-- | bfd/bfd-in.h | 4 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 7 | ||||
-rw-r--r-- | bfd/elf.c | 31 | ||||
-rw-r--r-- | bfd/elf64-hppa.c | 7 | ||||
-rw-r--r-- | bfd/elfxx-ia64.c | 7 | ||||
-rw-r--r-- | bfd/hash.c | 58 | ||||
-rw-r--r-- | bfd/section.c | 23 | ||||
-rw-r--r-- | binutils/ChangeLog | 5 | ||||
-rw-r--r-- | binutils/objcopy.c | 17 | ||||
-rw-r--r-- | binutils/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/objdump.W | 2 |
12 files changed, 131 insertions, 48 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 78b904a..bd33568 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +2010-11-08 Alan Modra <amodra@gmail.com> + + * hash.c (bfd_hash_hash): Extract from.. + (bfd_hash_lookup): ..here. + (bfd_hash_rename): New function. + * section.c (bfd_rename_section): New function. + * bfd-in.h (bfd_hash_rename): Declare. + * bfd-in2.h: Regenerate. + * elf.c (_bfd_elf_make_section_from_shdr): Rename input sections + when compressing or decompressing. Don't assert name match. + * elf64-hppa.c (get_reloc_section): Don't assert name match. + * elfxx-ia64.c (get_reloc_section): Likewise. + 2010-11-05 Joseph Myers <joseph@codesourcery.com> * elf32-tic6x.c (elf32_tic6x_obj_attrs_handle_unknown): New. diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index cfa5225..63fcdc9 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -404,6 +404,10 @@ extern struct bfd_hash_entry *bfd_hash_lookup extern struct bfd_hash_entry *bfd_hash_insert (struct bfd_hash_table *, const char *, unsigned long); +/* Rename an entry in a hash table. */ +extern void bfd_hash_rename + (struct bfd_hash_table *, const char *, struct bfd_hash_entry *); + /* Replace an entry in a hash table. */ extern void bfd_hash_replace (struct bfd_hash_table *, struct bfd_hash_entry *old, diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index c6a54b5..f3e2b45 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -411,6 +411,10 @@ extern struct bfd_hash_entry *bfd_hash_lookup extern struct bfd_hash_entry *bfd_hash_insert (struct bfd_hash_table *, const char *, unsigned long); +/* Rename an entry in a hash table. */ +extern void bfd_hash_rename + (struct bfd_hash_table *, const char *, struct bfd_hash_entry *); + /* Replace an entry in a hash table. */ extern void bfd_hash_replace (struct bfd_hash_table *, struct bfd_hash_entry *old, @@ -1713,6 +1717,9 @@ asection *bfd_make_section (bfd *, const char *name); bfd_boolean bfd_set_section_flags (bfd *abfd, asection *sec, flagword flags); +void bfd_rename_section + (bfd *abfd, asection *sec, const char *newname); + void bfd_map_over_sections (bfd *abfd, void (*func) (bfd *abfd, asection *sect, void *obj), @@ -822,11 +822,7 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, const struct elf_backend_data *bed; if (hdr->bfd_section != NULL) - { - BFD_ASSERT (strcmp (name, - bfd_get_section_name (abfd, hdr->bfd_section)) == 0); - return TRUE; - } + return TRUE; newsect = bfd_make_section_anyway (abfd, name); if (newsect == NULL) @@ -1016,6 +1012,7 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, || (name[1] == 'z' && name[7] == '_'))) { enum { nothing, compress, decompress } action = nothing; + char *new_name; if (bfd_is_section_compressed (abfd, newsect)) { @@ -1030,6 +1027,7 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, action = compress; } + new_name = NULL; switch (action) { case nothing: @@ -1042,6 +1040,17 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, abfd, name); return FALSE; } + if (name[1] != 'z') + { + unsigned int len = strlen (name); + + new_name = bfd_alloc (abfd, len + 2); + if (new_name == NULL) + return FALSE; + new_name[0] = '.'; + new_name[1] = 'z'; + memcpy (new_name + 2, name + 1, len); + } break; case decompress: if (!bfd_init_section_decompress_status (abfd, newsect)) @@ -1051,8 +1060,20 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, abfd, name); return FALSE; } + if (name[1] == 'z') + { + unsigned int len = strlen (name); + + new_name = bfd_alloc (abfd, len); + if (new_name == NULL) + return FALSE; + new_name[0] = '.'; + memcpy (new_name + 1, name + 2, len - 1); + } break; } + if (new_name != NULL) + bfd_rename_section (abfd, newsect, new_name); } return TRUE; diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c index 11289b1..d8213a0 100644 --- a/bfd/elf64-hppa.c +++ b/bfd/elf64-hppa.c @@ -411,13 +411,6 @@ get_reloc_section (bfd *abfd, if (srel_name == NULL) return FALSE; - BFD_ASSERT ((CONST_STRNEQ (srel_name, ".rela") - && strcmp (bfd_get_section_name (abfd, sec), - srel_name + 5) == 0) - || (CONST_STRNEQ (srel_name, ".rel") - && strcmp (bfd_get_section_name (abfd, sec), - srel_name + 4) == 0)); - dynobj = hppa_info->root.dynobj; if (!dynobj) hppa_info->root.dynobj = dynobj = abfd; diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c index 0ef1a44..d42ad89 100644 --- a/bfd/elfxx-ia64.c +++ b/bfd/elfxx-ia64.c @@ -2602,13 +2602,6 @@ get_reloc_section (bfd *abfd, if (srel_name == NULL) return NULL; - BFD_ASSERT ((CONST_STRNEQ (srel_name, ".rela") - && strcmp (bfd_get_section_name (abfd, sec), - srel_name+5) == 0) - || (CONST_STRNEQ (srel_name, ".rel") - && strcmp (bfd_get_section_name (abfd, sec), - srel_name+4) == 0)); - dynobj = ia64_info->root.dynobj; if (!dynobj) ia64_info->root.dynobj = dynobj = abfd; @@ -1,6 +1,6 @@ /* hash.c -- hash table routines for BFD Copyright 1993, 1994, 1995, 1997, 1999, 2001, 2002, 2003, 2004, 2005, - 2006, 2007, 2009 Free Software Foundation, Inc. + 2006, 2007, 2009, 2010 Free Software Foundation, Inc. Written by Steve Chamberlain <sac@cygnus.com> This file is part of BFD, the Binary File Descriptor library. @@ -412,20 +412,13 @@ bfd_hash_table_free (struct bfd_hash_table *table) table->memory = NULL; } -/* Look up a string in a hash table. */ - -struct bfd_hash_entry * -bfd_hash_lookup (struct bfd_hash_table *table, - const char *string, - bfd_boolean create, - bfd_boolean copy) +static inline unsigned long +bfd_hash_hash (const char *string, unsigned int *lenp) { const unsigned char *s; unsigned long hash; - unsigned int c; - struct bfd_hash_entry *hashp; unsigned int len; - unsigned int _index; + unsigned int c; hash = 0; len = 0; @@ -438,7 +431,25 @@ bfd_hash_lookup (struct bfd_hash_table *table, len = (s - (const unsigned char *) string) - 1; hash += len + (len << 17); hash ^= hash >> 2; + if (lenp != NULL) + *lenp = len; + return hash; +} + +/* Look up a string in a hash table. */ +struct bfd_hash_entry * +bfd_hash_lookup (struct bfd_hash_table *table, + const char *string, + bfd_boolean create, + bfd_boolean copy) +{ + unsigned long hash; + struct bfd_hash_entry *hashp; + unsigned int len; + unsigned int _index; + + hash = bfd_hash_hash (string, &len); _index = hash % table->size; for (hashp = table->table[_index]; hashp != NULL; @@ -535,6 +546,31 @@ bfd_hash_insert (struct bfd_hash_table *table, return hashp; } +/* Rename an entry in a hash table. */ + +void +bfd_hash_rename (struct bfd_hash_table *table, + const char *string, + struct bfd_hash_entry *ent) +{ + unsigned int _index; + struct bfd_hash_entry **pph; + + _index = ent->hash % table->size; + for (pph = &table->table[_index]; *pph != NULL; pph = &(*pph)->next) + if (*pph == ent) + break; + if (*pph == NULL) + abort (); + + *pph = ent->next; + ent->string = string; + ent->hash = bfd_hash_hash (string, NULL); + _index = ent->hash % table->size; + ent->next = table->table[_index]; + table->table[_index] = ent; +} + /* Replace an entry in a hash table. */ void diff --git a/bfd/section.c b/bfd/section.c index 51c2196..bff8adf 100644 --- a/bfd/section.c +++ b/bfd/section.c @@ -1215,6 +1215,29 @@ bfd_set_section_flags (bfd *abfd ATTRIBUTE_UNUSED, /* FUNCTION + bfd_rename_section + +SYNOPSIS + void bfd_rename_section + (bfd *abfd, asection *sec, const char *newname); + +DESCRIPTION + Rename section @var{sec} in @var{abfd} to @var{newname}. +*/ + +void +bfd_rename_section (bfd *abfd, sec_ptr sec, const char *newname) +{ + struct section_hash_entry *sh; + + sh = (struct section_hash_entry *) + ((char *) sec - offsetof (struct section_hash_entry, section)); + sh->section.name = newname; + bfd_hash_rename (&abfd->section_htab, newname, &sh->root); +} + +/* +FUNCTION bfd_map_over_sections SYNOPSIS diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 1ee503d..97e4362 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2010-11-08 Alan Modra <amodra@gmail.com> + + * objcopy.c (copy_main): No need to rename sections when compressing + or decompressing. + 2010-11-05 Alan Modra <amodra@gmail.com> * bin2c.c: Remove internationalization and version report. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 2077fca..ac176df 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -3196,7 +3196,6 @@ copy_main (int argc, char *argv[]) struct section_list *p; struct stat statbuf; const bfd_arch_info_type *input_arch = NULL; - struct dwarf_debug_section *d; while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w", copy_options, (int *) 0)) != EOF) @@ -3912,22 +3911,6 @@ copy_main (int argc, char *argv[]) fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"), input_filename, strerror (errno)); - switch (do_debug_sections) - { - case compress: - for (d = dwarf_debug_sections; d->uncompressed_name; d++) - add_section_rename (d->uncompressed_name, d->compressed_name, - (flagword) -1); - break; - case decompress: - for (d = dwarf_debug_sections; d->uncompressed_name; d++) - add_section_rename (d->compressed_name, d->uncompressed_name, - (flagword) -1); - break; - default: - break; - } - copy_file (input_filename, tmpname, input_target, output_target, input_arch); if (status == 0) { diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index dedc5f2..2165aa8 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-08 Alan Modra <amodra@gmail.com> + + * binutils-all/objdump.W: Adjust expected result for debug section + rename. + 2010-11-02 H.J. Lu <hongjiu.lu@intel.com> * binutils-all/libdw2.out: Also accept MIPS_DWARF. diff --git a/binutils/testsuite/binutils-all/objdump.W b/binutils/testsuite/binutils-all/objdump.W index 8de584a..0197647 100644 --- a/binutils/testsuite/binutils-all/objdump.W +++ b/binutils/testsuite/binutils-all/objdump.W @@ -73,7 +73,7 @@ Raw dump of debug contents of section .debug_line: Extended opcode 1: End of Sequence -Contents of the .zdebug_abbrev section: +Contents of the .debug_abbrev section: Number TAG 1 DW_TAG_compile_unit \[has children\] |