PATCH: PR ld/12761: .gnu.warning.* doesn't work when building shared library

H.J. Lu
Tue May 17 13:12:00 GMT 2011

On Mon, May 16, 2011 at 11:03 PM, Ian Lance Taylor <> wrote:
> "H.J. Lu" <> writes:
>> We should issure a gnu warning when building shared library.  This patch
>> implements it.  OK for trunk?
> No, this is not how warning symbols are supposed to work.  We only want
> to issue the warning for a warning symbol if there is some reference to
> the symbol in the main program.  If we issue the warnings for a shared
> library, then we will wind up issuing the warnings even if the program
> does not ever refer to the symbol.  That is undesirable and will almost
> certainly break some uses of warning symbols.

We aren't consistent:

1. Gold always issues a warning when building a shared library.
2. Ld sometimes issues a warning when building a shared library:

static void
gld${EMULATION_NAME}_before_allocation (void)
  /* Look for any sections named .gnu.warning.  As a GNU extensions,
     we treat such sections as containing warning messages.  We print
     out the warning message, and then zero out the section size so
     that it does not get copied into the output file.  */

My patch makes it consistent within ld as well as with gold.

> I think it would be reasonable to issue a warning when building a shared
> library for a reference to a symbol defined in some other shared
> library, but it is necessary to not give a warning for references to
> symbols defined in the library being created.

What is the difference between defined inside vs outside of DSO?
They both reference a function with a warning.


More information about the Binutils mailing list