/* ELF emulation code for targets using elf.em.
- Copyright (C) 1991-2019 Free Software Foundation, Inc.
+ Copyright (C) 1991-2020 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
#include "bfd.h"
#include "libiberty.h"
#include "filenames.h"
+#include "safe-ctype.h"
+#include "bfdlink.h"
+#include "ctf-api.h"
#include "ld.h"
#include "ldmain.h"
#include "ldmisc.h"
static bfd_boolean
ldelf_check_ld_so_conf (const struct bfd_link_needed_list *l, int force,
- int elfsize)
+ int elfsize, const char *prefix)
{
static bfd_boolean initialized;
static const char *ld_so_conf;
info.path = NULL;
info.len = info.alloc = 0;
- tmppath = concat (ld_sysroot, "${prefix}/etc/ld.so.conf",
+ tmppath = concat (ld_sysroot, prefix, "/etc/ld.so.conf",
(const char *) NULL);
if (!ldelf_parse_ld_so_conf (&info, tmppath))
{
void
ldelf_after_open (int use_libpath, int native, int is_linux, int is_freebsd,
- int elfsize)
+ int elfsize, const char *prefix)
{
struct bfd_link_needed_list *needed, *l;
struct elf_link_hash_table *htab;
abfd != (bfd *) NULL; abfd = abfd->link.next)
if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
&& bfd_count_sections (abfd) != 0
- && !((lang_input_statement_type *) abfd->usrdata)->flags.just_syms)
+ && !bfd_input_just_syms (abfd))
break;
/* PR 10555: If there are no ELF input files do not try to
{
int type = 0;
- if (((lang_input_statement_type *) abfd->usrdata)->flags.just_syms)
+ if (bfd_input_just_syms (abfd))
continue;
for (s = abfd->sections; s && type < COMPACT_EH_HDR; s = s->next)
{
- const char *name = bfd_get_section_name (abfd, s);
+ const char *name = bfd_section_name (s);
if (bfd_is_abs_section (s->output_section))
continue;
bed->dynamic_sec_flags
| SEC_READONLY);
if (s != NULL
- && bfd_set_section_alignment (elfbfd, s, 2))
+ && bfd_set_section_alignment (s, 2))
{
htab->eh_info.hdr_sec = s;
warn_eh_frame = FALSE;
break;
if (is_linux
- && ldelf_check_ld_so_conf (l, force, elfsize))
+ && ldelf_check_ld_so_conf (l, force, elfsize, prefix))
break;
}
flags = (SEC_ALLOC | SEC_LOAD | SEC_IN_MEMORY
| SEC_LINKER_CREATED | SEC_READONLY | SEC_DATA);
s = bfd_make_section_with_flags (ibfd, ".note.gnu.build-id", flags);
- if (s != NULL && bfd_set_section_alignment (ibfd, s, 2))
+ if (s != NULL && bfd_set_section_alignment (s, 2))
{
struct elf_obj_tdata *t = elf_tdata (link_info.output_bfd);
t->o->build_id.after_write_object_contents = &write_build_id;
lang_output_section_statement_type *last_rel = NULL;
lang_output_section_statement_type *last_rel_alloc = NULL;
- for (lookup = &lang_os_list.head->output_section_statement;
+ for (lookup = (void *) lang_os_list.head;
lookup != NULL;
lookup = lookup->next)
{
{
/* Find the output mbind section with the same type, attributes
and sh_info field. */
- for (os = &lang_os_list.head->output_section_statement;
+ for (os = (void *) lang_os_list.head;
os != NULL;
os = os->next)
if (os->bfd_section != NULL
&& (nexts->flags & SEC_EXCLUDE) == 0
&& ((nexts->flags ^ flags) & (SEC_LOAD | SEC_ALLOC)) == 0
&& (nexts->owner->flags & DYNAMIC) == 0
- && nexts->owner->usrdata != NULL
- && !(((lang_input_statement_type *) nexts->owner->usrdata)
- ->flags.just_syms)
+ && !bfd_input_just_syms (nexts->owner)
&& _bfd_elf_match_sections_by_type (nexts->owner, nexts,
s->owner, s))
flags = (((flags ^ SEC_READONLY)
_bfd_elf_match_sections_by_type);
if (after == NULL)
/* *ABS* is always the first output section statement. */
- after = &lang_os_list.head->output_section_statement;
+ after = (void *) lang_os_list.head;
}
return lang_insert_orphan (s, secname, constraint, after, place, NULL, NULL);
}
+
+void
+ldelf_before_place_orphans (void)
+{
+ bfd *abfd;
+
+ for (abfd = link_info.input_bfds;
+ abfd != (bfd *) NULL; abfd = abfd->link.next)
+ if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
+ && bfd_count_sections (abfd) != 0
+ && !bfd_input_just_syms (abfd))
+ {
+ asection *isec;
+ for (isec = abfd->sections; isec != NULL; isec = isec->next)
+ {
+ /* Discard a section if any of its linked-to section has
+ been discarded. */
+ asection *linked_to_sec;
+ for (linked_to_sec = elf_linked_to_section (isec);
+ linked_to_sec != NULL;
+ linked_to_sec = elf_linked_to_section (linked_to_sec))
+ if (discarded_section (linked_to_sec))
+ {
+ isec->output_section = bfd_abs_section_ptr;
+ break;
+ }
+ }
+ }
+}