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.
This commit is contained in:
parent
fff50f7175
commit
4e011fb578
12 changed files with 131 additions and 48 deletions
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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),
|
||||
|
|
31
bfd/elf.c
31
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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
58
bfd/hash.c
58
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
|
||||
|
|
|
@ -1213,6 +1213,29 @@ bfd_set_section_flags (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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\]
|
||||
|
|
Loading…
Reference in a new issue