aboutsummaryrefslogtreecommitdiff
path: root/ld/emultempl
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-04-10 11:58:15 +0930
committerAlan Modra <amodra@gmail.com>2019-04-10 13:30:32 +0930
commit53b81c6de19a1f89e3c797631e72d05ba41444dc (patch)
treeb6bb3e21aa731f82ab8fc369ba3b278da27e1a0e /ld/emultempl
parentc55b17b8098abde4ae7dfe0ec1f3b22a7fb0a34d (diff)
downloadfsf-binutils-gdb-53b81c6de19a1f89e3c797631e72d05ba41444dc.zip
fsf-binutils-gdb-53b81c6de19a1f89e3c797631e72d05ba41444dc.tar.gz
fsf-binutils-gdb-53b81c6de19a1f89e3c797631e72d05ba41444dc.tar.bz2
cskyelf.em branch stub handling
This fixes the csky-elf ld-elf/pr21884 and ld-unique/pr21529 failures, by disabling branch stubs for binary (and other non-csky) output. The csky-linux target gets branch stubs off by default because presumably there are reasons why branch stubs were disabled, but rather than killing the support completely it can be enabled by --branch-stub. * emultempl/cskyelf.em (csk_elf_before_parse): New function, setting use_branch_stub false for linux. (csky_elf_create_output_section_statements): Do emit this function and all others in the file for linux, plus the branch option control. Disable branch stubs when non-ELF.
Diffstat (limited to 'ld/emultempl')
-rw-r--r--ld/emultempl/cskyelf.em31
1 files changed, 15 insertions, 16 deletions
diff --git a/ld/emultempl/cskyelf.em b/ld/emultempl/cskyelf.em
index 690bb49..3651bb2 100644
--- a/ld/emultempl/cskyelf.em
+++ b/ld/emultempl/cskyelf.em
@@ -116,25 +116,32 @@ EOF
case ${target} in
csky-*-linux-*)
fragment <<EOF
-/* This is a convenient point to tell BFD about target specific flags.
- After the output has been created, but before inputs are read. */
+
static void
-csky_elf_create_output_section_statements (void)
+csky_elf_before_parse (void)
{
use_branch_stub = FALSE;
+ gld${EMULATION_NAME}_before_parse ();
}
EOF
;;
- *)
+esac
+
fragment <<EOF
+
/* This is a convenient point to tell BFD about target specific flags.
After the output has been created, but before inputs are read. */
static void
csky_elf_create_output_section_statements (void)
{
+ if (!(bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
+ && elf_object_id (link_info.output_bfd) == CSKY_ELF_DATA))
+ use_branch_stub = FALSE;
+
/* If don't use branch stub, just do not emit stub_file. */
- if (use_branch_stub == FALSE)
+ if (!use_branch_stub)
return;
+
stub_file = lang_add_input_file ("linker stubs",
lang_input_file_is_fake_enum, NULL);
stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
@@ -150,11 +157,7 @@ csky_elf_create_output_section_statements (void)
stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
ldlang_add_file (stub_file);
}
-EOF
- ;;
-esac
-fragment <<EOF
/* Call-back for elf32_csky_size_stubs. */
/* Create a new stub section, and arrange for it to be linked
@@ -304,11 +307,6 @@ EOF
# This code gets inserted into the generic elf32.sc linker script
# and allows us to define our own command line switches.
-case ${target} in
- csky-*-linux-*)
- ;;
-
- *)
PARSE_AND_LIST_PROLOGUE='
#define OPTION_BRANCH_STUB 301
#define OPTION_NO_BRANCH_STUB 302
@@ -347,9 +345,10 @@ PARSE_AND_LIST_ARGS_CASES='
}
break;
'
- ;;
-esac
+case ${target} in
+ csky-*-linux-*) LDEMUL_BEFORE_PARSE=csky_elf_before_parse ;;
+esac
LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=csky_elf_create_output_section_statements
LDEMUL_FINISH=gld${EMULATION_NAME}_finish