From 125cd9927779417b946c49ce4039d2dd014637fc Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Mon, 13 Nov 2006 20:39:21 +0000 Subject: [PATCH] bfd/ * bfd-in.h (bfd_elf32_arm_process_before_allocation): Update prototype. (bfd_elf32_arm_set_byteswap_code): New prototype. * bfd-in2.h: Regenerate. * elf32-arm.c (bfd_elf32_arm_process_before_allocation): Don't take byteswap_code as an argument. Revert 2006-11-01 change. (bfd_elf32_arm_set_byteswap_code): New. (elf32_arm_size_dynamic_sections): Call bfd_elf32_arm_process_before_allocation. ld/ * emultempl/armelf.em (arm_elf_before_allocation): Only call bfd_elf32_arm_process_before_allocation if no dynamic sections. --- bfd/ChangeLog | 12 ++++++++++++ bfd/bfd-in.h | 4 +++- bfd/bfd-in2.h | 4 +++- bfd/elf32-arm.c | 39 ++++++++++++++++++++++----------------- ld/ChangeLog | 5 +++++ ld/emultempl/armelf.em | 25 +++++++++++++------------ 6 files changed, 58 insertions(+), 31 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 340c4f3c4..3463f5718 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2006-11-13 Daniel Jacobowitz + + * bfd-in.h (bfd_elf32_arm_process_before_allocation): Update + prototype. + (bfd_elf32_arm_set_byteswap_code): New prototype. + * bfd-in2.h: Regenerate. + * elf32-arm.c (bfd_elf32_arm_process_before_allocation): Don't take + byteswap_code as an argument. Revert 2006-11-01 change. + (bfd_elf32_arm_set_byteswap_code): New. + (elf32_arm_size_dynamic_sections): Call + bfd_elf32_arm_process_before_allocation. + 2006-11-10 Thiemo Seufer * config.bfd (mips*el-sde-elf*, mips*-sde-elf*): Drop ECOFF support diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index ed41851ba..e671ee7d2 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -868,7 +868,7 @@ extern bfd_boolean bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info *); extern bfd_boolean bfd_elf32_arm_process_before_allocation - (bfd *, struct bfd_link_info *, int); + (bfd *, struct bfd_link_info *); void bfd_elf32_arm_set_target_relocs (struct bfd_link_info *, int, char *, int, int); @@ -887,6 +887,8 @@ extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd extern bfd_boolean bfd_is_arm_special_symbol_name (const char * name, int type); +extern void bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *, int); + /* ARM Note section processing. */ extern bfd_boolean bfd_arm_merge_machines (bfd *, bfd *); diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index e4c92d7e3..8f2af8bc4 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -875,7 +875,7 @@ extern bfd_boolean bfd_elf32_arm_allocate_interworking_sections (struct bfd_link_info *); extern bfd_boolean bfd_elf32_arm_process_before_allocation - (bfd *, struct bfd_link_info *, int); + (bfd *, struct bfd_link_info *); void bfd_elf32_arm_set_target_relocs (struct bfd_link_info *, int, char *, int, int); @@ -894,6 +894,8 @@ extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd extern bfd_boolean bfd_is_arm_special_symbol_name (const char * name, int type); +extern void bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *, int); + /* ARM Note section processing. */ extern bfd_boolean bfd_arm_merge_machines (bfd *, bfd *); diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index b2f4061c9..dc784db7b 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -2826,8 +2826,7 @@ static void check_use_blx(struct elf32_arm_link_hash_table *globals) bfd_boolean bfd_elf32_arm_process_before_allocation (bfd *abfd, - struct bfd_link_info *link_info, - int byteswap_code) + struct bfd_link_info *link_info) { Elf_Internal_Shdr *symtab_hdr; Elf_Internal_Rela *internal_relocs = NULL; @@ -2850,13 +2849,12 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd, BFD_ASSERT (globals != NULL); BFD_ASSERT (globals->bfd_of_glue_owner != NULL); - if (byteswap_code && !bfd_big_endian (abfd)) + if (globals->byteswap_code && !bfd_big_endian (abfd)) { _bfd_error_handler (_("%B: BE8 images only valid in big-endian mode."), abfd); return FALSE; } - globals->byteswap_code = byteswap_code; /* Rummage around all the relocs and map the glue vectors. */ sec = abfd->sections; @@ -2932,19 +2930,9 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd, if (h == NULL) continue; - /* If the call will go through a PLT entry then we do not - need glue. We have to do a fairly complicated check - here, since we don't determine this finally (by setting - plt.offset) until later; this test should be kept in sync - with elf32_arm_adjust_dynamic_symbol. */ - if (globals->splt != NULL - && h->plt.refcount > 0 - && (h->type == STT_FUNC - || h->type == STT_ARM_TFUNC - || h->needs_plt) - && !SYMBOL_CALLS_LOCAL (link_info, h) - && !(ELF_ST_VISIBILITY (h->other) != STV_DEFAULT - && h->root.type == bfd_link_hash_undefweak)) + /* If the call will go through a PLT entry then we do not need + glue. */ + if (globals->splt != NULL && h->plt.offset != (bfd_vma) -1) continue; switch (r_type) @@ -7917,6 +7905,16 @@ elf32_arm_readonly_dynrelocs (struct elf_link_hash_entry *h, PTR inf) return TRUE; } +void +bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info, + int byteswap_code) +{ + struct elf32_arm_link_hash_table *globals; + + globals = elf32_arm_hash_table (info); + globals->byteswap_code = byteswap_code; +} + /* Set the sizes of the dynamic sections. */ static bfd_boolean @@ -8032,6 +8030,13 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, sym dynamic relocs. */ elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info); + /* Here we rummage through the found bfds to collect glue information. */ + for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) + if (!bfd_elf32_arm_process_before_allocation (ibfd, info)) + /* xgettext:c-format */ + _bfd_error_handler (_("Errors encountered processing file %s"), + ibfd->filename); + /* The check_relocs and adjust_dynamic_symbol entry points have determined the sizes of the various dynamic sections. Allocate memory for them. */ diff --git a/ld/ChangeLog b/ld/ChangeLog index 7f838f627..4abbfbc72 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2006-11-13 Daniel Jacobowitz + + * emultempl/armelf.em (arm_elf_before_allocation): Only call + bfd_elf32_arm_process_before_allocation if no dynamic sections. + 2006-11-08 Alan Modra * emultempl/elf32.em (gld*_before_allocation): Adjust output section diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em index f78b4957e..d52d387f9 100644 --- a/ld/emultempl/armelf.em +++ b/ld/emultempl/armelf.em @@ -121,21 +121,22 @@ arm_elf_before_allocation (void) if (bfd_for_interwork != NULL) bfd_elf32_arm_get_bfd_for_interworking (bfd_for_interwork, &link_info); } - /* We should be able to set the size of the interworking stub section. */ - /* Here we rummage through the found bfds to collect glue information. */ - /* FIXME: should this be based on a command line option? krk@cygnus.com */ - { - LANG_FOR_EACH_INPUT_STATEMENT (is) - { - if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, & link_info, - byteswap_code)) - { + bfd_elf32_arm_set_byteswap_code (&link_info, byteswap_code); + + /* We should be able to set the size of the interworking stub section. We + can't do it until later if we have dynamic sections, though. */ + if (! elf_hash_table (&link_info)->dynamic_sections_created) + { + /* Here we rummage through the found bfds to collect glue information. */ + LANG_FOR_EACH_INPUT_STATEMENT (is) + { + if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, + &link_info)) /* xgettext:c-format */ einfo (_("Errors encountered processing file %s"), is->filename); - } - } - } + } + } /* Call the standard elf routine. */ gld${EMULATION_NAME}_before_allocation (); -- 2.11.4.GIT