Skip to content
  • Jiri Slaby's avatar
    x86/vdso: Fix the build on GCC5 · 99a9adca
    Jiri Slaby authored
    commit e893286918d2cde3a94850d8f7101cd1039e0c62 upstream.
    
    On gcc5 the kernel does not link:
    
      ld: .eh_frame_hdr table[4] FDE at 0000000000000648 overlaps table[5] FDE at 0000000000000670.
    
    Because prior GCC versions always emitted NOPs on ALIGN directives, but
    gcc5 started omitting them.
    
    .LSTARTFDEDLSI1 says:
    
            /* HACK: The dwarf2 unwind routines will subtract 1 from the
               return address to get an address in the middle of the
               presumed call instruction.  Since we didn't get here via
               a call, we need to include the nop before the real start
               to make up for it.  */
            .long .LSTART_sigreturn-1-.     /* PC-relative start address */
    
    But commit 69d0627a
    
     ("x86 vDSO: reorder vdso32 code") from 2.6.25
    replaced .org __kernel_vsyscall+32,0x90 by ALIGN right before
    __kernel_sigreturn.
    
    Of course, ALIGN need not generate any NOP in there. Esp. gcc5 collapses
    vclock_gettime.o and int80.o together with no generated NOPs as "ALIGN".
    
    So fix this by adding to that point at least a single NOP and make the
    function ALIGN possibly with more NOPs then.
    
    Kudos for reporting and diagnosing should go to Richard.
    
    Reported-by: default avatarRichard Biener <rguenther@suse.de>
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    Acked-by: default avatarAndy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/1425543211-12542-1-git-send-email-jslaby@suse.cz
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    99a9adca