2000-02-27 Jakub Jelinek <jakub@redhat.com>

* elf32-sparc.c (elf32_sparc_merge_private_bfd_data): Don't bump
	architecture if the object causing the bump is dynamic.
	* elf64-sparc.c (sparc64_elf_merge_private_bfd_data): Likewise,
	and also don't it for memory ordering.
	(sparc64_elf_write_relocs): Take src_rela out of the loop.
This commit is contained in:
Ian Lance Taylor 2000-02-28 03:50:32 +00:00
parent 67d83c76c5
commit 37fb6db111
3 changed files with 54 additions and 26 deletions

View File

@ -1,3 +1,11 @@
2000-02-27 Jakub Jelinek <jakub@redhat.com>
* elf32-sparc.c (elf32_sparc_merge_private_bfd_data): Don't bump
architecture if the object causing the bump is dynamic.
* elf64-sparc.c (sparc64_elf_merge_private_bfd_data): Likewise,
and also don't it for memory ordering.
(sparc64_elf_write_relocs): Take src_rela out of the loop.
2000-02-27 Ian Lance Taylor <ian@zembu.com>
* dwarf2.c (read_abbrevs): Use _raw_size directly rather than

View File

@ -1,5 +1,6 @@
/* SPARC-specific support for 32-bit ELF
Copyright (C) 1993, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
Copyright (C) 1993, 94, 95, 96, 97, 98, 99, 2000
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -1871,8 +1872,11 @@ elf32_sparc_merge_private_bfd_data (ibfd, obfd)
(_("%s: compiled for a 64 bit system and target is 32 bit"),
bfd_get_filename (ibfd));
}
else if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
else if ((ibfd->flags & DYNAMIC) == 0)
{
if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
}
#endif
if (((elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA)

View File

@ -1,5 +1,6 @@
/* SPARC-specific support for 64-bit ELF
Copyright (C) 1993, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
Copyright (C) 1993, 95, 96, 97, 98, 99, 2000
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -474,7 +475,7 @@ sparc64_elf_write_relocs (abfd, sec, data)
{
boolean *failedp = (boolean *) data;
Elf_Internal_Shdr *rela_hdr;
Elf64_External_Rela *outbound_relocas;
Elf64_External_Rela *outbound_relocas, *src_rela;
unsigned int idx, count;
asymbol *last_sym = 0;
int last_sym_idx = 0;
@ -534,17 +535,16 @@ sparc64_elf_write_relocs (abfd, sec, data)
/* orelocation has the data, reloc_count has the count... */
outbound_relocas = (Elf64_External_Rela *) rela_hdr->contents;
src_rela = outbound_relocas;
for (idx = 0; idx < sec->reloc_count; idx++)
{
Elf_Internal_Rela dst_rela;
Elf64_External_Rela *src_rela;
arelent *ptr;
asymbol *sym;
int n;
ptr = sec->orelocation[idx];
src_rela = outbound_relocas + idx;
/* The address of an ELF reloc is section relative for an object
file, and absolute for an executable file or shared library.
@ -602,6 +602,7 @@ sparc64_elf_write_relocs (abfd, sec, data)
dst_rela.r_addend = ptr->addend;
bfd_elf64_swap_reloca_out (abfd, &dst_rela, src_rela);
++src_rela;
}
}
@ -2799,25 +2800,40 @@ sparc64_elf_merge_private_bfd_data (ibfd, obfd)
{
error = false;
old_flags |= (new_flags & (EF_SPARC_SUN_US1|EF_SPARC_HAL_R1));
new_flags |= (old_flags & (EF_SPARC_SUN_US1|EF_SPARC_HAL_R1));
if ((old_flags & (EF_SPARC_SUN_US1|EF_SPARC_HAL_R1)) ==
(EF_SPARC_SUN_US1|EF_SPARC_HAL_R1))
{
error = true;
(*_bfd_error_handler)
(_("%s: linking UltraSPARC specific with HAL specific code"),
bfd_get_filename (ibfd));
}
/* Choose the most restrictive memory ordering */
old_mm = (old_flags & EF_SPARCV9_MM);
new_mm = (new_flags & EF_SPARCV9_MM);
old_flags &= ~EF_SPARCV9_MM;
new_flags &= ~EF_SPARCV9_MM;
if (new_mm < old_mm) old_mm = new_mm;
old_flags |= old_mm;
new_flags |= old_mm;
if ((ibfd->flags & DYNAMIC) != 0)
{
/* We don't want dynamic objects memory ordering and
architecture to have any role. That's what dynamic linker
should do. */
old_flags &= ~(EF_SPARCV9_MM | EF_SPARC_SUN_US1 | EF_SPARC_HAL_R1);
old_flags |= (new_flags
& (EF_SPARCV9_MM
| EF_SPARC_SUN_US1
| EF_SPARC_HAL_R1));
}
else
{
/* Choose the highest architecture requirements. */
old_flags |= (new_flags & (EF_SPARC_SUN_US1 | EF_SPARC_HAL_R1));
new_flags |= (old_flags & (EF_SPARC_SUN_US1 | EF_SPARC_HAL_R1));
if ((old_flags & (EF_SPARC_SUN_US1 | EF_SPARC_HAL_R1))
== (EF_SPARC_SUN_US1 | EF_SPARC_HAL_R1))
{
error = true;
(*_bfd_error_handler)
(_("%s: linking UltraSPARC specific with HAL specific code"),
bfd_get_filename (ibfd));
}
/* Choose the most restrictive memory ordering. */
old_mm = (old_flags & EF_SPARCV9_MM);
new_mm = (new_flags & EF_SPARCV9_MM);
old_flags &= ~EF_SPARCV9_MM;
new_flags &= ~EF_SPARCV9_MM;
if (new_mm < old_mm)
old_mm = new_mm;
old_flags |= old_mm;
new_flags |= old_mm;
}
/* Warn about any other mismatches */
if (new_flags != old_flags)