Fix problem where TLS common symbols are not allocated properly during LTO.
authorCary Coutant <ccoutant@google.com>
Fri, 26 Sep 2014 04:47:10 +0000 (21:47 -0700)
committerCary Coutant <ccoutant@google.com>
Fri, 26 Sep 2014 04:49:42 +0000 (21:49 -0700)
commit1707f183446fae9aca8523c1ebf721bcf2472008
tree6ecd6a93bad60ea2a42667315728831dedfb1d25
parentd7ac9d81bb1a177264187efc51c9cc0479cdd09c
Fix problem where TLS common symbols are not allocated properly during LTO.

The plugin API doesn't provide a way for the claimed file handler to
identify a TLS symbol, so when adding a common TLS symbol, gold
mistakenly places the symbol in the non-TLS commons list, and does
not override it when we see the replacement symbol that is marked
as TLS. Consequently, we allocate the TLS common symbol as a regular
common, and, if it's the only TLS in the program, we'll give an
internal error because we haven't allocated a TLS segment.

This patch fixes the problem by removing an exclusion where common
symbols would not override the placeholder symbols, but checking to
see if the size needs adjusting (the original reason for the exclusion).
Furthermore, we need to avoid putting placeholder symbols in the common
list, and wait until we see a real common symbol with a type we can
trust.

gold/
PR gold/17432
* resolve.cc (Symbol_table::resolve): Override common placeholder
symbols, but adjust sizes.
* symtab.cc (Symbol_table::add_from_object): Don't add placeholder
symbols to common lists.
gold/ChangeLog
gold/resolve.cc
gold/symtab.cc