Index: bfd/elf32-xtensa.c =================================================================== RCS file: /cvs/src/src/bfd/elf32-xtensa.c,v retrieving revision 1.72 diff -u -r1.72 elf32-xtensa.c --- bfd/elf32-xtensa.c 11 Oct 2006 22:16:50 -0000 1.72 +++ bfd/elf32-xtensa.c 12 Oct 2006 18:55:09 -0000 @@ -2969,6 +2969,19 @@ return xtensa_is_property_section (sec); } + +static unsigned int +elf_xtensa_action_discarded (asection *sec) +{ + if (strcmp (".xt_except_table", sec->name) == 0) + return 0; + + if (strcmp (".xt_except_desc", sec->name) == 0) + return 0; + + return _bfd_elf_default_action_discarded (sec); +} + /* Support for core dump NOTE sections. */ @@ -9832,5 +9845,6 @@ #define elf_backend_relocate_section elf_xtensa_relocate_section #define elf_backend_size_dynamic_sections elf_xtensa_size_dynamic_sections #define elf_backend_special_sections elf_xtensa_special_sections +#define elf_backend_action_discarded elf_xtensa_action_discarded #include "elf32-target.h" Index: ld/emultempl/xtensaelf.em =================================================================== RCS file: /cvs/src/src/ld/emultempl/xtensaelf.em,v retrieving revision 1.15 diff -u -r1.15 xtensaelf.em --- ld/emultempl/xtensaelf.em 16 Sep 2006 18:12:16 -0000 1.15 +++ ld/emultempl/xtensaelf.em 12 Oct 2006 18:55:09 -0000 @@ -1184,7 +1184,7 @@ } -/* Strip out any linkonce literal sections or property tables where the +/* Strip out any linkonce property tables or XCC exception tables where the associated linkonce text is from a different object file. Normally, a matching set of linkonce sections is taken from the same object file, but sometimes the files are compiled differently so that some of the @@ -1199,17 +1199,22 @@ { bfd *abfd = sec->owner; const char *sec_name = bfd_get_section_name (abfd, sec); - const char *name = 0; + const char *name; if ((bfd_get_section_flags (abfd, sec) & SEC_LINK_ONCE) == 0 || strncmp (sec_name, ".gnu.linkonce.", linkonce_len) != 0) return FALSE; - /* Check if this is an Xtensa property section. */ - if (CONST_STRNEQ (sec_name + linkonce_len, "p.")) - name = sec_name + linkonce_len + 2; - else if (CONST_STRNEQ (sec_name + linkonce_len, "prop.")) - name = strchr (sec_name + linkonce_len + 5, '.') + 1; + /* Check if this is an Xtensa property section or an exception table + for Tensilica's XCC compiler. */ + name = sec_name + linkonce_len; + if (CONST_STRNEQ (name, "prop.")) + name = strchr (name + 5, '.') + 1; + else if (name[1] == '.' + && (name[0] == 'p' || name[0] == 'e' || name[0] == 'h')) + name += 2; + else + name = 0; if (name) {