bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/23309] ld.bfd -u option to force symbol discards symbol when use


From: zenith432 at users dot sourceforge.net
Subject: [Bug ld/23309] ld.bfd -u option to force symbol discards symbol when used with LTO plugin and the symbol has hidden or internal visibility
Date: Tue, 19 Jun 2018 16:01:40 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=23309

--- Comment #2 from zenith432 at users dot sourceforge.net ---
So here's what's going...

In ld/plugin.c (ld.bfd)... the following code in get_symbols_v2
=====
      if (res == LDPR_PREVAILING_DEF_IRONLY)
        {
          /* We need to know if the sym is referenced from non-IR files.  Or
             even potentially-referenced, perhaps in a future final link if
             this is a partial one, perhaps dynamically at load-time if the
             symbol is externally visible.  */
          if (blhe->non_ir_ref_regular)
            res = LDPR_PREVAILING_DEF;
          else if (is_visible_from_outside (&syms[n], blhe))
            res = def_ironly_exp;
        }
=====
For symbol 'main', no_ir_ref_regular is true, so it sets resolution of
LDPR_PREVAILING_DEF and the symbol is handled correctly.
For symbol 'KeepMe', no_ir_ref_regular is false, and it calls
is_visible_from_outside(), which return true because KeepMe is in the list of
entry points.  The makes it set a resolution of LDPR_PREVAILING_DEF_IRONLY_EXP
(the value of def_ironly_exp) - which is what cases KeepMe to be incorrectly
converted from "global hidden" to "local".

And in gold?
=====
            {
              if (is_referenced_from_outside(lsym))
                res = LDPR_PREVAILING_DEF;
              else if (is_visible_from_outside(lsym))
                res = ldpr_prevailing_def_ironly_exp;
              else
                res = LDPR_PREVAILING_DEF_IRONLY;
            }
=====
is in function Pluginobj::get_symbol_resolution_info.  The function
is_referenced_from_outside returns true for both "main", and "KeepMe", which
sets a resolution of LDPR_PREVAILING_DEF for both of them getting them to be
handled correctly.
In is_referenced_from_outside, lsym->in_real_elf returns true for "main"
  and parameters->options().is_undefined(lsym->name()) returns true for
"KeepMe".

To resolve this, the logic in ld.bfd needs to be changed so that both symbols
end up with a resolution of LDPR_PREVAILING_DEF.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]