#include "stdio.h" int b(void) { return 1; } int a(int (*b)(void)) { return b(); } m() { int i; for (i=0; i<1000000;i++) i+=a(b); printf ("%i\n",i); c(); } With -O2 -fPIC is compiled as (on Linux): m: # @m .cfi_startproc # BB#0: pushq %rax .Ltmp3: .cfi_def_cfa_offset 16 leaq .L.str(%rip), %rdi movl $1000000, %esi # imm = 0xF4240 xorb %al, %al callq printf@PLT xorb %al, %al popq %rdx jmp c@PLT # TAILCALL .Ltmp4: This is not valid, since ELF interpositionallows you to replace a by different function returning different value.