aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog13
-rw-r--r--bfd/elf-bfd.h5
-rw-r--r--bfd/elf.c15
-rw-r--r--bfd/elf32-mips.c1
-rw-r--r--bfd/elf64-mips.c1
-rw-r--r--bfd/elfn32-mips.c1
-rw-r--r--bfd/elfxx-mips.c95
-rw-r--r--bfd/elfxx-mips.h1
-rw-r--r--bfd/elfxx-target.h4
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 <clm@codesourcery.com>
+
+ * 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 <amodra@bigpond.net.au>
* 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,