--- ./gdb/xcoffread.c_orig 2015-11-02 05:33:01.000000000 -0600 +++ ./gdb/xcoffread.c 2015-11-02 05:29:56.000000000 -0600 @@ -1035,7 +1035,7 @@ union internal_auxent fcn_aux_saved = main_aux; struct context_stack *new; - char *filestring = " _start_ "; /* Name of the current file. */ + char *filestring = pst -> filename; /* Name of the current file. */ const char *last_csect_name; /* Last seen csect's name. */ @@ -1128,7 +1128,8 @@ } /* if symbol name starts with ".$" or "$", ignore it. */ - if (cs->c_name[0] == '$' + /* We also need to skip symbols starting with @FIX, which are used for TOC reference */ + if (cs->c_name[0] == '$' || !strncmp(cs->c_name, "@FIX", 4) || (cs->c_name[1] == '$' && cs->c_name[0] == '.')) continue; @@ -1148,8 +1149,7 @@ /* Done with all files, everything from here on is globals. */ } - if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT) - && cs->c_naux == 1) + if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT)) { /* Dealing with a symbol with a csect entry. */ @@ -1160,8 +1160,27 @@ #define CSECT_SCLAS(PP) (CSECT(PP).x_smclas) /* Convert the auxent to something we can access. */ - bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass, - 0, cs->c_naux, &main_aux); + /* xcoff can have more than 1 auxent */ + if (cs->c_naux > 1) + { + if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF) + { + bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, + cs->c_sclass, 0, cs->c_naux, + &main_aux); + goto function_entry_point; + } + else + bfd_coff_swap_aux_in (abfd, + raw_auxptr + ((coff_data (abfd)->local_symesz) * (cs->c_naux - 1)), + cs->c_type, cs->c_sclass, cs->c_naux - 1, + cs->c_naux, &main_aux); + } + else if (cs->c_naux == 1) + bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass, + 0, cs->c_naux, &main_aux); + else + continue ; switch (CSECT_SMTYP (&main_aux)) {