From ad9563d653f3fbd7a8e55d542cc5297657a78714 Mon Sep 17 00:00:00 2001 From: Catherine Moore Date: Wed, 27 Feb 2008 17:06:06 +0000 Subject: [PATCH] * elf.c ( _bfd_elf_print_private_bfd_data): Call elf_backend_get_target_dtag if defined. * elf32-mips.c (elf_backend_get_target_dtag): Define. * elf64-mips.c: Likewise. * elfn32-mips.c: Likewise. * elfxx-mips.c (_bfd_mips_elf_get_target_dtag): New. * elfxx-mips.h (_bfd_mips_elf_get_target_dtag): Declare. * elf-bfd.h (elf_backend_get_target_dtag): Add prototype. * elfxx-target.h (elf_backend_get_target_dtag): Add default. (elf_backend_data): Add elf_backend_get_target_dtag. --- bfd/ChangeLog | 13 +++++++ bfd/elf-bfd.h | 5 +++ bfd/elf.c | 15 ++++++-- bfd/elf32-mips.c | 1 + bfd/elf64-mips.c | 1 + bfd/elfn32-mips.c | 1 + bfd/elfxx-mips.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++ bfd/elfxx-mips.h | 1 + bfd/elfxx-target.h | 4 ++ 9 files changed, 132 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1b54ff76e84..1646c19d641 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +2008-02-27 Catherine Moore + + * elf.c ( _bfd_elf_print_private_bfd_data): Call + elf_backend_get_target_dtag if defined. + * elf32-mips.c (elf_backend_get_target_dtag): Define. + * elf64-mips.c: Likewise. + * elfn32-mips.c: Likewise. + * elfxx-mips.c (_bfd_mips_elf_get_target_dtag): New. + * elfxx-mips.h (_bfd_mips_elf_get_target_dtag): Declare. + * elf-bfd.h (elf_backend_get_target_dtag): Add prototype. + * elfxx-target.h (elf_backend_get_target_dtag): Add default. + (elf_backend_data): Add elf_backend_get_target_dtag. + 2008-02-26 Alan Modra * elf32-ppc.c (ppc_elf_check_relocs): Set pointer_equality_needed diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 444b9a775b6..164cbde83ef 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -993,6 +993,11 @@ struct elf_backend_data (struct elf_link_hash_entry *, const Elf_Internal_Sym *, bfd_boolean, bfd_boolean); + /* This function, if defined, will return a string containing the + name of a target-specific dynamic tag. */ + char *(*elf_backend_get_target_dtag) + (bfd_vma); + /* Decide whether an undefined symbol is special and can be ignored. This is the case for OPTIONAL symbols on IRIX. */ bfd_boolean (*elf_backend_ignore_undef_symbol) diff --git a/bfd/elf.c b/bfd/elf.c index b0030c7473c..54375c2757c 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -1204,9 +1204,10 @@ _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg) for (; extdyn < extdynend; extdyn += extdynsize) { Elf_Internal_Dyn dyn; - const char *name; + const char *name = ""; char ab[20]; bfd_boolean stringp; + const struct elf_backend_data *bed = get_elf_backend_data (abfd); (*swap_dyn_in) (abfd, extdyn, &dyn); @@ -1217,8 +1218,14 @@ _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg) switch (dyn.d_tag) { default: - sprintf (ab, "0x%lx", (unsigned long) dyn.d_tag); - name = ab; + if (bed->elf_backend_get_target_dtag) + name = (*bed->elf_backend_get_target_dtag) (dyn.d_tag); + + if (!strcmp (name, "")) + { + sprintf (ab, "0x%lx", (unsigned long) dyn.d_tag); + name = ab; + } break; case DT_NEEDED: name = "NEEDED"; stringp = TRUE; break; @@ -1281,7 +1288,7 @@ _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg) case DT_GNU_HASH: name = "GNU_HASH"; break; } - fprintf (f, " %-11s ", name); + fprintf (f, " %-20s ", name); if (! stringp) fprintf (f, "0x%lx", (unsigned long) dyn.d_un.d_val); else diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 81fb8c2046c..5e3eac66d2a 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -1558,6 +1558,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define elf_backend_check_relocs _bfd_mips_elf_check_relocs #define elf_backend_merge_symbol_attribute \ _bfd_mips_elf_merge_symbol_attribute +#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag #define elf_backend_adjust_dynamic_symbol \ _bfd_mips_elf_adjust_dynamic_symbol #define elf_backend_always_size_sections \ diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 025f9fbde87..e8e00fb9e8c 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -3107,6 +3107,7 @@ const struct elf_size_info mips_elf64_size_info = #define elf_backend_check_relocs _bfd_mips_elf_check_relocs #define elf_backend_merge_symbol_attribute \ _bfd_mips_elf_merge_symbol_attribute +#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag #define elf_backend_adjust_dynamic_symbol \ _bfd_mips_elf_adjust_dynamic_symbol #define elf_backend_always_size_sections \ diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index 9052dfd7e34..74133c5a9df 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -2361,6 +2361,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define elf_backend_check_relocs _bfd_mips_elf_check_relocs #define elf_backend_merge_symbol_attribute \ _bfd_mips_elf_merge_symbol_attribute +#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag #define elf_backend_adjust_dynamic_symbol \ _bfd_mips_elf_adjust_dynamic_symbol #define elf_backend_always_size_sections \ diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 514b14cfe76..4f141402b0b 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -11700,6 +11700,101 @@ _bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags) return TRUE; } +char * +_bfd_mips_elf_get_target_dtag (bfd_vma dtag) +{ + switch (dtag) + { + default: return ""; + case DT_MIPS_RLD_VERSION: + return "MIPS_RLD_VERSION"; + case DT_MIPS_TIME_STAMP: + return "MIPS_TIME_STAMP"; + case DT_MIPS_ICHECKSUM: + return "MIPS_ICHECKSUM"; + case DT_MIPS_IVERSION: + return "MIPS_IVERSION"; + case DT_MIPS_FLAGS: + return "MIPS_FLAGS"; + case DT_MIPS_BASE_ADDRESS: + return "MIPS_BASE_ADDRESS"; + case DT_MIPS_MSYM: + return "MIPS_MSYM"; + case DT_MIPS_CONFLICT: + return "MIPS_CONFLICT"; + case DT_MIPS_LIBLIST: + return "MIPS_LIBLIST"; + case DT_MIPS_LOCAL_GOTNO: + return "MIPS_LOCAL_GOTNO"; + case DT_MIPS_CONFLICTNO: + return "MIPS_CONFLICTNO"; + case DT_MIPS_LIBLISTNO: + return "MIPS_LIBLISTNO"; + case DT_MIPS_SYMTABNO: + return "MIPS_SYMTABNO"; + case DT_MIPS_UNREFEXTNO: + return "MIPS_UNREFEXTNO"; + case DT_MIPS_GOTSYM: + return "MIPS_GOTSYM"; + case DT_MIPS_HIPAGENO: + return "MIPS_HIPAGENO"; + case DT_MIPS_RLD_MAP: + return "MIPS_RLD_MAP"; + case DT_MIPS_DELTA_CLASS: + return "MIPS_DELTA_CLASS"; + case DT_MIPS_DELTA_CLASS_NO: + return "MIPS_DELTA_CLASS_NO"; + case DT_MIPS_DELTA_INSTANCE: + return "MIPS_DELTA_INSTANCE"; + case DT_MIPS_DELTA_INSTANCE_NO: + return "MIPS_DELTA_INSTANCE_NO"; + case DT_MIPS_DELTA_RELOC: + return "MIPS_DELTA_RELOC"; + case DT_MIPS_DELTA_RELOC_NO: + return "MIPS_DELTA_RELOC_NO"; + case DT_MIPS_DELTA_SYM: + return "MIPS_DELTA_SYM"; + case DT_MIPS_DELTA_SYM_NO: + return "MIPS_DELTA_SYM_NO"; + case DT_MIPS_DELTA_CLASSSYM: + return "MIPS_DELTA_CLASSSYM"; + case DT_MIPS_DELTA_CLASSSYM_NO: + return "MIPS_DELTA_CLASSSYM_NO"; + case DT_MIPS_CXX_FLAGS: + return "MIPS_CXX_FLAGS"; + case DT_MIPS_PIXIE_INIT: + return "MIPS_PIXIE_INIT"; + case DT_MIPS_SYMBOL_LIB: + return "MIPS_SYMBOL_LIB"; + case DT_MIPS_LOCALPAGE_GOTIDX: + return "MIPS_LOCALPAGE_GOTIDX"; + case DT_MIPS_LOCAL_GOTIDX: + return "MIPS_LOCAL_GOTIDX"; + case DT_MIPS_HIDDEN_GOTIDX: + return "MIPS_HIDDEN_GOTIDX"; + case DT_MIPS_PROTECTED_GOTIDX: + return "MIPS_PROTECTED_GOT_IDX"; + case DT_MIPS_OPTIONS: + return "MIPS_OPTIONS"; + case DT_MIPS_INTERFACE: + return "MIPS_INTERFACE"; + case DT_MIPS_DYNSTR_ALIGN: + return "DT_MIPS_DYNSTR_ALIGN"; + case DT_MIPS_INTERFACE_SIZE: + return "DT_MIPS_INTERFACE_SIZE"; + case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: + return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR"; + case DT_MIPS_PERF_SUFFIX: + return "DT_MIPS_PERF_SUFFIX"; + case DT_MIPS_COMPACT_SIZE: + return "DT_MIPS_COMPACT_SIZE"; + case DT_MIPS_GP_VALUE: + return "DT_MIPS_GP_VALUE"; + case DT_MIPS_AUX_DYNAMIC: + return "DT_MIPS_AUX_DYNAMIC"; + } +} + bfd_boolean _bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr) { diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h index f8635da1997..79d234af338 100644 --- a/bfd/elfxx-mips.h +++ b/bfd/elfxx-mips.h @@ -138,6 +138,7 @@ extern bfd_vma _bfd_mips_elf_sign_extend (bfd_vma, int); extern void _bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *, const Elf_Internal_Sym *, bfd_boolean, bfd_boolean); +extern char *_bfd_mips_elf_get_target_dtag (bfd_vma); extern bfd_boolean _bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *); diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 2e6be6d84ba..148f5cb2bce 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -482,6 +482,9 @@ #ifndef elf_backend_merge_symbol_attribute #define elf_backend_merge_symbol_attribute NULL #endif +#ifndef elf_backend_get_target_dtag +#define elf_backend_get_target_dtag NULL +#endif #ifndef elf_backend_ignore_undef_symbol #define elf_backend_ignore_undef_symbol NULL #endif @@ -672,6 +675,7 @@ static struct elf_backend_data elfNN_bed = elf_backend_hide_symbol, elf_backend_fixup_symbol, elf_backend_merge_symbol_attribute, + elf_backend_get_target_dtag, elf_backend_ignore_undef_symbol, elf_backend_emit_relocs, elf_backend_count_relocs, -- 2.30.2