This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fix PR12762 using linkonce sections in plugin bfd


On Thu, Aug 11, 2011 at 6:08 AM, Alan Modra <amodra@gmail.com> wrote:
> This patch undoes HJ's changes to bfd_section_already_linked in
> http://sourceware.org/ml/binutils/2011-07/msg00070.html, and some of
> my later changes. ?HJ's patch effectively added another type of entry
> to the already_linked list for plugin comdat symbols. ?This works fine
> most of the time, but there are parts of the bfd and linker code that
> really want separate sections for comdat symbols. ?For example,
> ldmain.c:multiple_definition just after the FIXME comment. ?So
> this patch simply provides dummy linkonce sections for plugin comdat
> symbols.
>
> Ironically, the FIXME advocates doing exactly what we were attempting
> in plugin.c:add_symbols, so in some respects this patch is a backwards
> step. ?It also uses more memory. ?The reason I didn't apply further
> tweaks like the patch in PR13066 is that bfd_section_already_linked
> was getting quite messy. ?If we are going to go the way this FIXME
> suggests then we really aught to do so for all symbols, not just
> plugin symbols. ?I'd like to see that happen but don't have time at
> the moment to fix all the fallout.
>

> Index: ld/plugin.c
> ===================================================================
> RCS file: /cvs/src/src/ld/plugin.c,v
> retrieving revision 1.38
> diff -u -p -r1.38 plugin.c
> --- ld/plugin.c 9 Aug 2011 09:27:34 -0000 ? ? ? 1.38
> +++ ld/plugin.c 11 Aug 2011 06:24:21 -0000
> @@ -32,7 +32,6 @@
> ?#include "plugin.h"
> ?#include "plugin-api.h"
> ?#include "elf-bfd.h"
> -#include "libbfd.h"
> ?#if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
> ?#include <windows.h>
> ?#endif
> @@ -240,7 +239,7 @@ plugin_get_ir_dummy_bfd (const char *nam
> ? ? ? ?{
> ? ? ? ? ?flagword flags;
>
> - ? ? ? ? /* Create sections to own the symbols. ?*/
> + ? ? ? ? /* Create section to own the symbols. ?*/
> ? ? ? ? ?flags = (SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY
> ? ? ? ? ? ? ? ? ? | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_EXCLUDE);
> ? ? ? ? ?if (bfd_make_section_anyway_with_flags (abfd, ".text", flags))
> @@ -285,7 +284,25 @@ asymbol_from_plugin_symbol (bfd *abfd, a
> ? ? ? /* FALLTHRU */
> ? ? case LDPK_DEF:
> ? ? ? flags |= BSF_GLOBAL;
> - ? ? ?section = bfd_get_section_by_name (abfd, ".text");
> + ? ? ?if (ldsym->comdat_key)
> + ? ? ? {
> + ? ? ? ? section = bfd_get_section_by_name (abfd, ldsym->comdat_key);
> + ? ? ? ? if (section == NULL)
> + ? ? ? ? ? {
> + ? ? ? ? ? ? flagword sflags;
> +
> + ? ? ? ? ? ? sflags = (SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY
> + ? ? ? ? ? ? ? ? ? ? ? | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_EXCLUDE
> + ? ? ? ? ? ? ? ? ? ? ? | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD);
> + ? ? ? ? ? ? section = bfd_make_section_anyway_with_flags (abfd,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? xstrdup (ldsym->comdat_key),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sflags);
> + ? ? ? ? ? ? if (section == NULL)
> + ? ? ? ? ? ? ? return LDPS_ERR;
> + ? ? ? ? ? }
> + ? ? ? }
> + ? ? ?else
> + ? ? ? section = bfd_get_section_by_name (abfd, ".text");
> ? ? ? break;
>

This is the first approach I tried and failed with GCC 4.7 LTO
tests on Linux/x86-64 since adding new sections to dummy
LTO bfd at this stage didn't work very well.

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]