TIC6X __c6xabi_DSBT_BASE
authorAlan Modra <amodra@gmail.com>
Sat, 2 Jun 2018 08:35:24 +0000 (18:05 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 6 Jun 2018 23:37:32 +0000 (09:07 +0930)
Adding an undefined __c6xabi_DSBT_BASE via an EXTERN in the linker
script isn't ideal, as the symbol is not always needed.  This patch
adds the undefined symbol on encountering relocations where it is
implicitly referenced.

bfd/
* elf32-tic6x.c (elf32_tic6x_check_relocs): Reference
__c6xabi_DSBT_BASE explicitly for R_C6000_SBR_* relocs.
ld/
* emulparams/elf32_tic6x_le.sh (EXECUTABLE_SYMBOLS): Don't define.

bfd/ChangeLog
bfd/elf32-tic6x.c
ld/ChangeLog
ld/emulparams/elf32_tic6x_le.sh

index 8b144916c2566061216f07adc2d2bbdd91fa06e8..c7e28b8cc7f0cac8a360908b8986e5e53f27a754 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-07  Alan Modra  <amodra@gmail.com>
+
+       * elf32-tic6x.c (elf32_tic6x_check_relocs): Reference
+       __c6xabi_DSBT_BASE explicitly for R_C6000_SBR_* relocs.
+
 2018-06-05  Alan Modra  <amodra@gmail.com>
 
        * bfd.c (struct bfd): Update comment on "where" usage.
index 96965b3992728a3e8284cbaa250388f778f74481..768bfb8ca935c3d4ef756b4356c4dc4cd3878d66 100644 (file)
@@ -2972,6 +2972,19 @@ elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info,
        case R_C6000_SBR_H16_B:
        case R_C6000_SBR_H16_H:
        case R_C6000_SBR_H16_W:
+         {
+           /* These relocations implicitly reference __c6xabi_DSBT_BASE.
+              Add an explicit reference so that the symbol will be
+              provided by a linker script.  */
+           struct bfd_link_hash_entry *bh = NULL;
+           if (!_bfd_generic_link_add_one_symbol (info, abfd,
+                                                  "__c6xabi_DSBT_BASE",
+                                                  BSF_GLOBAL,
+                                                  bfd_und_section_ptr, 0,
+                                                  NULL, FALSE, FALSE, &bh))
+             return FALSE;
+           ((struct elf_link_hash_entry *) bh)->non_elf = 0;
+         }
          if (h != NULL && bfd_link_executable (info))
            {
              /* For B14-relative addresses, we might need a copy
index e750941af1050c601400240ff2a4276346a65a21..f12b6bd27e828b8c1724ad009d7a1ea4be273b32 100644 (file)
@@ -1,3 +1,7 @@
+2018-06-07  Alan Modra  <amodra@gmail.com>
+
+       * emulparams/elf32_tic6x_le.sh (EXECUTABLE_SYMBOLS): Don't define.
+
 2018-06-06  Alan Modra  <amodra@gmail.com>
 
        * Makefile.am (earmelf_fbsd.c): Correct dependencies.
index efd7b246026525f6d11ce45f86b77b34cb08d7a5..d9ebe584a341ff2df8ea32fba9e1f2efbd789af3 100644 (file)
@@ -22,7 +22,6 @@ case ${target} in
 esac
 MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=tic6x
-EXECUTABLE_SYMBOLS="EXTERN (__c6xabi_DSBT_BASE);"
 OTHER_GOT_SYMBOLS="PROVIDE_HIDDEN (__c6xabi_DSBT_BASE = .);"
 # ".bss" is near (small) BSS, ".far" is far (normal) BSS, ".const" is
 # far read-only data, ".rodata" is near read-only data.  ".neardata"