summaryrefslogtreecommitdiff
path: root/ld/ldlang.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2002-03-13 02:56:36 +0000
committerAlan Modra <amodra@gmail.com>2002-03-13 02:56:36 +0000
commit30cba02509c283d0307f9df3c89155e9d38c9737 (patch)
tree9f2c6f1f694d0a644e3295349bb60366b2e541c7 /ld/ldlang.c
parent4ddafab0a6fa8c3069d0b323359bf20d3b390e46 (diff)
downloadbinutils-gdb-30cba02509c283d0307f9df3c89155e9d38c9737.tar.gz
* ldlang.c (lang_check): Do relocatable link checks first, so that
warn_mismatch can't override. Check compatible and word size too.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r--ld/ldlang.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 413ccf818d3..9858fff4a3a 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -3569,8 +3569,27 @@ lang_check ()
file = file->input_statement.next)
{
input_bfd = file->input_statement.the_bfd;
- compatible = bfd_arch_get_compatible (input_bfd,
- output_bfd);
+ compatible = bfd_arch_get_compatible (input_bfd, output_bfd);
+
+ /* In general it is not possible to perform a relocatable
+ link between differing object formats when the input
+ file has relocations, because the relocations in the
+ input format may not have equivalent representations in
+ the output format (and besides BFD does not translate
+ relocs for other link purposes than a final link). */
+ if (link_info.relocateable
+ && (compatible == NULL
+ || bfd_get_flavour (input_bfd) != bfd_get_flavour (output_bfd)
+ || (input_bfd->arch_info->bits_per_word
+ != output_bfd->arch_info->bits_per_word))
+ && (bfd_get_file_flags (input_bfd) & HAS_RELOC) != 0)
+ {
+ einfo (_("%P%F: Relocatable linking with relocations from format %s (%B) to format %s (%B) is not supported\n"),
+ bfd_get_target (input_bfd), input_bfd,
+ bfd_get_target (output_bfd), output_bfd);
+ /* einfo with %F exits. */
+ }
+
if (compatible == NULL)
{
if (command_line.warn_mismatch)
@@ -3578,18 +3597,6 @@ lang_check ()
bfd_printable_name (input_bfd), input_bfd,
bfd_printable_name (output_bfd));
}
- else if (link_info.relocateable
- /* In general it is not possible to perform a relocatable
- link between differing object formats when the input
- file has relocations, because the relocations in the
- input format may not have equivalent representations in
- the output format (and besides BFD does not translate
- relocs for other link purposes than a final link). */
- && bfd_get_flavour (input_bfd) != bfd_get_flavour (output_bfd)
- && (bfd_get_file_flags (input_bfd) & HAS_RELOC) != 0)
- einfo (_("%P%F: Relocatable linking with relocations from format %s (%B) to format %s (%B) is not supported\n"),
- bfd_get_target (input_bfd), input_bfd,
- bfd_get_target (output_bfd), output_bfd);
else if (bfd_count_sections (input_bfd))
{
/* If the input bfd has no contents, it shouldn't set the