If there are two goto's that exit from nested functions and go to the same label in main function, gcc generates references to two different labels, but generates only one label to jump to. Result is undefined symbol and linking error. This happens on both SPARC and SPARC64, both -O0 and -O3. However, x86 version works fine.
$ cat xb.c int bar(); extern int en; int foo ( ) { __label__ err; int res = 0; void e1 ( ) { res = -1; en = 1; goto err; } void e2 ( ) { res = -1; en = 2; goto err; } while (1) { switch (bar()) { case 1: e1(); case 2: e2(); case 3: goto breakw; case 4: res++; } continue; breakw: break; } err: return res; } $ sparc64-elf64-linux-gcc -m32 -c xb.c -o xb.o $ sparc64-elf64-linux-nm xb.o U bar 0000011c t e1.1118 000000d8 t e2.1120 U en 00000000 T foo U .LL17 The problem also happens [though with different label name] for -m64 and/or -O3. The workaround is to reduce number of outside goto's per target label to 1, either by throwing some goto's away, or declaring multiple labels in the target place, having only one goto to each of them. -- Summary: undefined symbol [local label] for goto from nested function [SPARC] Product: gcc Version: 4.0.2 Status: UNCONFIRMED Severity: major Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: markosc at interia dot pl GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: sparc64-elf64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28342