summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog15
-rw-r--r--bfd/elf-bfd.h4
-rw-r--r--bfd/elf.c59
-rw-r--r--bfd/elf64-ppc.c7
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);
diff --git a/bfd/elf.c b/bfd/elf.c
index 9c9ba75402..5aabeeb1cd 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -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;