diff options
-rw-r--r-- | bfd/ChangeLog | 12 | ||||
-rw-r--r-- | bfd/plugin.c | 10 | ||||
-rw-r--r-- | bfd/syms.c | 17 | ||||
-rw-r--r-- | ld/ChangeLog | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/init-fini-arrays.s | 17 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr14156a.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr14156b.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr24511.d | 18 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/pr18963.t | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/sane1.t | 1 |
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)); @@ -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/ : {*(*)} |