From b5778e45efffc65d7713d80319af472c90648733 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 10 Dec 2008 03:49:02 +0000 Subject: [PATCH] * elf32-spu.c (define_ovtab_symbol): Don't abort on symbols defined in linker scripts. (discover_functions): Consider STT_SECTION symbols too. (collect_lib_sections): Don't cut short call tree traversal when function size is too large. --- bfd/ChangeLog | 4 ++++ bfd/elf32-spu.c | 32 ++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6b4e40be5..17f1fb4d7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -5,6 +5,10 @@ (mark_detached_root): New function. (build_call_tree): Call it. (sort_calls): Don't do void* arithmetic. + (define_ovtab_symbol): Don't abort on symbols defined in linker scripts. + (discover_functions): Consider STT_SECTION symbols too. + (collect_lib_sections): Don't cut short call tree traversal + when function size is too large. 2008-12-09 Tom Tromey diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c index 48a4a3cd3..b2ac17e1f 100644 --- a/bfd/elf32-spu.c +++ b/bfd/elf32-spu.c @@ -1401,7 +1401,7 @@ define_ovtab_symbol (struct spu_link_hash_table *htab, const char *name) h->ref_regular_nonweak = 1; h->non_elf = 0; } - else + else if (h->root.u.def.section->owner != NULL) { (*_bfd_error_handler) (_("%B is not allowed to define %s"), h->root.u.def.section->owner, @@ -1409,6 +1409,13 @@ define_ovtab_symbol (struct spu_link_hash_table *htab, const char *name) bfd_set_error (bfd_error_bad_value); return NULL; } + else + { + (*_bfd_error_handler) (_("you are not allowed to define %s in a script"), + h->root.root.string); + bfd_set_error (bfd_error_bad_value); + return NULL; + } return h; } @@ -2434,7 +2441,8 @@ discover_functions (struct bfd_link_info *info) sec_arr[bfd_idx] = psecs; for (psy = psyms, p = psecs, sy = syms; sy < syms + symcount; ++p, ++sy) if (ELF_ST_TYPE (sy->st_info) == STT_NOTYPE - || ELF_ST_TYPE (sy->st_info) == STT_FUNC) + || ELF_ST_TYPE (sy->st_info) == STT_FUNC + || ELF_ST_TYPE (sy->st_info) == STT_SECTION) { asection *s; @@ -3047,18 +3055,18 @@ collect_lib_sections (struct function_info *fun, size = fun->sec->size; if (fun->rodata) size += fun->rodata->size; - if (size > lib_param->lib_size) - return TRUE; - - *lib_param->lib_sections++ = fun->sec; - fun->sec->gc_mark = 0; - if (fun->rodata && fun->rodata->linker_mark && fun->rodata->gc_mark) + if (size <= lib_param->lib_size) { - *lib_param->lib_sections++ = fun->rodata; - fun->rodata->gc_mark = 0; + *lib_param->lib_sections++ = fun->sec; + fun->sec->gc_mark = 0; + if (fun->rodata && fun->rodata->linker_mark && fun->rodata->gc_mark) + { + *lib_param->lib_sections++ = fun->rodata; + fun->rodata->gc_mark = 0; + } + else + *lib_param->lib_sections++ = NULL; } - else - *lib_param->lib_sections++ = NULL; for (call = fun->call_list; call != NULL; call = call->next) collect_lib_sections (call->fun, info, param); -- 2.11.4.GIT