2001-10-31 Jakub Jelinek * frame.c (fde_merge): Choose just one from FDEs for the same function in erratic array. --- gcc/unwind-dw2-fde.c.jj Fri Jan 11 14:01:21 2002 +++ gcc/unwind-dw2-fde.c Tue Jan 15 15:58:27 2002 @@ -535,7 +535,7 @@ fde_merge (struct object *ob, fde_compar struct fde_vector *v1, struct fde_vector *v2) { size_t i1, i2; - fde * fde2; + fde * fde2 = NULL; i2 = v2->count; if (i2 > 0) @@ -544,6 +544,17 @@ fde_merge (struct object *ob, fde_compar do { i2--; + if (fde2 != NULL && fde_compare (ob, v2->array[i2], fde2) == 0) + { + /* Some linkers (e.g. 2.10.91.0.2 or 2.11.92.0.8) resolve + section relative relocations against removed linkonce + section to corresponding location in the output linkonce + section. Always use the earliest fde in that case. */ + fde2 = v2->array[i2]; + v1->array[i1+i2+1] = fde2; + v1->array[i1+i2] = fde2; + continue; + } fde2 = v2->array[i2]; while (i1 > 0 && fde_compare (ob, v1->array[i1-1], fde2) > 0) {