• Jinoh Kang's avatar
    loader: Set the visibility of symbols in preloader to "hidden". · 966233ae
    Jinoh Kang authored
    Today, the preloader is linked with -fPIE in spite of the fact that the
    preloader is a non-PIE statically linked binary.  This is due to a
    limitation in tools/makedep that makes it difficult to specify CFLAGS
    for each individual object file's recipe.
    
    This can seemingly cause problems with some GOTPCREL(X) relocations
    inside the preloader. Since preloader does not link to the system
    library directly, there is no need for a Global Offset Table (GOT).
    However, a few extern (non-static) function symbols are declared, the
    use of which makes GCC emit instructions that references those symbols
    by indirection through GOT.  The linker then tries to optimize such
    instructions to eliminate GOT references, which can fail due to various
    reasons.
    
    This stands in contradiction with Jinoh Kang's suggestion (in bug 55050)
    that "-fPIE is harmless even when applied to an object linked into
    non-PIE executables." The claim is theoretically true since
    position-independent code can in principle be relocated to any address
    (fixed or dynamic); however, it fails due to some peculiar practical
    issues, which is arguably a limitation in the linker's implementation
    (since it can be worked around with -Wl,--no-relax without issues).
    
    Fix this by eliminating GOT usage by setting the default visibility of
    non-static declarations to "hidden". Assuming GCC's medium code model
    (-mcmodel=medium; default code model for x86_64), this suppresses any
    unnecessary PLT or GOT relocations for defined symbols, and provides
    opportunity for GCC to optimize the code better.
    
    Fixes: 78ed3438
    Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55091
    966233ae
preloader.c 48.1 KB