This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
cskyelf.em branch stub handling
- From: Alan Modra <amodra at gmail dot com>
- To: binutils at sourceware dot org
- Cc: Lifang Xia <lifang_xia at c-sky dot com>, Yunhai Shang <yunhai_shang at c-sky dot com>
- Date: Wed, 10 Apr 2019 13:38:43 +0930
- Subject: 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 now 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.
diff --git a/ld/emultempl/cskyelf.em b/ld/emultempl/cskyelf.em
index 690bb49222..3651bb244d 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
--
Alan Modra
Australia Development Lab, IBM