PR24511, nm should not mark symbols in .init_array as "t"

This patch restricts the section names matched in coff_section_type,
a function that translates section names to symbol type, and arranges
to translate section flags to symbol type before looking at names.
The latter change resulted in various test failures due to improper
section flags being used in tests, and by the plugin support, so fix
that too.

The new test fails on many ELF targets that lack .init/fini_array
in their scripts.  I've just xfailed those.  pru-elf oddly defines
__init_array_begin rather than __init_array_start.  I've left that
target as a FAIL, and pj-elf too which reports an error for undefined
weak symbols.

bfd/
	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.
ld/
	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.
This commit is contained in:
Alan Modra 2019-05-03 21:36:46 +09:30
parent 66452beb77
commit a288c27099
10 changed files with 88 additions and 23 deletions

View File

@ -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

View File

@ -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));

View File

@ -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 '?';

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -5,16 +5,19 @@ SECTIONS
.text :
{
_start = .;
*(.text)
. = 0x10000;
}
B = .;
.data :
{
*(.data)
. = 0x10000;
}
C = .;
.bss :
{
*(.bss)
. = 0x10000;
}
D = A - C + B;

View File

@ -20,6 +20,7 @@ SECTIONS
s4 = ABSOLUTE (d1) - 2;
s5 = ABSOLUTE (d2) % 5;
s6 = ABSOLUTE (d2) / 5;
*(.data)
}
/DISCARD/ : {*(*)}