summaryrefslogtreecommitdiff
path: root/ld/ldfile.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2004-10-11 02:40:47 +0000
committerAlan Modra <amodra@gmail.com>2004-10-11 02:40:47 +0000
commit6c0c5b1e5da52f6a3cb0fa3e1707fb9652459770 (patch)
tree9c071ad898a618a269093aab55f1d3267b667c19 /ld/ldfile.c
parent25652d4f22fc708c03b242cc8fa82e3de5f48980 (diff)
downloadbinutils-gdb-6c0c5b1e5da52f6a3cb0fa3e1707fb9652459770.tar.gz
PR 423
* ldfile.c (ldfile_try_open_bfd): Ensure dynamic objects are rejected when linking statically.
Diffstat (limited to 'ld/ldfile.c')
-rw-r--r--ld/ldfile.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/ld/ldfile.c b/ld/ldfile.c
index e7a7d8cec05..25d53e0358b 100644
--- a/ld/ldfile.c
+++ b/ld/ldfile.c
@@ -151,9 +151,10 @@ ldfile_try_open_bfd (const char *attempt,
/* If we are searching for this file, see if the architecture is
compatible with the output file. If it isn't, keep searching.
If we can't open the file as an object file, stop the search
- here. */
+ here. If we are statically linking, ensure that we don't link
+ a dynamic object. */
- if (entry->search_dirs_flag)
+ if (entry->search_dirs_flag || !entry->dynamic)
{
bfd *check;
@@ -167,6 +168,7 @@ ldfile_try_open_bfd (const char *attempt,
if (! bfd_check_format (check, bfd_object))
{
if (check == entry->the_bfd
+ && entry->search_dirs_flag
&& bfd_get_error () == bfd_error_file_not_recognized
&& ! ldemul_unrecognized_file (entry))
{
@@ -260,8 +262,18 @@ ldfile_try_open_bfd (const char *attempt,
return TRUE;
}
- if ((bfd_arch_get_compatible (check, output_bfd,
- command_line.accept_unknown_input_arch) == NULL)
+ if (!entry->dynamic && (entry->the_bfd->flags & DYNAMIC) != 0)
+ {
+ einfo (_("%F%P: attempted static link of dynamic object `%s'\n"),
+ attempt);
+ bfd_close (entry->the_bfd);
+ entry->the_bfd = NULL;
+ return FALSE;
+ }
+
+ if (entry->search_dirs_flag
+ && !bfd_arch_get_compatible (check, output_bfd,
+ command_line.accept_unknown_input_arch)
/* XCOFF archives can have 32 and 64 bit objects. */
&& ! (bfd_get_flavour (check) == bfd_target_xcoff_flavour
&& bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour