# This shell script emits a C file. -*- C -*-
-# Copyright 2011 Free Software Foundation, Inc.
+# Copyright (C) 2011-2018 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
static int
is_tic6x_target (void)
{
- extern const bfd_target bfd_elf32_tic6x_le_vec;
- extern const bfd_target bfd_elf32_tic6x_be_vec;
-
- return (link_info.output_bfd->xvec == &bfd_elf32_tic6x_le_vec
- || link_info.output_bfd->xvec == &bfd_elf32_tic6x_be_vec);
+ extern const bfd_target tic6x_elf32_le_vec;
+ extern const bfd_target tic6x_elf32_be_vec;
+ extern const bfd_target tic6x_elf32_linux_le_vec;
+ extern const bfd_target tic6x_elf32_linux_be_vec;
+ extern const bfd_target tic6x_elf32_c6000_le_vec;
+ extern const bfd_target tic6x_elf32_c6000_be_vec;
+
+ return (link_info.output_bfd->xvec == &tic6x_elf32_le_vec
+ || link_info.output_bfd->xvec == &tic6x_elf32_be_vec
+ || link_info.output_bfd->xvec == &tic6x_elf32_linux_le_vec
+ || link_info.output_bfd->xvec == &tic6x_elf32_linux_be_vec
+ || link_info.output_bfd->xvec == &tic6x_elf32_c6000_le_vec
+ || link_info.output_bfd->xvec == &tic6x_elf32_c6000_be_vec);
}
/* Pass params to backend. */
{
if (params.dsbt_index >= params.dsbt_size)
{
- einfo (_("%P%F: invalid --dsbt-index %d, outside DSBT size.\n"),
+ einfo (_("%F%P: invalid --dsbt-index %d, outside DSBT size\n"),
params.dsbt_index);
}
elf32_tic6x_setup (&link_info, ¶ms);
asection *asec = *(asection **) a, *bsec = *(asection **) b;
asection *aout = asec->output_section, *bout = bsec->output_section;
bfd_vma avma, bvma;
-
+
/* If there's no output section for some reason, compare equal. */
if (!aout || !bout)
return 0;
-
+
avma = aout->vma + asec->output_offset;
bvma = bout->vma + bsec->output_offset;
-
+
if (avma > bvma)
return 1;
else if (avma < bvma)
return -1;
-
+
return 0;
}
gld${EMULATION_NAME}_after_allocation (void)
{
int layout_changed = 0;
+ int ret;
- if (!link_info.relocatable)
+ if (!bfd_link_relocatable (&link_info))
{
/* Build a sorted list of input text sections, then use that to process
the unwind table index. */
unsigned int list_size = 10;
asection **sec_list = (asection **)
- xmalloc (list_size * sizeof (asection *));
+ xmalloc (list_size * sizeof (asection *));
unsigned int sec_count = 0;
LANG_FOR_EACH_INPUT_STATEMENT (is)
{
bfd *abfd = is->the_bfd;
asection *sec;
-
+
if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
continue;
-
+
for (sec = abfd->sections; sec != NULL; sec = sec->next)
{
asection *out_sec = sec->output_section;
&& elf_section_type (sec) == SHT_PROGBITS
&& (elf_section_flags (sec) & SHF_EXECINSTR) != 0
&& (sec->flags & SEC_EXCLUDE) == 0
- && sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS
+ && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
&& out_sec != bfd_abs_section_ptr)
{
if (sec_count == list_size)
{
list_size *= 2;
- sec_list = (asection **)
- xrealloc (sec_list, list_size * sizeof (asection *));
+ sec_list = (asection **)
+ xrealloc (sec_list, list_size * sizeof (asection *));
}
sec_list[sec_count++] = sec;
}
}
}
-
+
qsort (sec_list, sec_count, sizeof (asection *), &compare_output_sec_vma);
-
+
if (elf32_tic6x_fix_exidx_coverage (sec_list, sec_count, &link_info,
merge_exidx_entries))
layout_changed = 1;
-
+
free (sec_list);
}
/* bfd_elf32_discard_info just plays with debugging sections,
ie. doesn't affect any code, so we can delay resizing the
sections. */
- if (bfd_elf_discard_info (link_info.output_bfd, & link_info))
+ ret = bfd_elf_discard_info (link_info.output_bfd, & link_info);
+ if (ret < 0)
+ {
+ einfo (_("%X%P: .eh_frame/.stab edit: %E\n"));
+ return;
+ }
+ else if (ret > 0)
layout_changed = 1;
gld${EMULATION_NAME}_map_segments (layout_changed);
'
PARSE_AND_LIST_OPTIONS='
- fprintf (file, _(" --dsbt-index <index>\n"));
- fprintf (file, _("\t\t\tUse this as the DSBT index for the output object\n"));
- fprintf (file, _(" --dsbt-size <index>\n"));
- fprintf (file, _("\t\t\tUse this as the number of entries in the DSBT table\n"));
- fprintf (file, _(" --no-merge-exidx-entries Disable merging exidx entries\n"));
+ fprintf (file, _(" --dsbt-index <index> Use this as the DSBT index for the output object\n"));
+ fprintf (file, _(" --dsbt-size <index> Use this as the number of entries in the DSBT table\n"));
+ fprintf (file, _(" --no-merge-exidx-entries\n"));
+ fprintf (file, _(" Disable merging exidx entries\n"));
'
PARSE_AND_LIST_ARGS_CASES='
if (*end == 0
&& params.dsbt_index >= 0 && params.dsbt_index < 0x7fff)
break;
- einfo (_("%P%F: invalid --dsbt-index %s\n"), optarg);
+ einfo (_("%F%P: invalid --dsbt-index %s\n"), optarg);
}
break;
case OPTION_DSBT_SIZE:
if (*end == 0
&& params.dsbt_size >= 0 && params.dsbt_size < 0x7fff)
break;
- einfo (_("%P%F: invalid --dsbt-size %s\n"), optarg);
+ einfo (_("%F%P: invalid --dsbt-size %s\n"), optarg);
}
break;
case OPTION_NO_MERGE_EXIDX_ENTRIES: