+2019-05-04  Alan Modra  <amodra@gmail.com>
+
+       PR 24511
+       * syms.c (coff_section_type): Only allow '.', '$' and numeric
+       following the standard section names.
+       (bfd_decode_symclass): Prioritize section flag tests in
+       decode_section_type before name tests in coff_section_type.
+       * plugin.c (bfd_plugin_canonicalize_symtab): Init fake_section
+       and fake_common_section using BFD_FAKE_SECTION.  Use "fake" as
+       their names and choose standard .text section flags for
+       fake_section.
+
 2019-05-02  Nick Clifton  <nickc@redhat.com>
 
        PR 24493
 
   struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
   long nsyms = plugin_data->nsyms;
   const struct ld_plugin_symbol *syms = plugin_data->syms;
-  static asection fake_section;
-  static asection fake_common_section;
+  static asection fake_section
+    = BFD_FAKE_SECTION (fake_section, NULL, "plug", 0,
+                       SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS);
+  static asection fake_common_section
+    = BFD_FAKE_SECTION (fake_common_section, NULL, "plug", 0, SEC_IS_COMMON);
   int i;
 
-  fake_section.name = ".text";
-  fake_common_section.flags = SEC_IS_COMMON;
-
   for (i = 0; i < nsyms; i++)
     {
       asymbol *s = bfd_alloc (abfd, sizeof (asymbol));
 
 /* Return the single-character symbol type corresponding to
    section S, or '?' for an unknown COFF section.
 
-   Check for any leading string which matches, so .text5 returns
-   't' as well as .text */
+   Check for leading strings which match, followed by a number, '.',
+   or '$' so .text5 matches the .text entry, but .init_array doesn't
+   match the .init entry.  */
 
 static char
 coff_section_type (const char *s)
   const struct section_to_type *t;
 
   for (t = &stt[0]; t->section; t++)
-    if (!strncmp (s, t->section, strlen (t->section)))
-      return t->type;
+    {
+      size_t len = strlen (t->section);
+      if (strncmp (s, t->section, len) == 0
+         && memchr (".$0123456789", s[len], 13) != 0)
+       return t->type;
+    }
 
   return '?';
 }
     c = 'a';
   else if (symbol->section)
     {
-      c = coff_section_type (symbol->section->name);
+      c = decode_section_type (symbol->section);
       if (c == '?')
-       c = decode_section_type (symbol->section);
+       c = coff_section_type (symbol->section->name);
     }
   else
     return '?';
 
+2019-05-04  Alan Modra  <amodra@gmail.com>
+
+       PR 24511
+       * testsuite/ld-elf/pr14156a.d: Allow for .init/.fini being a
+       data section on hppa64.
+       * testsuite/ld-elf/pr14156b.d: Likewise.
+       * testsuite/ld-scripts/pr18963.t: Map standard sections to set
+       output section flags.
+       * testsuite/ld-scripts/sane1.t: Likewise.
+       * testsuite/ld-elf/init-fini-arrays.s: Reference __init_array_start
+       and __fini_array_start.  Define __start et al.
+       * testsuite/ld-elf/pr24511.d: New test.
+
 2019-04-30  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-powerpc/elfv2exe.d: Update.
 
  .section .init_array.01000,"aw",%init_array
  .p2align 2
- .word 0
+ .weak __init_array_start, ___init_array_start
+ .dc.a __init_array_start
+ .dc.a ___init_array_start
 
  .section .fini_array.01000,"aw",%fini_array
  .p2align 2
- .word 0
+ .weak __fini_array_start, ___fini_array_start
+ .dc.a __fini_array_start
+ .dc.a ___fini_array_start
+
+ .text
+ .globl main, _main, start, _start, __start
+main:
+_main:
+start:
+_start:
+__start:
+ .dc.a 0
 
 #nm: -n
 
 #...
-[0-9a-f]+ T foo
-[0-9a-f]+ t foo1
+[0-9a-f]+ [TD] foo
+[0-9a-f]+ [td] foo1
 #...
-[0-9a-f]+ t foo2
-[0-9a-f]+ t foo3
-[0-9a-f]+ t last
+[0-9a-f]+ [td] foo2
+[0-9a-f]+ [td] foo3
+[0-9a-f]+ [td] last
 #pass
 
 #nm: -n
 
 #...
-[0-9a-f]+ T foo
-[0-9a-f]+ t foo1
+[0-9a-f]+ [TD] foo
+[0-9a-f]+ [td] foo1
 #...
-[0-9a-f]+ t foo2
-[0-9a-f]+ t foo3
-[0-9a-f]+ t last
+[0-9a-f]+ [td] foo2
+[0-9a-f]+ [td] foo3
+[0-9a-f]+ [td] last
 #pass
 
--- /dev/null
+#source: init-fini-arrays.s
+#ld:
+#nm: -n
+# Most targets with their own scripts don't support init/fini_array and
+# thus don't define __init/fini_array_start.
+#xfail: avr-*-* cr16-*-* crx-*-* d10v-*-* d30v-*-* dlx-*-* ft32-*-* iq2000-*-*
+#xfail: m68hc1*-*-* mep-*-* microblaze*-*-elf* s12z-*-* v850-*-* visium-*-*
+#xfail: xgate-*-* xstormy*-*-*
+# Some targets with their own scripts haven't kept up with elf.sc and
+# PROVIDE __init_array_start rather than using PROVIDE_HIDDEN.  These
+# result in D symbols.  rx-elf makes .init/fini_array SHF_EXECINSTR so
+# gets t symbols.
+
+#...
+[0-9a-f]+ [dDt] _?__init_array_start
+#...
+[0-9a-f]+ [dDt] _?__fini_array_start
+#pass
 
   .text :
   {
     _start = .;
+    *(.text)
     . = 0x10000;
   }
   B = .;
   .data :
   {
+    *(.data)
     . = 0x10000;
   }
   C = .;
   .bss :
   {
+    *(.bss)
     . = 0x10000;
   }
   D = A - C + B;
 
     s4 = ABSOLUTE (d1) - 2;
     s5 = ABSOLUTE (d2) % 5;
     s6 = ABSOLUTE (d2) / 5;
+    *(.data)
   }
   /DISCARD/ : {*(*)}