when a symbol is not exported outside of the
DSO, it is can be hidden. Usually we try to internalize
as much as possible, but it is not always possible, for
instance a symbol can be referenced outside of the LTO
unit, or there can be cross-module reference in ThinLTO.
I'm still testing this patch, it may a bit rough around
the edges right now.
This is a good starting point to understand this patch.