[binutils-gdb] bfd: new functions for getting strings out of a strtab

Jose E.Marchesi jemarch@sourceware.org
Thu Oct 3 16:33:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=22ccb8495447fa2ea31b1f1dea7e94eecf97475d

commit 22ccb8495447fa2ea31b1f1dea7e94eecf97475d
Author: Nick Alcock <nick.alcock@oracle.com>
Date:   Sat Jul 13 21:47:30 2019 +0100

    bfd: new functions for getting strings out of a strtab
    
    The CTF linking process wants to deduplicate the CTF strtab against the
    ELF strtab, for which it needs to know the number of strings in the
    strtab and it needs to be able to extract them one by one.
    
    The BFD strtab functions only support returning the
    size-or-section-length of the strtab (with _bfd_elf_strtab_size)
    and returning the offset (but not string!) and decrementing the refcount
    at the same time.
    
    So add new functions _bfd_elf_strtab_len (that just returns the length
    in strings of the strtab, never the section size) and bfd_elf_strtab_str
    (which returns the string at a given strtab index, and its offset,
    without touching the refcount).
    
    It is probably a mistake to use _bfd_elf_strtab_str in particular before
    _bfd_elf_strtab_finalize is called, and will not produce useful output
    if you do so.
    
    v5: fix tabdamage.
    
    bfd/
    	* elf-strtab.c (_bfd_elf_strtab_len): New.
    	(_bfd_elf_strtab_str): Likewise.
    	* bfd-elf.h: Declare them.

Diff:
---
 bfd/ChangeLog    |  6 ++++++
 bfd/elf-bfd.h    |  4 ++++
 bfd/elf-strtab.c | 19 +++++++++++++++++++
 3 files changed, 29 insertions(+)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 42300c1..420b13d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,11 @@
 2019-07-13  Nick Alcock  <nick.alcock@oracle.com>
 
+	* elf-strtab.c (_bfd_elf_strtab_len): New.
+	(_bfd_elf_strtab_str): Likewise.
+	* bfd-elf.h: Declare them.
+
+2019-07-13  Nick Alcock  <nick.alcock@oracle.com>
+
 	* elf-bfd.h (bfd_elf_get_str_section): Add.
 	* elf.c (bfd_elf_get_str_section): No longer static.
 
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index a9e2d3e..4240d97 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2252,8 +2252,12 @@ extern void _bfd_elf_strtab_restore
   (struct elf_strtab_hash *, void *);
 extern bfd_size_type _bfd_elf_strtab_size
   (struct elf_strtab_hash *);
+extern bfd_size_type _bfd_elf_strtab_len
+  (struct elf_strtab_hash *);
 extern bfd_size_type _bfd_elf_strtab_offset
   (struct elf_strtab_hash *, size_t);
+extern const char * _bfd_elf_strtab_str
+  (struct elf_strtab_hash *, size_t idx, size_t *offset);
 extern bfd_boolean _bfd_elf_strtab_emit
   (bfd *, struct elf_strtab_hash *);
 extern void _bfd_elf_strtab_finalize
diff --git a/bfd/elf-strtab.c b/bfd/elf-strtab.c
index ec9002f..cc1dcb3 100644
--- a/bfd/elf-strtab.c
+++ b/bfd/elf-strtab.c
@@ -271,6 +271,12 @@ _bfd_elf_strtab_size (struct elf_strtab_hash *tab)
 }
 
 bfd_size_type
+_bfd_elf_strtab_len (struct elf_strtab_hash *tab)
+{
+  return tab->size;
+}
+
+bfd_size_type
 _bfd_elf_strtab_offset (struct elf_strtab_hash *tab, size_t idx)
 {
   struct elf_strtab_hash_entry *entry;
@@ -285,6 +291,19 @@ _bfd_elf_strtab_offset (struct elf_strtab_hash *tab, size_t idx)
   return tab->array[idx]->u.index;
 }
 
+const char *
+_bfd_elf_strtab_str (struct elf_strtab_hash *tab, size_t idx,
+		     bfd_size_type *offset)
+{
+  if (idx == 0)
+    return 0;
+  BFD_ASSERT (idx < tab->size);
+  BFD_ASSERT (tab->sec_size);
+  if (offset)
+    *offset = tab->array[idx]->u.index;
+  return tab->array[idx]->root.string;
+}
+
 bfd_boolean
 _bfd_elf_strtab_emit (register bfd *abfd, struct elf_strtab_hash *tab)
 {



More information about the Binutils-cvs mailing list