]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Add support for non-ELF targets to check their relocs.
authorNick Clifton <nickc@redhat.com>
Thu, 21 Apr 2016 14:43:00 +0000 (15:43 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 21 Apr 2016 14:43:00 +0000 (15:43 +0100)
bfd * aout-adobe.c: Use _bfd_generic_link_check_relocs.
* aout-target.h: Likewise.
* aout-tic30.c: Likewise.
* binary.c: Likewise.
* bout.c: Likewise.
* coff-alpha.c: Likewise.
* coff-rs6000.c: Likewise.
* coff64-rs6000.c: Likewise.
* coffcode.h: Likewise.
* i386msdos.c: Likewise.
* i386os9k.c: Likewise.
* ieee.c: Likewise.
* ihex.c: Likewise.
* libbfd-in.h: Likewise.
* libecoff.h: Likewise.
* mach-o-target.c: Likewise.
* mmo.c: Likewise.
* nlm-target.h: Likewise.
* oasys.c: Likewise.
* pef.c: Likewise.
* plugin.c: Likewise.
* ppcboot.c: Likewise.
* som.c: Likewise.
* srec.c: Likewise.
* tekhex.c: Likewise.
* versados.c: Likewise.
* vms-alpha.c: Likewise.
* xsym.c: Likewise.
* elfxx-target.h: Use _bfd_elf_link_check_relocs.
* linker.c (bfd_link_check_relocs): New function.
(_bfd_generic_link_check_relocs): New function.
* targets.c (BFD_JUMP_TABLE_LINK): Add initialization of
_bfd_link_check_relocs field.
(struct bfd_target)L Add _bfd_link_check_relocs field.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.

ld * ldlang.c (lang_check_relocs): Use bfd_link_check_relocs in
prefernce to _bfd_elf_link_check_relocs.  Drop test for ELF
targets.  Do not stop the checks when problems are encountered.

include * bfdlink.h: Add prototype for bfd_link_check_relocs.

38 files changed:
bfd/ChangeLog
bfd/aout-adobe.c
bfd/aout-target.h
bfd/aout-tic30.c
bfd/bfd-in2.h
bfd/binary.c
bfd/bout.c
bfd/coff-alpha.c
bfd/coff-rs6000.c
bfd/coff64-rs6000.c
bfd/coffcode.h
bfd/elfxx-target.h
bfd/i386msdos.c
bfd/i386os9k.c
bfd/ieee.c
bfd/ihex.c
bfd/libbfd-in.h
bfd/libbfd.h
bfd/libecoff.h
bfd/linker.c
bfd/mach-o-target.c
bfd/mmo.c
bfd/nlm-target.h
bfd/oasys.c
bfd/pef.c
bfd/plugin.c
bfd/ppcboot.c
bfd/som.c
bfd/srec.c
bfd/targets.c
bfd/tekhex.c
bfd/versados.c
bfd/vms-alpha.c
bfd/xsym.c
include/ChangeLog
include/bfdlink.h
ld/ChangeLog
ld/ldlang.c

index 201b16330d3d5b4a1fa4b1b9d31c2d95a9499c6b..979322522b1d910fcb34b0be67f9af7b972d7acf 100644 (file)
@@ -1,3 +1,42 @@
+2016-04-21  Nick Clifton  <nickc@redhat.com>
+
+       * aout-adobe.c: Use _bfd_generic_link_check_relocs.
+       * aout-target.h: Likewise.
+       * aout-tic30.c: Likewise.
+       * binary.c: Likewise.
+       * bout.c: Likewise.
+       * coff-alpha.c: Likewise.
+       * coff-rs6000.c: Likewise.
+       * coff64-rs6000.c: Likewise.
+       * coffcode.h: Likewise.
+       * i386msdos.c: Likewise.
+       * i386os9k.c: Likewise.
+       * ieee.c: Likewise.
+       * ihex.c: Likewise.
+       * libbfd-in.h: Likewise.
+       * libecoff.h: Likewise.
+       * mach-o-target.c: Likewise.
+       * mmo.c: Likewise.
+       * nlm-target.h: Likewise.
+       * oasys.c: Likewise.
+       * pef.c: Likewise.
+       * plugin.c: Likewise.
+       * ppcboot.c: Likewise.
+       * som.c: Likewise.
+       * srec.c: Likewise.
+       * tekhex.c: Likewise.
+       * versados.c: Likewise.
+       * vms-alpha.c: Likewise.
+       * xsym.c: Likewise.
+       * elfxx-target.h: Use _bfd_elf_link_check_relocs.
+       * linker.c (bfd_link_check_relocs): New function.
+       (_bfd_generic_link_check_relocs): New function.
+       * targets.c (BFD_JUMP_TABLE_LINK): Add initialization of
+       _bfd_link_check_relocs field.
+       (struct bfd_target)L Add _bfd_link_check_relocs field.
+       * bfd-in2.h: Regenerate.
+       * libbfd.h: Regenerate.
+
 2016-04-20  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf32-i386.c (elf_i386_gc_sweep_hook): Removed.
index 9556c895317cfffeda6dec6f15b42333e90e68fe..57fdce7890d5c561e28cf82bf9be085957f4563c 100644 (file)
@@ -472,6 +472,7 @@ aout_adobe_sizeof_headers (bfd *ignore_abfd ATTRIBUTE_UNUSED,
   _bfd_generic_copy_link_hash_symbol_type
 #define aout_32_bfd_final_link                     _bfd_generic_final_link
 #define aout_32_bfd_link_split_section             _bfd_generic_link_split_section
+#define aout_32_bfd_link_check_relocs               _bfd_generic_link_check_relocs
 
 const bfd_target aout_adobe_vec =
 {
index 7d962609f4e431a8e55145ff32296933dbf9a7c0..c7f5b1bf459814c11d324386b67bba8899850768 100644 (file)
@@ -542,6 +542,10 @@ MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
 #define MY_bfd_link_split_section  _bfd_generic_link_split_section
 #endif
 
+#ifndef MY_bfd_link_check_relocs
+#define MY_bfd_link_check_relocs   _bfd_generic_link_check_relocs
+#endif
+
 #ifndef MY_bfd_copy_private_bfd_data
 #define MY_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
 #endif
index f73b7e4340a5acf736b187a8d57b3f45c8719cf5..468944c0773a9cd8138da17f4842c4161cea2e42 100644 (file)
@@ -997,6 +997,10 @@ tic30_aout_set_arch_mach (bfd *abfd,
 #define MY_bfd_link_split_section  _bfd_generic_link_split_section
 #endif
 
+#ifndef MY_bfd_link_check_relocs
+#define MY_bfd_link_check_relocs   _bfd_generic_link_check_relocs
+#endif
+
 #ifndef MY_bfd_copy_private_bfd_data
 #define MY_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
 #endif
index 6532f6e1f628992096eacc778f69264a6d0b95d3..a19a6513992930442fa531235d58af73ef320ba2 100644 (file)
@@ -7413,6 +7413,7 @@ typedef struct bfd_target
   NAME##_bfd_copy_link_hash_symbol_type, \
   NAME##_bfd_final_link, \
   NAME##_bfd_link_split_section, \
+  NAME##_bfd_link_check_relocs, \
   NAME##_bfd_gc_sections, \
   NAME##_bfd_lookup_section_flags, \
   NAME##_bfd_merge_sections, \
@@ -7454,6 +7455,9 @@ typedef struct bfd_target
   /* Should this section be split up into smaller pieces during linking.  */
   bfd_boolean (*_bfd_link_split_section) (bfd *, struct bfd_section *);
 
+  /* Check the relocations in the bfd for validity.  */
+  bfd_boolean (* _bfd_link_check_relocs)(bfd *, struct bfd_link_info *);
+
   /* Remove sections that are not referenced from the output.  */
   bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *);
 
@@ -7566,6 +7570,12 @@ struct bfd_elf_version_tree * bfd_find_version_for_sym
 bfd_boolean bfd_hide_sym_by_version
    (struct bfd_elf_version_tree *verdefs, const char *sym_name);
 
+bfd_boolean bfd_link_check_relocs
+   (bfd *abfd, struct bfd_link_info *info);
+
+bfd_boolean _bfd_generic_link_check_relocs
+   (bfd *abfd, struct bfd_link_info *info);
+
 /* Extracted from simple.c.  */
 bfd_byte *bfd_simple_get_relocated_section_contents
    (bfd *abfd, asection *sec, bfd_byte *outbuf, asymbol **symbol_table);
index ce94af29af389f3b96bb5bb4ceafe2b2f7ec57c3..2223b5d2dfc5b2e4fb10a607f7070660d22d6818 100644 (file)
@@ -309,12 +309,12 @@ binary_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
 #define binary_bfd_define_common_symbol            bfd_generic_define_common_symbol
 #define binary_bfd_link_hash_table_create         _bfd_generic_link_hash_table_create
 #define binary_bfd_link_just_syms                 _bfd_generic_link_just_syms
-#define binary_bfd_copy_link_hash_symbol_type \
-  _bfd_generic_copy_link_hash_symbol_type
+#define binary_bfd_copy_link_hash_symbol_type     _bfd_generic_copy_link_hash_symbol_type
 #define binary_bfd_link_add_symbols               _bfd_generic_link_add_symbols
 #define binary_bfd_final_link                     _bfd_generic_final_link
 #define binary_bfd_link_split_section             _bfd_generic_link_split_section
 #define binary_get_section_contents_in_window     _bfd_generic_get_section_contents_in_window
+#define binary_bfd_link_check_relocs              _bfd_generic_link_check_relocs
 
 const bfd_target binary_vec =
 {
index 77023dbc1ba8a04655359543ca82d28eb17028af..0718d3e786765c4830da4b2431357918e80624a4 100644 (file)
@@ -1393,6 +1393,7 @@ b_out_bfd_get_relocated_section_contents (bfd *output_bfd,
 #define b_out_section_already_linked           _bfd_generic_section_already_linked
 #define b_out_bfd_define_common_symbol         bfd_generic_define_common_symbol
 #define aout_32_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
+#define b_out_bfd_link_check_relocs            _bfd_generic_link_check_relocs
 
 extern const bfd_target bout_le_vec;
 
index 70388f7db02ca41af5b3178be4aa79ae8b7c2ad7..55fd35070be4d9fa5a8e83c92e6492cd2791326a 100644 (file)
@@ -2351,6 +2351,7 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
 #define _bfd_ecoff_section_already_linked \
   _bfd_coff_section_already_linked
 #define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol
+#define _bfd_ecoff_bfd_link_check_relocs    _bfd_generic_link_check_relocs
 
 const bfd_target alpha_ecoff_le_vec =
 {
index e7a215b65b21be467849fe91f4532ac0762363c5..ffef1baee93e0172be87fd0b9bbc8f76f1a5ba77 100644 (file)
@@ -4014,6 +4014,7 @@ const struct xcoff_dwsect_name xcoff_dwsect_names[] = {
 #define _bfd_xcoff_bfd_discard_group bfd_generic_discard_group
 #define _bfd_xcoff_section_already_linked _bfd_generic_section_already_linked
 #define _bfd_xcoff_bfd_define_common_symbol _bfd_xcoff_define_common_symbol
+#define _bfd_xcoff_bfd_link_check_relocs    _bfd_generic_link_check_relocs
 
 /* For dynamic symbols and relocs entry points.  */
 #define _bfd_xcoff_get_synthetic_symtab _bfd_nodynamic_get_synthetic_symtab
index a0bc160ea02e20635546484acc7629724f79fed5..7b5bb2460f729307aecfd0f73a30b78039a8f7db 100644 (file)
@@ -2741,6 +2741,7 @@ const bfd_target rs6000_xcoff64_vec =
     _bfd_generic_copy_link_hash_symbol_type,
     _bfd_xcoff_bfd_final_link,
     _bfd_generic_link_split_section,
+    _bfd_generic_link_check_relocs,
     bfd_generic_gc_sections,
     bfd_generic_lookup_section_flags,
     bfd_generic_merge_sections,
@@ -2999,6 +3000,7 @@ const bfd_target rs6000_xcoff64_aix_vec =
     _bfd_generic_copy_link_hash_symbol_type,
     _bfd_xcoff_bfd_final_link,
     _bfd_generic_link_split_section,
+    _bfd_generic_link_check_relocs,
     bfd_generic_gc_sections,
     bfd_generic_lookup_section_flags,
     bfd_generic_merge_sections,
index 798f7f7f0a5d4383b6f59c2d163ec7f2b84b493d..eef3fa8d1da6be75d83be01a56334a5a11239b9b 100644 (file)
@@ -5480,6 +5480,8 @@ dummy_reloc16_extra_cases (bfd *abfd ATTRIBUTE_UNUSED,
   _bfd_generic_copy_link_hash_symbol_type
 #define coff_bfd_link_split_section  _bfd_generic_link_split_section
 
+#define coff_bfd_link_check_relocs   _bfd_generic_link_check_relocs
+
 #ifndef coff_start_final_link
 #define coff_start_final_link NULL
 #endif
index c179721ac685adb586c5d0d68b4e44b9dedd26bc..fde34b7d2928b375dd9c75d850a132b24f3c23dc 100644 (file)
 #define bfd_elfNN_bfd_link_split_section _bfd_generic_link_split_section
 #endif
 
+#ifndef bfd_elfNN_bfd_link_check_relocs
+#define bfd_elfNN_bfd_link_check_relocs  _bfd_elf_link_check_relocs
+#endif
+
 #ifndef bfd_elfNN_archive_p
 #define bfd_elfNN_archive_p bfd_generic_archive_p
 #endif
index fd24e8b571b8d4faf8e2869341e81fbba650120d..7be9544ea12e9e9161096ed30929753ef3968c25 100644 (file)
@@ -157,6 +157,7 @@ msdos_set_section_contents (bfd *abfd,
 #define msdos_bfd_final_link _bfd_generic_final_link
 #define msdos_bfd_link_split_section _bfd_generic_link_split_section
 #define msdos_set_arch_mach _bfd_generic_set_arch_mach
+#define msdos_bfd_link_check_relocs _bfd_generic_link_check_relocs
 
 #define msdos_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound
 #define msdos_canonicalize_symtab _bfd_nosymbols_canonicalize_symtab
index 6bfe2183db4119e27e712fc8e1fb131da5185dbc..dc5624a0cd0f33bd7d964c7d331454bd6ab29769 100644 (file)
@@ -183,6 +183,7 @@ os9k_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
   _bfd_generic_copy_link_hash_symbol_type
 #define os9k_bfd_final_link _bfd_generic_final_link
 #define os9k_bfd_link_split_section  _bfd_generic_link_split_section
+#define os9k_bfd_link_check_relocs   _bfd_generic_link_check_relocs
 
 const bfd_target i386_aout_os9k_vec =
   {
index f65f0f038c913ff7e65855864efd2f18db066bb1..73b3f98d477a1c4ac20eda66ac6eba80240a7b93 100644 (file)
@@ -3863,6 +3863,7 @@ ieee_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
   _bfd_generic_copy_link_hash_symbol_type
 #define ieee_bfd_final_link _bfd_generic_final_link
 #define ieee_bfd_link_split_section  _bfd_generic_link_split_section
+#define ieee_bfd_link_check_relocs   _bfd_generic_link_check_relocs
 
 const bfd_target ieee_vec =
 {
index ba3c08715136e3a1a8a5ad2fff983cb7dcba6aac..27e197dcbe2cca2205fb9737941dff6649acc74a 100644 (file)
@@ -940,10 +940,10 @@ ihex_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
 #define ihex_bfd_link_hash_table_create           _bfd_generic_link_hash_table_create
 #define ihex_bfd_link_add_symbols                 _bfd_generic_link_add_symbols
 #define ihex_bfd_link_just_syms                   _bfd_generic_link_just_syms
-#define ihex_bfd_copy_link_hash_symbol_type \
-  _bfd_generic_copy_link_hash_symbol_type
+#define ihex_bfd_copy_link_hash_symbol_type       _bfd_generic_copy_link_hash_symbol_type
 #define ihex_bfd_final_link                       _bfd_generic_final_link
 #define ihex_bfd_link_split_section               _bfd_generic_link_split_section
+#define ihex_bfd_link_check_relocs                _bfd_generic_link_check_relocs
 
 /* The Intel Hex target vector.  */
 
index 89d215bd3ece3ed33dd777e17bb4a659334373a3..5f2886339fe32178b4c6e13abdf21a6d41f5b183 100644 (file)
@@ -499,6 +499,8 @@ extern bfd_boolean _bfd_generic_set_section_contents
 #define _bfd_nolink_bfd_define_common_symbol \
   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, \
                     struct bfd_link_hash_entry *)) bfd_false)
+#define _bfd_nolink_bfd_link_check_relocs \
+  _bfd_generic_link_check_relocs
 
 /* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not
    have dynamic symbols or relocs.  Use BFD_JUMP_TABLE_DYNAMIC
index 16c0aee57828812aaa7e61786d20e8923d9c8272..5fe45ecae94955624fba74aa47d9b75ca0e1fbf0 100644 (file)
@@ -504,6 +504,8 @@ extern bfd_boolean _bfd_generic_set_section_contents
 #define _bfd_nolink_bfd_define_common_symbol \
   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, \
                     struct bfd_link_hash_entry *)) bfd_false)
+#define _bfd_nolink_bfd_link_check_relocs \
+  _bfd_generic_link_check_relocs
 
 /* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not
    have dynamic symbols or relocs.  Use BFD_JUMP_TABLE_DYNAMIC
index 0d97c463767fa8c2f232605bd7fa7ad2e8206891..e0991ee14b4367d0418ea6880c8569456bfcce91 100644 (file)
@@ -242,6 +242,7 @@ extern bfd_boolean _bfd_ecoff_get_section_contents
   (bfd *, asection *, void * location, file_ptr, bfd_size_type);
 
 #define _bfd_ecoff_bfd_link_split_section _bfd_generic_link_split_section
+#define _bfd_ecoff_bfd_link_check_relocs  _bfd_generic_link_check_relocs
 
 extern bfd_boolean _bfd_ecoff_bfd_copy_private_bfd_data
   (bfd *, bfd *);
index 97b5d18d84534ddcb774ea5c3289077ab896713f..082eea0715b0bd62820140bda518f690a6f9f63e 100644 (file)
@@ -3304,3 +3304,46 @@ bfd_hide_sym_by_version (struct bfd_elf_version_tree *verdefs,
   bfd_find_version_for_sym (verdefs, sym_name, &hidden);
   return hidden;
 }
+
+/*
+FUNCTION
+       bfd_link_check_relocs
+
+SYNOPSIS
+       bfd_boolean bfd_link_check_relocs
+         (bfd *abfd, struct bfd_link_info *info);
+
+DESCRIPTION
+       Checks the relocs in ABFD for validity.
+       Does not execute the relocs.
+       Return TRUE if everything is OK, FALSE otherwise.
+       This is the external entry point to this code.
+*/
+
+bfd_boolean
+bfd_link_check_relocs (bfd *abfd, struct bfd_link_info *info)
+{
+  return BFD_SEND (abfd, _bfd_link_check_relocs, (abfd, info));
+}
+
+/*
+FUNCTION
+       _bfd_generic_link_check_relocs
+
+SYNOPSIS
+       bfd_boolean _bfd_generic_link_check_relocs
+         (bfd *abfd, struct bfd_link_info *info);
+
+DESCRIPTION
+        Stub function for targets that do not implement reloc checking.
+       Return TRUE.
+       This is an internal function.  It should not be called from
+       outside the BFD library.
+*/
+
+bfd_boolean
+_bfd_generic_link_check_relocs (bfd *abfd ATTRIBUTE_UNUSED,
+                               struct bfd_link_info *info ATTRIBUTE_UNUSED)
+{
+  return TRUE;
+}
index bf956fdd3df8e565b55ea77be9ec8cdac23f915e..6b615ed774e9f36e42a03bc3358fdc56f8a539f5 100644 (file)
@@ -44,6 +44,7 @@
   _bfd_generic_copy_link_hash_symbol_type
 #define bfd_mach_o_bfd_final_link                     _bfd_generic_final_link
 #define bfd_mach_o_bfd_link_split_section             _bfd_generic_link_split_section
+#define bfd_mach_o_bfd_link_check_relocs              _bfd_generic_link_check_relocs
 #define bfd_mach_o_bfd_merge_private_bfd_data         _bfd_generic_bfd_merge_private_bfd_data
 #define bfd_mach_o_bfd_set_private_flags              bfd_mach_o_bfd_set_private_flags
 #define bfd_mach_o_get_section_contents               _bfd_generic_get_section_contents
index d396fd742816b13ab7255b9a341e714a8292083c..b8af63a711f3080052da0544bdf1f3b703c61b03 100644 (file)
--- a/bfd/mmo.c
+++ b/bfd/mmo.c
@@ -3278,6 +3278,7 @@ mmo_write_object_contents (bfd *abfd)
   _bfd_generic_copy_link_hash_symbol_type
 #define mmo_bfd_final_link _bfd_generic_final_link
 #define mmo_bfd_link_split_section _bfd_generic_link_split_section
+#define mmo_bfd_link_check_relocs  _bfd_generic_link_check_relocs
 
 /* Strictly speaking, only MMIX uses this restricted format, but let's not
    stop anybody from shooting themselves in the foot.  */
index 082e856284861ad7647e7e9b35a47114ec49f658..6ed0b5c68471d8f0984beabe1d11b25709cba3d5 100644 (file)
@@ -59,6 +59,7 @@
   _bfd_generic_copy_link_hash_symbol_type
 #define nlm_bfd_final_link                      _bfd_generic_final_link
 #define nlm_bfd_link_split_section              _bfd_generic_link_split_section
+#define nlm_bfd_link_check_relocs               _bfd_generic_link_check_relocs
 
 /* This structure contains everything that BFD knows about a target.
    It includes things like its byte order, name, what routines to call
index f7791d231faf609fb1ab65fc66ab4ff0dd3d9f9d..31555e094abb4e17f72e650230f6199c9a6a2d38 100644 (file)
@@ -1192,6 +1192,7 @@ oasys_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
   _bfd_generic_copy_link_hash_symbol_type
 #define oasys_bfd_final_link                       _bfd_generic_final_link
 #define oasys_bfd_link_split_section               _bfd_generic_link_split_section
+#define oasys_bfd_link_check_relocs                _bfd_generic_link_check_relocs
 
 const bfd_target oasys_vec =
 {
index fb9a07abd156f322fc694c8df1485c9f658bb378..30c31794909e504acbab11daea45079a6179ab21 100644 (file)
--- a/bfd/pef.c
+++ b/bfd/pef.c
@@ -67,6 +67,7 @@
 #define bfd_pef_bfd_final_link                      _bfd_generic_final_link
 #define bfd_pef_bfd_link_split_section              _bfd_generic_link_split_section
 #define bfd_pef_get_section_contents_in_window      _bfd_generic_get_section_contents_in_window
+#define bfd_pef_bfd_link_check_relocs               _bfd_generic_link_check_relocs
 
 static int
 bfd_pef_parse_traceback_table (bfd *abfd,
index f57833c1fb43703a4169eff7310d5d88bf8b47f9..fd7bac04ece081d124abf3b13597def9cfc13865 100644 (file)
@@ -106,6 +106,7 @@ dlerror (void)
 #define bfd_plugin_section_already_linked             _bfd_generic_section_already_linked
 #define bfd_plugin_bfd_define_common_symbol           bfd_generic_define_common_symbol
 #define bfd_plugin_bfd_copy_link_hash_symbol_type     _bfd_generic_copy_link_hash_symbol_type
+#define bfd_plugin_bfd_link_check_relocs              _bfd_generic_link_check_relocs
 
 static enum ld_plugin_status
 message (int level ATTRIBUTE_UNUSED,
index ea54d62ee23c85ea520db2f51c67311b40cb9286..afb6ce0d204a878ce5a91e8049afcc8251455e85 100644 (file)
@@ -465,6 +465,7 @@ ppcboot_bfd_print_private_bfd_data (bfd *abfd, void * farg)
 #define ppcboot_bfd_link_split_section _bfd_generic_link_split_section
 #define ppcboot_get_section_contents_in_window \
   _bfd_generic_get_section_contents_in_window
+#define ppcboot_bfd_link_check_relocs _bfd_generic_link_check_relocs
 
 #define ppcboot_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
 #define ppcboot_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
index 859e886551025815affe1ec6b7ac5125b3a848c0..635727c4d5d6148021a5e96475e3d5a25baa0115 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -6758,6 +6758,7 @@ som_bfd_link_split_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
 #define som_bfd_copy_private_header_data       _bfd_generic_bfd_copy_private_header_data
 #define som_bfd_set_private_flags              _bfd_generic_bfd_set_private_flags
 #define som_find_inliner_info                  _bfd_nosymbols_find_inliner_info
+#define som_bfd_link_check_relocs               _bfd_generic_link_check_relocs
 
 const bfd_target hppa_som_vec =
 {
index 02b8dad440f8497876fa8f4785e9a42a4193d18d..5fdd68bdd0f8066e019028acb4020a50b024bad5 100644 (file)
@@ -1275,10 +1275,10 @@ srec_print_symbol (bfd *abfd,
 #define srec_bfd_link_hash_table_create           _bfd_generic_link_hash_table_create
 #define srec_bfd_link_add_symbols                 _bfd_generic_link_add_symbols
 #define srec_bfd_link_just_syms                   _bfd_generic_link_just_syms
-#define srec_bfd_copy_link_hash_symbol_type \
-  _bfd_generic_copy_link_hash_symbol_type
+#define srec_bfd_copy_link_hash_symbol_type       _bfd_generic_copy_link_hash_symbol_type
 #define srec_bfd_final_link                       _bfd_generic_final_link
 #define srec_bfd_link_split_section               _bfd_generic_link_split_section
+#define srec_bfd_link_check_relocs                _bfd_generic_link_check_relocs
 
 const bfd_target srec_vec =
 {
index 50f3712be015b351e77b58393ceaa969e9ca65f9..a9edd4c9f025c1f80fa39547e513948bb64f5943 100644 (file)
@@ -452,6 +452,7 @@ BFD_JUMP_TABLE macros.
 .  NAME##_bfd_copy_link_hash_symbol_type, \
 .  NAME##_bfd_final_link, \
 .  NAME##_bfd_link_split_section, \
+.  NAME##_bfd_link_check_relocs, \
 .  NAME##_bfd_gc_sections, \
 .  NAME##_bfd_lookup_section_flags, \
 .  NAME##_bfd_merge_sections, \
@@ -493,6 +494,9 @@ BFD_JUMP_TABLE macros.
 .  {* Should this section be split up into smaller pieces during linking.  *}
 .  bfd_boolean (*_bfd_link_split_section) (bfd *, struct bfd_section *);
 .
+.  {* Check the relocations in the bfd for validity.  *}
+.  bfd_boolean (* _bfd_link_check_relocs)(bfd *, struct bfd_link_info *);
+.
 .  {* Remove sections that are not referenced from the output.  *}
 .  bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *);
 .
index 7de2f24bbd409a1ffdc6a2879304d559e5a0860f..b94f843b8a7db15619c513b0e8249f7835769780 100644 (file)
@@ -980,11 +980,11 @@ tekhex_print_symbol (bfd *abfd,
 #define tekhex_bfd_link_hash_table_create           _bfd_generic_link_hash_table_create
 #define tekhex_bfd_link_add_symbols                 _bfd_generic_link_add_symbols
 #define tekhex_bfd_link_just_syms                   _bfd_generic_link_just_syms
-#define tekhex_bfd_copy_link_hash_symbol_type \
-  _bfd_generic_copy_link_hash_symbol_type
+#define tekhex_bfd_copy_link_hash_symbol_type       _bfd_generic_copy_link_hash_symbol_type
 #define tekhex_bfd_final_link                       _bfd_generic_final_link
 #define tekhex_bfd_link_split_section               _bfd_generic_link_split_section
 #define tekhex_get_section_contents_in_window       _bfd_generic_get_section_contents_in_window
+#define tekhex_bfd_link_check_relocs                _bfd_generic_link_check_relocs
 
 const bfd_target tekhex_vec =
 {
index c8b3c48f389aa5b7eba64a73a3e4bf4e4c8be37d..ed46e3baf43952b9e3151f88497346ab7bac9966 100644 (file)
@@ -873,6 +873,7 @@ versados_canonicalize_reloc (bfd *abfd,
   _bfd_generic_copy_link_hash_symbol_type
 #define versados_bfd_final_link                       _bfd_generic_final_link
 #define versados_bfd_link_split_section               _bfd_generic_link_split_section
+#define versados_bfd_link_check_relocs                _bfd_generic_link_check_relocs
 
 const bfd_target m68k_versados_vec =
 {
index d55780e2e3d4584cc3a07a485cd800f9cda6bf57..e6cfc1fcf2905a568438bd4e3cc3e8ec412a84fd 100644 (file)
@@ -9260,6 +9260,7 @@ bfd_vms_get_data (bfd *abfd)
   _bfd_nodynamic_get_dynamic_reloc_upper_bound
 #define alpha_vms_canonicalize_dynamic_reloc \
   _bfd_nodynamic_canonicalize_dynamic_reloc
+#define alpha_vms_bfd_link_check_relocs              _bfd_generic_link_check_relocs
 
 const bfd_target alpha_vms_vec =
 {
index c637f74072b6dfa9e882c3ebbd7a85f8fd9df8c6..62cc02e60a7eec0f35c192f9284efffc2438327b 100644 (file)
@@ -59,6 +59,7 @@
 #define bfd_sym_bfd_final_link                      _bfd_generic_final_link
 #define bfd_sym_bfd_link_split_section              _bfd_generic_link_split_section
 #define bfd_sym_get_section_contents_in_window      _bfd_generic_get_section_contents_in_window
+#define bfd_sym_bfd_link_check_relocs               _bfd_generic_link_check_relocs
 
 extern const bfd_target sym_vec;
 
index a419ef227930e7779c92be0824c3ba16bb218f14..c73bdf42615ec9b94dc8fe2af89e87084367261d 100644 (file)
@@ -1,3 +1,7 @@
+2016-04-21  Nick Clifton  <nickc@redhat.com>
+
+       * bfdlink.h: Add prototype for bfd_link_check_relocs.
+
 2016-04-20  H.J. Lu  <hongjiu.lu@intel.com>
 
        * bfdlink.h (bfd_link_info): Add check_relocs_after_open_input.
index 90467b54edc46f6d27241e2aba921a253bff7aae..728fbe71075675e355fd343940813b6f846bbf6b 100644 (file)
@@ -226,6 +226,11 @@ extern void bfd_link_repair_undef_list
 /* Read symbols and cache symbol pointer array in outsymbols.  */
 extern bfd_boolean bfd_generic_link_read_symbols (bfd *);
 
+/* Check the relocs in the BFD.  Called after all the input
+   files have been loaded, and garbage collection has tagged
+   any unneeded sections.  */
+extern bfd_boolean bfd_link_check_relocs (bfd *,struct bfd_link_info *);
+
 struct bfd_sym_chain
 {
   struct bfd_sym_chain *next;
index 0721142d475add2045c640da2b6939515f1d2c11..8bb2be12fc79af6ec0f5ae0a024f6f8fecd6f2c6 100644 (file)
@@ -1,3 +1,9 @@
+2016-04-21  Nick Clifton  <nickc@redhat.com>
+
+       * ldlang.c (lang_check_relocs): Use bfd_link_check_relocs in
+       prefernce to _bfd_elf_link_check_relocs.  Drop test for ELF
+       targets.  Do not stop the checks when problems are encountered.
+
 2016-04-21  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-scripts/cross3.t: Add commonly used data
index 2ae36409e28ca3121f50d63d4d2fe0ad9a884df3..96947da974ba920ee44e5023535ba69962b285a5 100644 (file)
@@ -6783,18 +6783,19 @@ lang_add_gc_name (const char * name)
 static void
 lang_check_relocs (void)
 {
-  if (link_info.check_relocs_after_open_input
-      && bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
+  if (link_info.check_relocs_after_open_input)
     {
       bfd *abfd;
 
       for (abfd = link_info.input_bfds;
           abfd != (bfd *) NULL; abfd = abfd->link.next)
-       if (!_bfd_elf_link_check_relocs (abfd, &link_info))
+       if (!bfd_link_check_relocs (abfd, &link_info))
          {
-           /* no object output, fail return */
+           /* No object output, fail return.  */
            config.make_executable = FALSE;
-           break;
+           /* Note: we do not abort the loop, but rather
+              continue the scan in case there are other
+              bad relocations to report.  */
          }
     }
 }