Index: src/gas/config/obj-coff-seh.c =================================================================== --- src.orig/gas/config/obj-coff-seh.c 2010-08-21 14:24:51.000000000 +0200 +++ src/gas/config/obj-coff-seh.c 2010-08-24 08:41:49.441897700 +0200 @@ -1015,13 +1015,23 @@ seh_make_section (void) static char * seh_make_xlbl_name (seh_context *c) { - size_t len = strlen (".seh_xlbl_") + strlen (c->func_name) + 9 + 1; - char *ret = (char*) xmalloc (len); + char *filename; + unsigned int lineno = 0; + size_t len; + char *ret; + as_where (&filename, &lineno); + len = strlen (".seh_xlbl_") + strlen (c->func_name) + 9 + strlen (filename) + 1 + 9 + 1; + ret = (char*) xmalloc (len); if (!ret) as_fatal (_("Out of memory for xdata lable for %s"), c->func_name); - else - sprintf (ret, ".seh_xlbl_%s_%x", c->func_name, + c->xlbl_count); + sprintf (ret, ".seh_xlbl_%s_%x_%s_%x", c->func_name, + c->xlbl_count, filename, lineno); + while ((filename = strchr (ret, '\\')) != NULL) + *filename = '.'; + while ((filename = strchr (ret, '/')) != NULL) + *filename = '.'; + while ((filename = strchr (ret, ':')) != NULL) + *filename = '.'; c->xlbl_count += 1; return ret; } @@ -1030,12 +1040,23 @@ static char * make_seh_text_label (seh_context *c, symbolS **addr) { char *sym_name; - size_t len = strlen (".seh_tlbl_") + strlen (c->func_name) + 9 + 1; + char *filename; + unsigned int lineno = 0; + size_t len; + + as_where (&filename, &lineno); + len = strlen (".seh_tlbl_") + strlen (c->func_name) + 9 + strlen (filename) + 1 + 9 + 1; sym_name = (char *) xmalloc (len); if (!sym_name) as_fatal (_("Allocating memory for SEH's text symbol for %s failed"), c->func_name); - sprintf (sym_name, ".seh_tlbl_%s_%x", c->func_name, c->tlbl_count); + sprintf (sym_name, ".seh_tlbl_%s_%x_%s_%x", c->func_name, c->tlbl_count, filename, lineno); + while ((filename = strchr (sym_name, '\\')) != NULL) + *filename = '.'; + while ((filename = strchr (sym_name, '/')) != NULL) + *filename = '.'; + while ((filename = strchr (sym_name, ':')) != NULL) + *filename = '.'; c->tlbl_count += 1; if (addr) {