• Josh Poimboeuf's avatar
    objtool: Detect RIP-relative switch table references, part 2 · 7dec80cc
    Josh Poimboeuf authored
    With the following commit:
    
      fd35c88b ("objtool: Support GCC 8 switch tables")
    
    I added a "can't find switch jump table" warning, to stop covering up
    silent failures if add_switch_table() can't find anything.
    
    That warning found yet another bug in the objtool switch table detection
    logic.  For cases 1 and 2 (as described in the comments of
    find_switch_table()), the find_symbol_containing() check doesn't adjust
    the offset for RIP-relative switch jumps.
    
    Incidentally, this bug was already fixed for case 3 with:
    
      6f5ec299 ("objtool: Detect RIP-relative switch table references")
    
    However, that commit missed the fix for cases 1 and 2.
    
    The different cases are now starting to look more and more alike.  So
    fix the bug by consolidating them into a single case, by checking the
    original dynamic jump instruction in the case 3 loop.
    
    This also simplifies the code and makes it more robust against future
    switch table detection issues -- of which I'm sure there will be many...
    
    Switch table detection has been the most fragile area of objtool, by
    far.  I long for the day when we'll have a GCC plugin for annotating
    switch tables.  Linus asked me to delay such a plugin due to the
    flakiness of the plugin infrastructure in older versions of GCC, so this
    rickety code is what we're stuck with for now.  At least the code is now
    a little simpler than it was.
    Reported-by: default avatarkbuild test robot <lkp@intel.com>
    Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/f400541613d45689086329432f3095119ffbc328.1526674218.git.jpoimboe@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    7dec80cc
check.c 52 KB