diff options
author | Cl?ment Chigot <clement.chigot@atos.net> | 2021-04-22 15:31:02 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2021-04-22 15:31:02 +0100 |
commit | bdd2aaf69ea2e8c89f431bdf72516e2d6503891a (patch) | |
tree | e375a94197aab402fcd6aa091a7b0aff7cf304a5 /bfd/hash.c | |
parent | 22f80c0f77be6304b9632827d8161e28cb4a195a (diff) | |
download | gdb-bdd2aaf69ea2e8c89f431bdf72516e2d6503891a.zip gdb-bdd2aaf69ea2e8c89f431bdf72516e2d6503891a.tar.gz gdb-bdd2aaf69ea2e8c89f431bdf72516e2d6503891a.tar.bz2 |
fix string table generation for XCOFF64 .debug section
bfd * hash.c (struct bfd_strtab_hash): Remove xcoff field.
Add length_field_size field.
(_bfd_stringtab_init): Change prototype.
Adapt to new length_field_size.
(_bfd_xcoff_stringtab_init): Likewise.
(_bfd_stringtab_add): Likewise.
(_bfd_stringtab_emit): Likewise.
* libbfd-in.h (_bfd_xcoff_stringtab_init):
Change prototype.
* libbfd.h: Regenerate.
* xcofflink.c (_bfd_xcoff_bfd_link_hash_table_create):
Call _bfd_xcoff_stringtab_init with isxcoff64 value.
Diffstat (limited to 'bfd/hash.c')
-rw-r--r-- | bfd/hash.c | 34 |
1 files changed, 19 insertions, 15 deletions
@@ -713,11 +713,12 @@ struct bfd_strtab_hash struct strtab_hash_entry *first; /* Last string in strtab. */ struct strtab_hash_entry *last; - /* Whether to precede strings with a two byte length, as in the - XCOFF .debug section. */ - bool xcoff; + /* Whether to precede strings with a two or four byte length, + as in the XCOFF .debug section. */ + char length_field_size; }; + /* Routine to create an entry in a strtab. */ static struct bfd_hash_entry * @@ -777,7 +778,7 @@ _bfd_stringtab_init (void) table->size = 0; table->first = NULL; table->last = NULL; - table->xcoff = false; + table->length_field_size = 0; return table; } @@ -787,13 +788,13 @@ _bfd_stringtab_init (void) string. */ struct bfd_strtab_hash * -_bfd_xcoff_stringtab_init (void) +_bfd_xcoff_stringtab_init (bool isxcoff64) { struct bfd_strtab_hash *ret; ret = _bfd_stringtab_init (); if (ret != NULL) - ret->xcoff = true; + ret->length_field_size = isxcoff64 ? 4 : 2; return ret; } @@ -852,11 +853,8 @@ _bfd_stringtab_add (struct bfd_strtab_hash *tab, { entry->index = tab->size; tab->size += strlen (str) + 1; - if (tab->xcoff) - { - entry->index += 2; - tab->size += 2; - } + entry->index += tab->length_field_size; + tab->size += tab->length_field_size; if (tab->first == NULL) tab->first = entry; else @@ -881,11 +879,8 @@ _bfd_stringtab_size (struct bfd_strtab_hash *tab) bool _bfd_stringtab_emit (bfd *abfd, struct bfd_strtab_hash *tab) { - bool xcoff; struct strtab_hash_entry *entry; - xcoff = tab->xcoff; - for (entry = tab->first; entry != NULL; entry = entry->next) { const char *str; @@ -894,7 +889,16 @@ _bfd_stringtab_emit (bfd *abfd, struct bfd_strtab_hash *tab) str = entry->root.string; len = strlen (str) + 1; - if (xcoff) + if (tab->length_field_size == 4) + { + bfd_byte buf[4]; + + /* The output length includes the null byte. */ + bfd_put_32 (abfd, (bfd_vma) len, buf); + if (bfd_bwrite ((void *) buf, (bfd_size_type) 4, abfd) != 4) + return false; + } + else if (tab->length_field_size == 2) { bfd_byte buf[2]; |