• Peter Zijlstra's avatar
    objtool: Ignore extra-symbol code · 4adb2368
    Peter Zijlstra authored
    There's a fun implementation detail on linking STB_WEAK symbols. When
    the linker combines two translation units, where one contains a weak
    function and the other an override for it. It simply strips the
    STB_WEAK symbol from the symbol table, but doesn't actually remove the
    code.
    
    The result is that when objtool is ran in a whole-archive kind of way,
    it will encounter *heaps* of unused (and unreferenced) code. All
    rudiments of weak functions.
    
    Additionally, when a weak implementation is split into a .cold
    subfunction that .cold symbol is left in place, even though completely
    unused.
    
    Teach objtool to ignore such rudiments by searching for symbol holes;
    that is, code ranges that fall outside the given symbol bounds.
    Specifically, ignore a sequence of unreachable instruction iff they
    occupy a single hole, additionally ignore any .cold subfunctions
    referenced.
    
    Both ld.bfd and ld.lld behave like this. LTO builds otoh can (and do)
    properly DCE weak functions.
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Link: https://lore.kernel.org/r/20220308154319.232019347@infradead.org
    4adb2368
check.c 84.5 KB