Index: bfd/elf-bfd.h |
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h |
index 486b76eecf123488e11785a9b35d30dad74479b4..889ce128b4b526ad731af03bee0688b7a3774d4c 100644 |
--- a/bfd/elf-bfd.h |
+++ b/bfd/elf-bfd.h |
@@ -1,6 +1,6 @@ |
/* BFD back-end data structures for ELF files. |
Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, |
- 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 |
+ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 |
Free Software Foundation, Inc. |
Written by Cygnus Support. |
@@ -428,6 +428,7 @@ enum elf_target_id |
TIC6X_ELF_DATA, |
X86_64_ELF_DATA, |
XTENSA_ELF_DATA, |
+ XGATE_ELF_DATA, |
TILEGX_ELF_DATA, |
TILEPRO_ELF_DATA, |
GENERIC_ELF_DATA |
@@ -1185,7 +1186,8 @@ struct elf_backend_data |
see elf.c, elfcode.h. */ |
bfd *(*elf_backend_bfd_from_remote_memory) |
(bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep, |
- int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr, int len)); |
+ int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr, |
+ bfd_size_type len)); |
/* This function is used by `_bfd_elf_get_synthetic_symtab'; |
see elf.c. */ |
@@ -1221,6 +1223,12 @@ struct elf_backend_data |
/* Return TRUE if type is a function symbol type. */ |
bfd_boolean (*is_function_type) (unsigned int type); |
+ /* If the ELF symbol SYM might be a function in SEC, return the |
+ function size and set *CODE_OFF to the function's entry point, |
+ otherwise return zero. */ |
+ bfd_size_type (*maybe_function_sym) (const asymbol *sym, asection *sec, |
+ bfd_vma *code_off); |
+ |
/* Used to handle bad SHF_LINK_ORDER input. */ |
bfd_error_handler_type link_order_error_handler; |
@@ -1361,6 +1369,9 @@ struct bfd_elf_section_data |
/* The ELF header for this section. */ |
Elf_Internal_Shdr this_hdr; |
+ /* INPUT_SECTION_FLAGS if specified in the linker script. */ |
+ struct flag_info *section_flag_info; |
+ |
/* Information about the REL and RELA reloc sections associated |
with this section, if any. */ |
struct bfd_elf_section_reloc_data rel, rela; |
@@ -1413,14 +1424,14 @@ struct bfd_elf_section_data |
void *sec_info; |
}; |
-#define elf_section_data(sec) ((struct bfd_elf_section_data*)(sec)->used_by_bfd) |
+#define elf_section_data(sec) ((struct bfd_elf_section_data*)(sec)->used_by_bfd) |
#define elf_linked_to_section(sec) (elf_section_data(sec)->linked_to) |
-#define elf_section_type(sec) (elf_section_data(sec)->this_hdr.sh_type) |
-#define elf_section_flags(sec) (elf_section_data(sec)->this_hdr.sh_flags) |
-#define elf_group_name(sec) (elf_section_data(sec)->group.name) |
-#define elf_group_id(sec) (elf_section_data(sec)->group.id) |
-#define elf_next_in_group(sec) (elf_section_data(sec)->next_in_group) |
-#define elf_fde_list(sec) (elf_section_data(sec)->fde_list) |
+#define elf_section_type(sec) (elf_section_data(sec)->this_hdr.sh_type) |
+#define elf_section_flags(sec) (elf_section_data(sec)->this_hdr.sh_flags) |
+#define elf_group_name(sec) (elf_section_data(sec)->group.name) |
+#define elf_group_id(sec) (elf_section_data(sec)->group.id) |
+#define elf_next_in_group(sec) (elf_section_data(sec)->next_in_group) |
+#define elf_fde_list(sec) (elf_section_data(sec)->fde_list) |
#define elf_sec_group(sec) (elf_section_data(sec)->sec_group) |
#define xvec_get_elf_backend_data(xvec) \ |
@@ -1807,8 +1818,7 @@ extern void bfd_elf_set_group_contents |
(bfd *, asection *, void *); |
extern asection *_bfd_elf_check_kept_section |
(asection *, struct bfd_link_info *); |
-extern void _bfd_elf_link_just_syms |
- (asection *, struct bfd_link_info *); |
+#define _bfd_elf_link_just_syms _bfd_generic_link_just_syms |
extern void _bfd_elf_copy_link_hash_symbol_type |
(bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); |
extern bfd_boolean _bfd_elf_size_group_sections |
@@ -1942,6 +1952,8 @@ extern bfd_boolean _bfd_elf_write_section_eh_frame |
(bfd *, struct bfd_link_info *, asection *, bfd_byte *); |
extern bfd_boolean _bfd_elf_write_section_eh_frame_hdr |
(bfd *, struct bfd_link_info *); |
+extern bfd_boolean _bfd_elf_eh_frame_present |
+ (struct bfd_link_info *); |
extern bfd_boolean _bfd_elf_maybe_strip_eh_frame_hdr |
(struct bfd_link_info *); |
@@ -2132,9 +2144,6 @@ extern unsigned int _bfd_elf_common_section_index |
extern asection *_bfd_elf_common_section |
(asection *); |
-extern void _bfd_dwarf2_cleanup_debug_info |
- (bfd *); |
- |
extern bfd_vma _bfd_elf_default_got_elt_size |
(bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, bfd *, |
unsigned long); |
@@ -2200,10 +2209,13 @@ extern bfd_boolean _bfd_elf_map_sections_to_segments |
extern bfd_boolean _bfd_elf_is_function_type (unsigned int); |
+extern bfd_size_type _bfd_elf_maybe_function_sym (const asymbol *, asection *, |
+ bfd_vma *); |
+ |
extern int bfd_elf_get_default_section_type (flagword); |
-extern void bfd_elf_lookup_section_flags |
- (struct bfd_link_info *, struct flag_info *); |
+extern bfd_boolean bfd_elf_lookup_section_flags |
+ (struct bfd_link_info *, struct flag_info *, asection *); |
extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section |
(bfd * abfd, asection * section); |
@@ -2250,10 +2262,10 @@ extern char *elfcore_write_register_note |
extern bfd *_bfd_elf32_bfd_from_remote_memory |
(bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep, |
- int (*target_read_memory) (bfd_vma, bfd_byte *, int)); |
+ int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type)); |
extern bfd *_bfd_elf64_bfd_from_remote_memory |
(bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep, |
- int (*target_read_memory) (bfd_vma, bfd_byte *, int)); |
+ int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type)); |
extern bfd_vma bfd_elf_obj_attr_size (bfd *); |
extern void bfd_elf_set_obj_attr_contents (bfd *, bfd_byte *, bfd_vma); |
@@ -2403,10 +2415,12 @@ extern asection _bfd_elf_large_com_section; |
link, we remove such relocations. Otherwise, we just want the |
section contents zeroed and avoid any special processing. */ |
#define RELOC_AGAINST_DISCARDED_SECTION(info, input_bfd, input_section, \ |
- rel, relend, howto, contents) \ |
+ rel, count, relend, \ |
+ howto, index, contents) \ |
{ \ |
+ int i_; \ |
_bfd_clear_contents (howto, input_bfd, input_section, \ |
- contents + rel->r_offset); \ |
+ contents + rel[index].r_offset); \ |
\ |
if (info->relocatable \ |
&& (input_section->flags & SEC_DEBUGGING)) \ |
@@ -2418,23 +2432,28 @@ extern asection _bfd_elf_large_com_section; |
rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section); \ |
\ |
/* Avoid empty output section. */ \ |
- if (rel_hdr->sh_size > rel_hdr->sh_entsize) \ |
+ if (rel_hdr->sh_size > count * rel_hdr->sh_entsize) \ |
{ \ |
- rel_hdr->sh_size -= rel_hdr->sh_entsize; \ |
+ rel_hdr->sh_size -= count * rel_hdr->sh_entsize; \ |
rel_hdr = _bfd_elf_single_rel_hdr (input_section); \ |
- rel_hdr->sh_size -= rel_hdr->sh_entsize; \ |
+ rel_hdr->sh_size -= count * rel_hdr->sh_entsize; \ |
\ |
- memmove (rel, rel + 1, (relend - rel - 1) * sizeof (*rel)); \ |
+ memmove (rel, rel + count, \ |
+ (relend - rel - count) * sizeof (*rel)); \ |
\ |
- input_section->reloc_count--; \ |
- relend--; \ |
+ input_section->reloc_count -= count; \ |
+ relend -= count; \ |
rel--; \ |
continue; \ |
} \ |
} \ |
\ |
- rel->r_info = 0; \ |
- rel->r_addend = 0; \ |
+ for (i_ = 0; i_ < count; i_++) \ |
+ { \ |
+ rel[i_].r_info = 0; \ |
+ rel[i_].r_addend = 0; \ |
+ } \ |
+ rel += count - 1; \ |
continue; \ |
} |