Display symbol version when dumping dynrelocs

Both readelf/objdump know how to get symbol version string for dynamic
symbols.  This patch extracts this functionality into a separate
function and uses it to add symbol version string to versioned symbol
names when dumping dynamic relocations.

bfd/

	PR binutils/16496
	* elf-bfd.h (bfd_elf_get_symbol_version_string): New.
	* elf.c (bfd_elf_get_symbol_version_string): New.  Extracted
	from bfd_elf_print_symbol.
	(bfd_elf_print_symbol): Use it.

binutils/

	PR binutils/16496
	* objdump.c (objdump_print_symname): Call
	bfd_elf_get_symbol_version_string to get ELF symbol version
	string.  Append version string if needed.

	* readelf.c (versioned_symbol_info): New enum.
	(get_symbol_version_string): New.  Extracted from
	process_symbol_table.
	(dump_relocations): Add a new argument to indicate if dynamic
	symbol table is used.  Use get_symbol_version_string to get
	symbol version string for dynamic symbol.  Append version string
	if needed.
	(process_relocs): Updated dump_relocations call.
	(process_symbol_table): Use get_symbol_version_string.

ld/testsuite/

	PR binutils/16496
	* ld-cris/weakref3.d: Add symbol version string to versioned
	symbol names in dynamic relocation.
	* ld-cris/weakref4.d: Likewise.
	* ld-elfvers/vers24.rd: Likewise.

	* ld-elf/pr16496a.c: New file.
	* ld-elf/pr16496a.map: Likewise.
	* ld-elf/pr16496b.c: Likewise.
	* ld-elf/pr16496b.od: Likewise.

	* ld-elf/shared.exp (build_tests): Add libpr16496a.so and
	libpr16496b.so tests.
This commit is contained in:
H.J. Lu
2014-11-25 06:47:44 -08:00
parent dd7e64d45b
commit bb4d2ac2cc
15 changed files with 378 additions and 206 deletions

@ -795,7 +795,8 @@ objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
asymbol *sym)
{
char *alloc;
const char *name;
const char *name, *version_string = NULL;
bfd_boolean hidden = FALSE;
alloc = NULL;
name = bfd_asymbol_name (sym);
@ -807,10 +808,26 @@ objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
name = alloc;
}
if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
version_string = bfd_elf_get_symbol_version_string (abfd, sym,
&hidden);
if (bfd_is_und_section (bfd_get_section (sym)))
hidden = TRUE;
if (inf != NULL)
(*inf->fprintf_func) (inf->stream, "%s", name);
{
(*inf->fprintf_func) (inf->stream, "%s", name);
if (version_string && *version_string != '\0')
(*inf->fprintf_func) (inf->stream, hidden ? "@%s" : "@@%s",
version_string);
}
else
printf ("%s", name);
{
printf ("%s", name);
if (version_string && *version_string != '\0')
printf (hidden ? "@%s" : "@@%s", version_string);
}
if (alloc != NULL)
free (alloc);