mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-21 15:33:33 +08:00
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.
This commit is contained in:
parent
1bc1fa8c87
commit
d504ffc851
@ -1,3 +1,15 @@
|
||||
2006-11-13 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* 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 <ths@mips.com>
|
||||
|
||||
* config.bfd (mips*el-sde-elf*, mips*-sde-elf*): Drop ECOFF support
|
||||
|
@ -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 *);
|
||||
|
@ -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 *);
|
||||
|
@ -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. */
|
||||
|
@ -1,3 +1,8 @@
|
||||
2006-11-13 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* emultempl/armelf.em (arm_elf_before_allocation): Only call
|
||||
bfd_elf32_arm_process_before_allocation if no dynamic sections.
|
||||
|
||||
2006-11-08 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* emultempl/elf32.em (gld*_before_allocation): Adjust output section
|
||||
|
@ -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 ();
|
||||
|
Loading…
Reference in New Issue
Block a user