aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog13
-rw-r--r--bfd/bfd-in.h4
-rw-r--r--bfd/bfd-in2.h7
-rw-r--r--bfd/elf.c31
-rw-r--r--bfd/elf64-hppa.c7
-rw-r--r--bfd/elfxx-ia64.c7
-rw-r--r--bfd/hash.c58
-rw-r--r--bfd/section.c23
-rw-r--r--binutils/ChangeLog5
-rw-r--r--binutils/objcopy.c17
-rw-r--r--binutils/testsuite/ChangeLog5
-rw-r--r--binutils/testsuite/binutils-all/objdump.W2
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),
diff --git a/bfd/elf.c b/bfd/elf.c
index 4f326a7..075a668 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -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;
diff --git a/bfd/hash.c b/bfd/hash.c
index fc05923..e2fa3a9 100644
--- a/bfd/hash.c
+++ b/bfd/hash.c
@@ -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\]