summaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2010-11-08 02:48:53 +0000
committerAlan Modra <amodra@bigpond.net.au>2010-11-08 02:48:53 +0000
commita21e91c6604036d32acbec4d34e4e9fe081cc34f (patch)
tree403df6c3f6c7dac0d6e6ff36279f7f8d6661cebe /bfd/elf.c
parentfed33f270cf1350ebd6d8606ec64f385ce418aa7 (diff)
downloadbinutils-redhat-a21e91c6604036d32acbec4d34e4e9fe081cc34f.tar.gz
bfd/
* 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. binutils/ * objcopy.c (copy_main): No need to rename sections when compressing or decompressing. binutils/testsuite/ * binutils-all/objdump.W: Adjust expected result for debug section rename.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 4f326a7ae5..075a668c30 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;