https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63435
Bug ID: 63435 Summary: Bad code with weak vs localalias on AIX Product: gcc Version: 4.9.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: gcc at dixie dot net.nz Host: powerpc-ibm-aix7.1.0.0 Target: powerpc-ibm-aix7.1.0.0 Build: powerpc-ibm-aix7.1.0.0 Created attachment 33638 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33638&action=edit testcase Consider attached testcase. The recvfrom function is generated as a weak symbol, symtab_node::noninterposable_alias creates a localalias. .weak recvfrom[DS] .weak .recvfrom .csect recvfrom[DS] recvfrom: .long .recvfrom, TOC[tc0], 0 .csect .text[PR] .recvfrom: ------- gcc-4.9.1 generates local alias to the weak symbol: .lglobl .recvfrom.localalias.0 .lglobl recvfrom.localalias.0 .set .recvfrom.localalias.0,.recvfrom .set recvfrom.localalias.0,recvfrom ------- This local alias is called with local calling convention (missing nop): bl .recvfrom.localalias.0 mr 9,3 ------- The linker discards the weak local recvfrom symbol, and chooses recvfrom from libc. The recvfrom in libc is remote and needs a nop instruction. The linker correctly issues a diagnostic about this: ld: 0711-768 WARNING: Object myrecvfrom.o, section 1, function .recvfrom: The branch at address 0xc8 is not followed by a recognized no-op or TOC-reload instruction. The unrecognized instruction is 0x7C691B78. At runtime this results in corrupt TOC pointer (possibly requires larger testcase to observe problems).