From 9cf0e28212068b89d962e7c850f33b56a0f50a09 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Mon, 9 May 2011 13:12:52 +0000 Subject: [PATCH] 2011-05-09 Paul Brook bfd/ * elf32-tic6x.c (elf32_tic6x_gc_mark_extra_sections): New function. (elf_backend_gc_mark_extra_sections): Define. --- bfd/ChangeLog | 5 +++++ bfd/elf32-tic6x.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b8c2cf4b0d7..57025970efb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2011-05-09 Paul Brook + + * elf32-tic6x.c (elf32_tic6x_gc_mark_extra_sections): New function. + (elf_backend_gc_mark_extra_sections): Define. + 2011-05-07 Dave Korn PR ld/12365 diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c index 909225a5c3b..6b1065432fa 100644 --- a/bfd/elf32-tic6x.c +++ b/bfd/elf32-tic6x.c @@ -1839,6 +1839,53 @@ elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd, return TRUE; } +/* Unwinding tables are not referenced directly. This pass marks them as + required if the corresponding code section is marked. */ + +static bfd_boolean +elf32_tic6x_gc_mark_extra_sections (struct bfd_link_info *info, + elf_gc_mark_hook_fn gc_mark_hook) +{ + bfd *sub; + Elf_Internal_Shdr **elf_shdrp; + bfd_boolean again; + + /* Marking EH data may cause additional code sections to be marked, + requiring multiple passes. */ + again = TRUE; + while (again) + { + again = FALSE; + for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) + { + asection *o; + + if (! is_tic6x_elf (sub)) + continue; + + elf_shdrp = elf_elfsections (sub); + for (o = sub->sections; o != NULL; o = o->next) + { + Elf_Internal_Shdr *hdr; + + hdr = &elf_section_data (o)->this_hdr; + if (hdr->sh_type == SHT_C6000_UNWIND + && hdr->sh_link + && hdr->sh_link < elf_numsections (sub) + && !o->gc_mark + && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark) + { + again = TRUE; + if (!_bfd_elf_gc_mark (info, o, gc_mark_hook)) + return FALSE; + } + } + } + } + + return TRUE; +} + /* Update the got entry reference counts for the section being removed. */ static bfd_boolean @@ -3933,6 +3980,7 @@ elf32_tic6x_copy_private_data (bfd * ibfd, bfd * obfd) #define elf_backend_rela_normal 1 #define elf_backend_got_header_size 8 #define elf_backend_gc_sweep_hook elf32_tic6x_gc_sweep_hook +#define elf_backend_gc_mark_extra_sections elf32_tic6x_gc_mark_extra_sections #define elf_backend_modify_program_headers \ elf32_tic6x_modify_program_headers #define elf_backend_create_dynamic_sections \ -- 2.30.2