https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88643
--- Comment #14 from Richard Biener <rguenth at gcc dot gnu.org> --- Just to note with BFD ld from 2.41.0 I see 1 a-t.o 3 194 b4b00c6ef6ad050b PREVAILING_DEF_IRONLY __wrap_cook 198 b4b00c6ef6ad050b PREVAILING_DEF main 214 b4b00c6ef6ad050b RESOLVED_IR cook when building int cook(void); int __wrap_cook(void) { return 0; } int main() { if (cook () == -1) __builtin_abort (); return 0; } but an LTO link fails with /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: ./a.ltrans0.ltrans.o: in function `main': <artificial>:(.text+0x10): undefined reference to `__wrap_cook' GCC emits at LTRANS stage .file "<artificial>" .text .type __wrap_cook, @function __wrap_cook: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size __wrap_cook, .-__wrap_cook .globl main .type main, @function main: .LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 call cook cmpl $-1, %eax jne .L4 call abort .L4: movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret which I think should be OK. The main difference is that __wrap_cook is an internal symbol but that's OK since the linker told GCC 194 b4b00c6ef6ad050b PREVAILING_DEF_IRONLY __wrap_cook it probably should have used 194 b4b00c6ef6ad050b PREVAILING_DEF __wrap_cook instead.