From: Peter Zijlstra > Sent: 10 March 2022 09:05 > > On Wed, Mar 09, 2022 at 04:30:28PM -0800, Nick Desaulniers wrote: > > > I observed the following error when building with > > CONFIG_LTO_CLANG_FULL=y enabled: > > > > ld.lld: error: ld-temp.o <inline asm>:7:2: symbol 'ibt_selftest_ip' is > > already defined > > ibt_selftest_ip: > > ^ > > > > Seems to come from > > commit a802350ba65a ("x86/ibt: Add IBT feature, MSR and #CP handling") > > > > Commenting out the label in the inline asm, I then observed: > > vmlinux.o: warning: objtool: identify_cpu()+0x6d0: sibling call from > > callable instruction with modified stack frame > > vmlinux.o: warning: objtool: identify_cpu()+0x6e0: stack state > > mismatch: cfa1=4+64 cfa2=4+8 > > These seemed to disappear when I kept CONFIG_LTO_CLANG_FULL=y but then > > disabled CONFIG_X86_KERNEL_IBT. (perhaps due to the way I hacked out > > the ibt_selftest_ip label). > > Urgh.. I'm thikning this is a clang bug :/ > > The code in question is: > > > void ibt_selftest_ip(void); /* code label defined in asm below */ > > DEFINE_IDTENTRY_ERRORCODE(exc_control_protection) > { > /* ... */ > > if (unlikely(regs->ip == (unsigned long)ibt_selftest_ip)) { > regs->ax = 0; > return; > } > > /* ... */ > } > > bool ibt_selftest(void) > { > unsigned long ret; > > asm (" lea ibt_selftest_ip(%%rip), %%rax\n\t" > ANNOTATE_RETPOLINE_SAFE > " jmp *%%rax\n\t" > "ibt_selftest_ip:\n\t" > UNWIND_HINT_FUNC > ANNOTATE_NOENDBR > " nop\n\t" > > : "=a" (ret) : : "memory"); > > return !ret; > } > > There is only a single definition of that symbol, the one in the asm. > The other is a declaration, which is used in the exception handler to > compare against regs->ip. LTO has probably inlined it twice. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)