aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/plugin.c10
-rw-r--r--bfd/syms.c17
-rw-r--r--ld/ChangeLog13
-rw-r--r--ld/testsuite/ld-elf/init-fini-arrays.s17
-rw-r--r--ld/testsuite/ld-elf/pr14156a.d10
-rw-r--r--ld/testsuite/ld-elf/pr14156b.d10
-rw-r--r--ld/testsuite/ld-elf/pr24511.d18
-rw-r--r--ld/testsuite/ld-scripts/pr18963.t3
-rw-r--r--ld/testsuite/ld-scripts/sane1.t1
10 files changed, 88 insertions, 23 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 676f4ad..6f7f19a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,15 @@
+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
diff --git a/bfd/plugin.c b/bfd/plugin.c
index 8cb44ce..376e92c 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -530,13 +530,13 @@ bfd_plugin_canonicalize_symtab (bfd *abfd,
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));
diff --git a/bfd/syms.c b/bfd/syms.c
index fe7e7df..da1c90d 100644
--- a/bfd/syms.c
+++ b/bfd/syms.c
@@ -595,8 +595,9 @@ static const struct section_to_type stt[] =
/* 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)
@@ -604,8 +605,12 @@ 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 '?';
}
@@ -700,9 +705,9 @@ bfd_decode_symclass (asymbol *symbol)
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 '?';
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 40b90fb..722e656 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,16 @@
+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.
diff --git a/ld/testsuite/ld-elf/init-fini-arrays.s b/ld/testsuite/ld-elf/init-fini-arrays.s
index 6740ed6..b8adc29 100644
--- a/ld/testsuite/ld-elf/init-fini-arrays.s
+++ b/ld/testsuite/ld-elf/init-fini-arrays.s
@@ -1,7 +1,20 @@
.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
diff --git a/ld/testsuite/ld-elf/pr14156a.d b/ld/testsuite/ld-elf/pr14156a.d
index cf38ee1..535ac3e 100644
--- a/ld/testsuite/ld-elf/pr14156a.d
+++ b/ld/testsuite/ld-elf/pr14156a.d
@@ -7,10 +7,10 @@
#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
diff --git a/ld/testsuite/ld-elf/pr14156b.d b/ld/testsuite/ld-elf/pr14156b.d
index f965f74e..27da016 100644
--- a/ld/testsuite/ld-elf/pr14156b.d
+++ b/ld/testsuite/ld-elf/pr14156b.d
@@ -7,10 +7,10 @@
#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
diff --git a/ld/testsuite/ld-elf/pr24511.d b/ld/testsuite/ld-elf/pr24511.d
new file mode 100644
index 0000000..f77a43b
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr24511.d
@@ -0,0 +1,18 @@
+#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
diff --git a/ld/testsuite/ld-scripts/pr18963.t b/ld/testsuite/ld-scripts/pr18963.t
index b0cd742..830ded7 100644
--- a/ld/testsuite/ld-scripts/pr18963.t
+++ b/ld/testsuite/ld-scripts/pr18963.t
@@ -5,16 +5,19 @@ SECTIONS
.text :
{
_start = .;
+ *(.text)
. = 0x10000;
}
B = .;
.data :
{
+ *(.data)
. = 0x10000;
}
C = .;
.bss :
{
+ *(.bss)
. = 0x10000;
}
D = A - C + B;
diff --git a/ld/testsuite/ld-scripts/sane1.t b/ld/testsuite/ld-scripts/sane1.t
index 037a62c..90ee9b6 100644
--- a/ld/testsuite/ld-scripts/sane1.t
+++ b/ld/testsuite/ld-scripts/sane1.t
@@ -20,6 +20,7 @@ SECTIONS
s4 = ABSOLUTE (d1) - 2;
s5 = ABSOLUTE (d2) % 5;
s6 = ABSOLUTE (d2) / 5;
+ *(.data)
}
/DISCARD/ : {*(*)}