elflink.c: dynobj
Alan Modra <[email protected]>
| Newsgroups | gmane.comp.gnu.binutils |
|---|---|
| Message-ID | <[email protected]> |
This patch makes _bfd_elf_link_dynobj accept input objects that are
dynamic or plugins for use as dynobj. Contrary to the comment about
clashes with "a dynamic object with its own dynamic sections", there
are in fact no sections to clash with as elf_link_add_object_symbols
removes all sections from dynamic objects. I also don't see why
BFD_PLUGIN objects cannot hold dynamic sections. In fact, for
x86_64-linux there are 40 testcases in the testsuite that choose
either a plugin or a dynamic library via the line I flagged with
"??? Accept abfd anyway..".
Besides changing the set of acceptable objects for dynobj, this patch
also drops the abfd arg which was usually the bfd chosen for dynobj.
Mostly the abfd arg had been checked that it had the correct xvec,
but then there was vxworks.em which blindly assumed to first bfd was
good. Since the only reason bfd_elf_link_create_dynamic_sections has
as abfd arg is to pass it to _bfd_elf_link_dynobj, drop that arg too.
bfd/
* elf-bfd.h (bfd_elf_link_create_dynamic_sections): Update prototype.
* elflink.c (_bfd_elf_link_dynobj): Allow plugin and dynamic
objects as dynobj. Warn if no suitable object is found.
(bfd_elf_link_create_dynamic_sections): Remove now unused
"abfd" parameter. Update all calles.
* elf32-arc.c (elf_arc_check_relocs): Update call to
bfd_elf_link_create_dynamic_sections.
* elf32-tic6x.c (elf32_tic6x_check_relocs): Likewise.
* elf64-hppa.c (elf64_hppa_check_relocs): Likewise.
ld/
* emultempl/vxworks.em (vxworks_after_open): Update call to
bfd_elf_link_create_dynamic_sections.
---
bfd/elf-bfd.h | 2 +-
bfd/elf32-arc.c | 2 +-
bfd/elf32-tic6x.c | 2 +-
bfd/elf64-hppa.c | 2 +-
bfd/elflink.c | 56 ++++++++++++++++++-----------------------
ld/emultempl/vxworks.em | 3 +--
6 files changed, 30 insertions(+), 37 deletions(-)
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 88d35925987..f7886a57aa8 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2732,7 +2732,7 @@ extern struct bfd_section *bfd_elf_tls_setup
(struct bfd_link_info *);
extern bool bfd_elf_link_create_dynamic_sections
- (bfd *, struct bfd_link_info *);
+ (struct bfd_link_info *);
extern bool _bfd_elf_omit_section_dynsym_default
(struct bfd_link_info *, asection *) ATTRIBUTE_HIDDEN;
extern bool _bfd_elf_omit_section_dynsym_all
diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c
index 52037e06508..19011c416af 100644
--- a/bfd/elf32-arc.c
+++ b/bfd/elf32-arc.c
@@ -2074,7 +2074,7 @@ elf_arc_check_relocs (bfd * abfd,
{
if (info->dynamic
&& ! htab->dynamic_sections_created
- && ! bfd_elf_link_create_dynamic_sections (abfd, info))
+ && ! bfd_elf_link_create_dynamic_sections (info))
return false;
sreloc = _bfd_elf_make_dynamic_reloc_section (sec, dynobj,
2, abfd,
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
index a74e8235f32..e8223312b3d 100644
--- a/bfd/elf32-tic6x.c
+++ b/bfd/elf32-tic6x.c
@@ -2693,7 +2693,7 @@ elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info,
if ((bfd_link_pic (info) || elf32_tic6x_using_dsbt (abfd))
&& ! htab->elf.dynamic_sections_created)
{
- if (! bfd_elf_link_create_dynamic_sections (abfd, info))
+ if (!bfd_elf_link_create_dynamic_sections (info))
return false;
}
diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c
index 7ce9a3bdf2e..230ed4997ec 100644
--- a/bfd/elf64-hppa.c
+++ b/bfd/elf64-hppa.c
@@ -505,7 +505,7 @@ elf64_hppa_check_relocs (bfd *abfd,
the special sections required for dynamic linking. */
if (! elf_hash_table (info)->dynamic_sections_created)
{
- if (! bfd_elf_link_create_dynamic_sections (abfd, info))
+ if (! bfd_elf_link_create_dynamic_sections (info))
return false;
}
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 5a3ee89142b..ecbb4d3b42e 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -303,34 +303,29 @@ compatible_format (struct bfd_link_info *info, bfd *ibfd)
/* Find a suitable object for attaching dynamic sections. */
static bfd *
-_bfd_elf_link_dynobj (bfd *abfd, struct bfd_link_info *info)
+_bfd_elf_link_dynobj (struct bfd_link_info *info)
{
- struct elf_link_hash_table *hash_table;
+ struct elf_link_hash_table *htab = elf_hash_table (info);
- hash_table = elf_hash_table (info);
- if (hash_table->dynobj == NULL)
+ if (htab->dynobj == NULL)
{
- /* We may not set dynobj, an input file holding linker created
- dynamic sections to abfd, which may be a dynamic object with
- its own dynamic sections. We need to find a normal input file
- to hold linker created sections if possible. */
- if ((abfd->flags & (DYNAMIC | BFD_PLUGIN)) != 0)
- {
- bfd *ibfd;
- for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
- if ((ibfd->flags
- & (DYNAMIC | BFD_LINKER_CREATED | BFD_PLUGIN)) == 0
- && compatible_format (info, ibfd))
- {
- abfd = ibfd;
- break;
- }
- }
- /* ??? Accept abfd anyway, if the loop doesn't find anything? */
- hash_table->dynobj = abfd;
+ /* We need to find an input file of the same format as the
+ output to hold linker created sections. For now, exclude
+ any stub bfd. */
+ bfd *ibfd = info->input_bfds;
+ if ((ibfd->flags
+ & (BFD_PLUGIN | BFD_LINKER_CREATED)) == BFD_LINKER_CREATED)
+ ibfd = ibfd->link.next;
+ for (; ibfd; ibfd = ibfd->link.next)
+ if (compatible_format (info, ibfd))
+ break;
+ if (ibfd == NULL)
+ _bfd_error_handler (_("no %s input object found"),
+ bfd_get_target (info->output_bfd));
+ htab->dynobj = ibfd;
}
- return hash_table->dynobj;
+ return htab->dynobj;
}
/* Return the strtab for dynamic symbol names. Create it if
@@ -347,14 +342,13 @@ _bfd_elf_link_dynstr (struct bfd_link_info *info)
}
/* Create some sections which will be filled in with dynamic linking
- information. ABFD is an input file which requires dynamic sections
- to be created. The dynamic sections take up virtual memory space
+ information. The dynamic sections take up virtual memory space
when the final executable is run, so we need to create them before
addresses are assigned to the output sections. We work out the
actual contents and size of these sections later. */
bool
-bfd_elf_link_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
+bfd_elf_link_create_dynamic_sections (struct bfd_link_info *info)
{
flagword flags;
asection *s;
@@ -371,7 +365,7 @@ bfd_elf_link_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
if (!_bfd_elf_link_dynstr (info))
return false;
- dynobj = _bfd_elf_link_dynobj (abfd, info);
+ dynobj = _bfd_elf_link_dynobj (info);
if (dynobj == NULL)
return false;
obed = get_elf_backend_data (dynobj);
@@ -3969,7 +3963,7 @@ bfd_elf_add_dt_needed_tag (bfd *abfd, struct bfd_link_info *info)
if (strindex == (size_t) -1)
return -1;
- if (!bfd_elf_link_create_dynamic_sections (abfd, info))
+ if (!bfd_elf_link_create_dynamic_sections (info))
return -1;
if (_bfd_elf_strtab_refcount (dynstr, strindex) != 1)
@@ -4601,7 +4595,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
&& info->output_bfd->xvec == abfd->xvec
&& !htab->dynamic_sections_created)
{
- if (!bfd_elf_link_create_dynamic_sections (abfd, info))
+ if (!bfd_elf_link_create_dynamic_sections (info))
goto error_return;
}
}
@@ -4822,7 +4816,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
/* Create dynamic sections for backends that require that be done
before setup_gnu_properties. */
if (add_needed
- && !bfd_elf_link_create_dynamic_sections (abfd, info))
+ && !bfd_elf_link_create_dynamic_sections (info))
return false;
/* Save the DT_AUDIT entry for the linker emulation code. */
@@ -5760,7 +5754,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
/* Create dynamic sections for backends that require
that be done before setup_gnu_properties. */
- if (!bfd_elf_link_create_dynamic_sections (abfd, info))
+ if (!bfd_elf_link_create_dynamic_sections (info))
goto error_free_vers;
add_needed = true;
}
diff --git a/ld/emultempl/vxworks.em b/ld/emultempl/vxworks.em
index 80d32d31cb7..8c6c1330054 100644
--- a/ld/emultempl/vxworks.em
+++ b/ld/emultempl/vxworks.em
@@ -42,8 +42,7 @@ vxworks_after_open (void)
if (force_dynamic
&& link_info.input_bfds
&& bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
- && !bfd_elf_link_create_dynamic_sections (link_info.input_bfds,
- &link_info))
+ && !bfd_elf_link_create_dynamic_sections (&link_info))
einfo (_("%X%P: cannot create dynamic sections %E\n"));
if (!force_dynamic