RISC-V: Fix linker crash in section symbol check.
authorJim Wilson <jimw@sifive.com>
Thu, 21 Mar 2019 22:08:48 +0000 (15:08 -0700)
committerJim Wilson <jimw@sifive.com>
Thu, 21 Mar 2019 22:16:19 +0000 (15:16 -0700)
sym is only set for local symbols.  h is only set for global symbols.  Gas
won't let me create a global section symbol, but bfd appears to have some
support for that, and I can't rule out that other assemblers might do this.
So we need to support both, and verify sym and h are non-NULL before using.

bfd/
PR 24365
* elfnn-riscv.c (riscv_elf_relocate_section): For STT_SECTION check,
verify sym non-NULL before using.  Add identical check using h.

bfd/ChangeLog
bfd/elfnn-riscv.c

index 31ffadf24f5525f5cf22429f731908aea7e8c5d0..1225e3cad8fef2ddd7d9e5bf4adf6cb37c59bf9c 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-21  Jim Wilson  <jimw@sifive.com>
+
+       PR 24365
+       * elfnn-riscv.c (riscv_elf_relocate_section): For STT_SECTION check,
+       verify sym non-NULL before using.  Add identical check using h.
+
 2019-03-21  Sudakshina Das  <sudi.das@arm.com>
 
        * elf-bfd.h (struct elf_backend_data): Add argument to
index 0a0ceb793068d0cc82747689e6b0b7f949045ee4..bb114e59c762e3550a7ff5403c775c14ed4cef1c 100644 (file)
@@ -2059,7 +2059,9 @@ riscv_elf_relocate_section (bfd *output_bfd,
             all relocs to update these addends.  This is also ambiguous, as
             we do allow offsets to be added to the target address, which are
             not to be used to find the auipc address.  */
-         if ((ELF_ST_TYPE (sym->st_info) == STT_SECTION) && rel->r_addend)
+         if (((sym != NULL && (ELF_ST_TYPE (sym->st_info) == STT_SECTION))
+              || (h != NULL && h->type == STT_SECTION))
+             && rel->r_addend)
            {
              r = bfd_reloc_dangerous;
              break;