OSDN Git Service

2000-02-27 Jakub Jelinek <jakub@redhat.com>
authorIan Lance Taylor <ian@airs.com>
Mon, 28 Feb 2000 03:50:32 +0000 (03:50 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 28 Feb 2000 03:50:32 +0000 (03:50 +0000)
* 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.

bfd/ChangeLog
bfd/elf32-sparc.c
bfd/elf64-sparc.c

index 4968183..c175515 100644 (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
index bf34782..f39fc1b 100644 (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)
index 5ea95e9..4420cbc 100644 (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;
     }
 }
 \f
@@ -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)