diff options
-rw-r--r-- | bfd/ChangeLog | 15 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 4 | ||||
-rw-r--r-- | bfd/elf.c | 59 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 7 |
4 files changed, 42 insertions, 43 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 16d5af9c8e..6d56dd4eee 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,7 +1,16 @@ +2012-02-07 Alan Modra <amodra@gmail.com> + + * elf.c (elf_find_function): Don't use internal_elf_sym. + (_bfd_elf_maybe_function_sym): Likewise. Replace elf_symbol_type + parameter with asymbol. + * elf64-ppc.c (ppc64_elf_maybe_function_sym): Likewise. + * elf-bfd.h (_bfd_elf_maybe_function_sym): Update prototype. + (struct elf_backend_data <maybe_function_sym>): Likewise. + 2012-02-02 Vidya Praveen (vidya.praveen@atmel.com) PR bfd/13410 - * bfd/elf32-avr.c (elf32_avr_relax_section): Correct the + * bfd/elf32-avr.c (elf32_avr_relax_section): Correct the condition that qualifies the candidates for relaxation. 2012-02-02 Tristan Gingold <gingold@adacore.com> @@ -102,13 +111,13 @@ * cpu-z8k.c: Likewise. * cpu-i386.c: Include "libiberty.h". - (bfd_arch_i386_fill): New. + (bfd_arch_i386_fill): New. Add bfd_arch_i386_fill to bfd_arch_info initializer. * cpu-k1om.c: Add bfd_arch_i386_fill to bfd_arch_info initializer. * cpu-l1om.c: Likewise. - * linker.c (default_data_link_order): Call abfd->arch_info->fill + * linker.c (default_data_link_order): Call abfd->arch_info->fill if fill size is 0. * bfd-in2.h: Regenerated. diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 98948a99c3..db414e90fd 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1223,7 +1223,7 @@ struct elf_backend_data /* Return TRUE if symbol may be a function. Set *CODE_SEC and *CODE_VAL to the function's entry point. */ - bfd_boolean (*maybe_function_sym) (const elf_symbol_type *sym, + bfd_boolean (*maybe_function_sym) (const asymbol *sym, asection **code_sec, bfd_vma *code_off); /* Used to handle bad SHF_LINK_ORDER input. */ @@ -2202,7 +2202,7 @@ extern bfd_boolean _bfd_elf_map_sections_to_segments extern bfd_boolean _bfd_elf_is_function_type (unsigned int); -extern bfd_boolean _bfd_elf_maybe_function_sym (const elf_symbol_type *, +extern bfd_boolean _bfd_elf_maybe_function_sym (const asymbol *, asection **, bfd_vma *); extern int bfd_elf_get_default_section_type (flagword); @@ -7404,36 +7404,30 @@ elf_find_function (bfd *abfd, for (p = symbols; *p != NULL; p++) { - elf_symbol_type *q; - unsigned int type; + asymbol *sym = *p; asection *code_sec; bfd_vma code_off; - q = (elf_symbol_type *) *p; - - type = ELF_ST_TYPE (q->internal_elf_sym.st_info); - switch (type) + if ((sym->flags & BSF_FILE) != 0) { - case STT_FILE: - file = &q->symbol; + file = sym; if (state == symbol_seen) state = file_after_symbol_seen; continue; - default: - if (bed->maybe_function_sym (q, &code_sec, &code_off) - && code_sec == section - && code_off >= low_func - && code_off <= offset) - { - func = (asymbol *) q; - low_func = code_off; - filename = NULL; - if (file != NULL - && (ELF_ST_BIND (q->internal_elf_sym.st_info) == STB_LOCAL - || state != file_after_symbol_seen)) - filename = bfd_asymbol_name (file); - } - break; + } + + if (bed->maybe_function_sym (sym, &code_sec, &code_off) + && code_sec == section + && code_off >= low_func + && code_off <= offset) + { + func = sym; + low_func = code_off; + filename = NULL; + if (file != NULL + && ((sym->flags & BSF_LOCAL) != 0 + || state != file_after_symbol_seen)) + filename = bfd_asymbol_name (file); } if (state == nothing_seen) state = symbol_seen; @@ -9695,17 +9689,14 @@ _bfd_elf_is_function_type (unsigned int type) and *CODE_OFF to the function's entry point. */ bfd_boolean -_bfd_elf_maybe_function_sym (const elf_symbol_type *sym, +_bfd_elf_maybe_function_sym (const asymbol *sym, asection **code_sec, bfd_vma *code_off) { - unsigned int type = ELF_ST_TYPE (sym->internal_elf_sym.st_info); - if (type == STT_NOTYPE - || type == STT_FUNC - || type == STT_GNU_IFUNC) - { - *code_sec = sym->symbol.section; - *code_off = sym->symbol.value; - return TRUE; - } - return FALSE; + if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT + | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0) + return FALSE; + + *code_sec = sym->section; + *code_off = sym->value; + return TRUE; } diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index a51115e01a..fc779e62fd 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -5637,14 +5637,13 @@ opd_entry_value (asection *opd_sec, and *CODE_OFF to the function's entry point. */ static bfd_boolean -ppc64_elf_maybe_function_sym (const elf_symbol_type *sym, +ppc64_elf_maybe_function_sym (const asymbol *sym, asection **code_sec, bfd_vma *code_off) { if (_bfd_elf_maybe_function_sym (sym, code_sec, code_off)) { - if (strcmp (sym->symbol.section->name, ".opd") == 0) - opd_entry_value (sym->symbol.section, sym->symbol.value, - code_sec, code_off); + if (strcmp (sym->section->name, ".opd") == 0) + opd_entry_value (sym->section, sym->value, code_sec, code_off); return TRUE; } return FALSE; |