http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19520
--- Comment #25 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-01-18 09:21:14 UTC --- LD bug: http://sourceware.org/bugzilla/show_bug.cgi?id=13600 The GCC side is a QOI thing and maybe a conformance thing. ICC generates for __attribute__((visibility("protected"))) void * foo (void) { return (void *)foo; } .protected foo .globl foo foo: ..B1.1: # Preds ..B1.0 ..___tag_value_foo.1: #1.60 movq foo@GOTPCREL(%rip), %rax #1.77 thus does not resolve the function address to the local symbol, which GCC does and which confuses LD (thus the linker bug): .globl foo .protected foo .type foo, @function foo: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 leaq foo(%rip), %rax I think ICC this way avoids the function pointer comparison issues with symbols with protected visibility (can someone double-check? HJs testcase doesn't compile for me).