From 4467df35a93e4c8e5ff7549e8d23324c64f527bd Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 5 May 2021 20:28:39 -0700 Subject: [PATCH] elf: Always append ".COUNT" to local symbols Always append ".COUNT" to local symbols to avoid potential conflicts with existing local symbol "XXX.COUNT". bfd/ PR ld/27825 * elflink.c (elf_link_output_symstrtab): Always append ".COUNT" to local symbols. ld/ PR ld/27825 * testsuite/ld-elf/pr27825-1.d: New file. * testsuite/ld-elf/pr27825-1a.s: Likewise. * testsuite/ld-elf/pr27825-1b.s: Likewise. * testsuite/ld-elf/pr27825-2.d: Likewise. * testsuite/ld-elf/pr27825-2a.s: Likewise. * testsuite/ld-elf/pr27825-2b.s: Likewise. --- bfd/ChangeLog | 6 +++++ bfd/elflink.c | 39 ++++++++++++++++---------------- ld/ChangeLog | 10 ++++++++ ld/testsuite/ld-elf/pr26391.nd | 2 +- ld/testsuite/ld-elf/pr27825-1.d | 21 +++++++++++++++++ ld/testsuite/ld-elf/pr27825-1a.s | 7 ++++++ ld/testsuite/ld-elf/pr27825-1b.s | 5 ++++ ld/testsuite/ld-elf/pr27825-2.d | 18 +++++++++++++++ ld/testsuite/ld-elf/pr27825-2a.s | 5 ++++ ld/testsuite/ld-elf/pr27825-2b.s | 3 +++ ld/testsuite/ld-elf/pr27825-2c.s | 4 ++++ 11 files changed, 99 insertions(+), 21 deletions(-) create mode 100644 ld/testsuite/ld-elf/pr27825-1.d create mode 100644 ld/testsuite/ld-elf/pr27825-1a.s create mode 100644 ld/testsuite/ld-elf/pr27825-1b.s create mode 100644 ld/testsuite/ld-elf/pr27825-2.d create mode 100644 ld/testsuite/ld-elf/pr27825-2a.s create mode 100644 ld/testsuite/ld-elf/pr27825-2b.s create mode 100644 ld/testsuite/ld-elf/pr27825-2c.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c574570fbe9..e481c1b0a25 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2021-05-05 H.J. Lu + + PR ld/27825 + * elflink.c (elf_link_output_symstrtab): Always append ".COUNT" + to local symbols. + 2021-05-05 Alan Modra * vms-lib.c (vms_traverse_index): Account for vms_kbn size when diff --git a/bfd/elflink.c b/bfd/elflink.c index cb38a025349..0e1871aaac9 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -9830,6 +9830,9 @@ elf_link_output_symstrtab (void *finf, && ELF_ST_BIND (elfsym->st_info) == STB_LOCAL) { struct local_hash_entry *lh; + size_t count_len; + size_t base_len; + char buf[30]; switch (ELF_ST_TYPE (elfsym->st_info)) { case STT_FILE: @@ -9840,28 +9843,24 @@ elf_link_output_symstrtab (void *finf, (&flinfo->local_hash_table, name, true, false); if (lh == NULL) return 0; - if (lh->count) + /* Always append ".COUNT" to local symbols to avoid + potential conflicts with local symbol "XXX.COUNT". */ + sprintf (buf, "%lx", lh->count); + base_len = lh->size; + if (!base_len) { - /* Append ".COUNT" to duplicated local symbols. */ - size_t count_len; - size_t base_len = lh->size; - char buf[30]; - sprintf (buf, "%lx", lh->count); - if (!base_len) - { - base_len = strlen (name); - lh->size = base_len; - } - count_len = strlen (buf); - versioned_name = bfd_alloc (flinfo->output_bfd, - base_len + count_len + 2); - if (versioned_name == NULL) - return 0; - memcpy (versioned_name, name, base_len); - versioned_name[base_len] = '.'; - memcpy (versioned_name + base_len + 1, buf, - count_len + 1); + base_len = strlen (name); + lh->size = base_len; } + count_len = strlen (buf); + versioned_name = bfd_alloc (flinfo->output_bfd, + base_len + count_len + 2); + if (versioned_name == NULL) + return 0; + memcpy (versioned_name, name, base_len); + versioned_name[base_len] = '.'; + memcpy (versioned_name + base_len + 1, buf, + count_len + 1); lh->count++; break; } diff --git a/ld/ChangeLog b/ld/ChangeLog index 52629384aba..0c7c759b427 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2021-05-05 H.J. Lu + + PR ld/27825 + * testsuite/ld-elf/pr27825-1.d: New file. + * testsuite/ld-elf/pr27825-1a.s: Likewise. + * testsuite/ld-elf/pr27825-1b.s: Likewise. + * testsuite/ld-elf/pr27825-2.d: Likewise. + * testsuite/ld-elf/pr27825-2a.s: Likewise. + * testsuite/ld-elf/pr27825-2b.s: Likewise. + 2021-05-05 Alan Modra * testsuite/ld-powerpc/empty.s: New file. diff --git a/ld/testsuite/ld-elf/pr26391.nd b/ld/testsuite/ld-elf/pr26391.nd index d01f3381340..07bfd7fb5b5 100644 --- a/ld/testsuite/ld-elf/pr26391.nd +++ b/ld/testsuite/ld-elf/pr26391.nd @@ -1,5 +1,5 @@ #... -[0-9a-z]+ [td] _?bar +[0-9a-z]+ [td] _?bar.0 #... [0-9a-z]+ [td] _?bar.1 #... diff --git a/ld/testsuite/ld-elf/pr27825-1.d b/ld/testsuite/ld-elf/pr27825-1.d new file mode 100644 index 00000000000..c9b1b921f3d --- /dev/null +++ b/ld/testsuite/ld-elf/pr27825-1.d @@ -0,0 +1,21 @@ +#source: pr27825-1a.s +#source: pr27825-1b.s +#ld: -e _start --emit-relocs -z unique-symbol +#nm: --defined-only +#xfail: [is_generic] +#xfail: fr30-*-* frv-*-* ft32-*-* iq2000-*-* mn10200-*-* msp*-* mt-*-* +# These targets don't support -z. + +#... +[0-9a-f]+ t bar.0 +#... +[0-9a-f]+ t bar.1 +#... +[0-9a-f]+ t bar.1.0 +#... +[0-9a-f]+ t bar.1.1 +#... +[0-9a-f]+ t bar.2.0 +#... +[0-9a-f]+ t bar.2.1 +#pass diff --git a/ld/testsuite/ld-elf/pr27825-1a.s b/ld/testsuite/ld-elf/pr27825-1a.s new file mode 100644 index 00000000000..e6940e17430 --- /dev/null +++ b/ld/testsuite/ld-elf/pr27825-1a.s @@ -0,0 +1,7 @@ + .text + .globl _start +_start: +bar: +bar.1: +bar.2: + .nop diff --git a/ld/testsuite/ld-elf/pr27825-1b.s b/ld/testsuite/ld-elf/pr27825-1b.s new file mode 100644 index 00000000000..2128e802d4b --- /dev/null +++ b/ld/testsuite/ld-elf/pr27825-1b.s @@ -0,0 +1,5 @@ + .text +bar: +bar.1: +bar.2: + .nop diff --git a/ld/testsuite/ld-elf/pr27825-2.d b/ld/testsuite/ld-elf/pr27825-2.d new file mode 100644 index 00000000000..12a18636367 --- /dev/null +++ b/ld/testsuite/ld-elf/pr27825-2.d @@ -0,0 +1,18 @@ +#source: pr27825-2a.s +#source: pr27825-2b.s +#source: pr27825-2c.s +#ld: -e _start --emit-relocs -z unique-symbol +#nm: --defined-only +#xfail: [is_generic] +#xfail: fr30-*-* frv-*-* ft32-*-* iq2000-*-* mn10200-*-* msp*-* mt-*-* +# These targets don't support -z. + +#... +[0-9a-f]+ t bar.0 +#... +[0-9a-f]+ t bar.1 +#... +[0-9a-f]+ t bar.1.0 +#... +[0-9a-f]+ t bar.2.0 +#pass diff --git a/ld/testsuite/ld-elf/pr27825-2a.s b/ld/testsuite/ld-elf/pr27825-2a.s new file mode 100644 index 00000000000..40fc05bc537 --- /dev/null +++ b/ld/testsuite/ld-elf/pr27825-2a.s @@ -0,0 +1,5 @@ + .text + .globl _start +_start: +bar: + .nop diff --git a/ld/testsuite/ld-elf/pr27825-2b.s b/ld/testsuite/ld-elf/pr27825-2b.s new file mode 100644 index 00000000000..9e6f96a8bc7 --- /dev/null +++ b/ld/testsuite/ld-elf/pr27825-2b.s @@ -0,0 +1,3 @@ + .text +bar: + .nop diff --git a/ld/testsuite/ld-elf/pr27825-2c.s b/ld/testsuite/ld-elf/pr27825-2c.s new file mode 100644 index 00000000000..762f8864e5d --- /dev/null +++ b/ld/testsuite/ld-elf/pr27825-2c.s @@ -0,0 +1,4 @@ + .text +bar.1: +bar.2: + .nop -- 2.30.2