[PATCH v2] elf: Avoid possible duplicated local symbol names

H.J. Lu hjl.tools@gmail.com
Wed May 5 20:50:10 GMT 2021


On Wed, May 5, 2021 at 11:31 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Wed, May 5, 2021 at 8:48 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > When appending ".COUNT" to duplicated local symbol names of "XXX",
> > increment COUNT if there is an existing local symbol name of "XXX.COUNT".
> >
> > bfd/
> >
> >         PR ld/27825
> >         * elflink.c (elf_link_output_symstrtab): Avoid conflicts with
> >         local symbol names of "XXX.COUNT".
> >
> > ld/
> >
> >         PR ld/27825
> >         * testsuite/ld-elf/pr27825.d: New file.
> >         * testsuite/ld-elf/pr27825a.s: Likewise.
> >         * testsuite/ld-elf/pr27825b.s: Likewise.
> > ---
> >  bfd/elflink.c                  | 31 ++++++++++++++++++++++++++++---
> >  ld/testsuite/ld-elf/pr27825.d  | 18 ++++++++++++++++++
> >  ld/testsuite/ld-elf/pr27825a.s |  7 +++++++
> >  ld/testsuite/ld-elf/pr27825b.s |  5 +++++
> >  4 files changed, 58 insertions(+), 3 deletions(-)
> >  create mode 100644 ld/testsuite/ld-elf/pr27825.d
> >  create mode 100644 ld/testsuite/ld-elf/pr27825a.s
> >  create mode 100644 ld/testsuite/ld-elf/pr27825b.s
> >
> > diff --git a/bfd/elflink.c b/bfd/elflink.c
> > index cb38a025349..ac46585f0ab 100644
> > --- a/bfd/elflink.c
> > +++ b/bfd/elflink.c
> > @@ -9845,22 +9845,47 @@ elf_link_output_symstrtab (void *finf,
> >                   /* Append ".COUNT" to duplicated local symbols.  */
> >                   size_t count_len;
> >                   size_t base_len = lh->size;
> > -                 char buf[30];
> > -                 sprintf (buf, "%lx", lh->count);
> > +                 char buf[20];
> > +                 if (snprintf (buf, sizeof (buf), "%lx", lh->count)
> > +                     >= (int) sizeof (buf))
> > +                   return 0;
> >                   if (!base_len)
> >                     {
> >                       base_len = strlen (name);
> >                       lh->size = base_len;
> >                     }
> >                   count_len = strlen (buf);
> > +                 /* NB: Allocate the extra suffix buffer for possible
> > +                    change.  */
> >                   versioned_name = bfd_alloc (flinfo->output_bfd,
> > -                                             base_len + count_len + 2);
> > +                                             base_len + sizeof (buf)
> > +                                             + 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);
> > +                 do
> > +                   {
> > +                     /* Avoid conflicts with local symbol names of
> > +                        "XXX.COUNT".  */
> > +                     struct local_hash_entry *lvh
> > +                       = (struct local_hash_entry *) bfd_hash_lookup
> > +                       (&flinfo->local_hash_table, versioned_name,
> > +                        false, false);
> > +                     if (lvh == NULL)
> > +                       break;
> > +                     lh->count++;
> > +                     if (snprintf (buf, sizeof (buf), "%lx",
> > +                                   lh->count) >= (int) sizeof (buf))
> > +                       return 0;
> > +                     count_len = strlen (buf);
> > +                     /* NB: Use the existing suffix buffer.  */
> > +                     memcpy (versioned_name + base_len + 1, buf,
> > +                             count_len + 1);
> > +                   }
> > +                 while (1);
> >                 }
> >               lh->count++;
> >               break;

> This scheme doesn't work.
>

This one works.

-- 
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: v2-0001-elf-Avoid-possible-duplicated-local-symbol-names.patch
Type: text/x-patch
Size: 5605 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20210505/193aac76/attachment.bin>


More information about the Binutils mailing list