patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Feb 24 11:00:05 2007 +0000 (2007-02-24)
changeset 1 eeea35fbf182
permissions -rw-r--r--
Add the full crosstool-NG sources to the new repository of its own.
You might just say: 'Yeah! crosstool-NG's got its own repo!".
Unfortunately, that's because the previous repo got damaged beyond repair and I had no backup.
That means I'm putting backups in place in the afternoon.
That also means we've lost history... :-(
yann@1
     1
2002-04-20  Jakub Jelinek  <jakub@redhat.com>
yann@1
     2
yann@1
     3
	* elf32-sparc.c (elf32_sparc_relocate_section): Find real output
yann@1
     4
	section with SEC_MERGE.
yann@1
     5
	* elf64-sparc.c (sparc64_elf_relocate_section): Likewise.
yann@1
     6
yann@1
     7
--- binutils/bfd/elf32-sparc.c.jj	Sat Apr 20 22:11:57 2002
yann@1
     8
+++ binutils/bfd/elf32-sparc.c	Sat Apr 20 23:06:33 2002
yann@1
     9
@@ -1144,7 +1144,7 @@ elf32_sparc_relocate_section (output_bfd
yann@1
    10
       struct elf_link_hash_entry *h;
yann@1
    11
       Elf_Internal_Sym *sym;
yann@1
    12
       asection *sec;
yann@1
    13
-      bfd_vma relocation, off;
yann@1
    14
+      bfd_vma relocation, off, orig_addend = 0;
yann@1
    15
       bfd_reloc_status_type r;
yann@1
    16
       boolean is_plt = false;
yann@1
    17
       boolean unresolved_reloc;
yann@1
    18
@@ -1192,6 +1192,7 @@ elf32_sparc_relocate_section (output_bfd
yann@1
    19
 	{
yann@1
    20
 	  sym = local_syms + r_symndx;
yann@1
    21
 	  sec = local_sections[r_symndx];
yann@1
    22
+	  orig_addend = rel->r_addend;
yann@1
    23
 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
yann@1
    24
 	}
yann@1
    25
       else
yann@1
    26
@@ -1527,6 +1528,25 @@ elf32_sparc_relocate_section (output_bfd
yann@1
    27
 			  asection *osec;
yann@1
    28
 
yann@1
    29
 			  osec = sec->output_section;
yann@1
    30
+			  /* FIXME: As soon as making sections zero size
yann@1
    31
+			     is possible, this if can go away.  */
yann@1
    32
+			  if (bfd_is_abs_section (osec)
yann@1
    33
+			      && h == NULL
yann@1
    34
+			      && (sec->flags & SEC_MERGE)
yann@1
    35
+			      && ELF_ST_TYPE (sym->st_info) == STT_SECTION
yann@1
    36
+			      && (elf_section_data (sec)->sec_info_type
yann@1
    37
+				  == ELF_INFO_TYPE_MERGE))
yann@1
    38
+			    {
yann@1
    39
+			      asection *msec;
yann@1
    40
+
yann@1
    41
+			      msec = sec;
yann@1
    42
+			      _bfd_merged_section_offset (output_bfd, &msec,
yann@1
    43
+					elf_section_data (sec)->sec_info,
yann@1
    44
+					sym->st_value + orig_addend,
yann@1
    45
+					(bfd_vma) 0);
yann@1
    46
+			      osec = msec->output_section;
yann@1
    47
+			     }
yann@1
    48
+
yann@1
    49
 			  indx = elf_section_data (osec)->dynindx;
yann@1
    50
 
yann@1
    51
 			  /* FIXME: we really should be able to link non-pic
yann@1
    52
--- binutils/bfd/elf64-sparc.c.jj	Sat Apr 20 22:11:57 2002
yann@1
    53
+++ binutils/bfd/elf64-sparc.c	Sat Apr 20 23:12:18 2002
yann@1
    54
@@ -1939,7 +1939,7 @@ sparc64_elf_relocate_section (output_bfd
yann@1
    55
       struct elf_link_hash_entry *h;
yann@1
    56
       Elf_Internal_Sym *sym;
yann@1
    57
       asection *sec;
yann@1
    58
-      bfd_vma relocation, off;
yann@1
    59
+      bfd_vma relocation, off, orig_addend = 0;
yann@1
    60
       bfd_reloc_status_type r;
yann@1
    61
       boolean is_plt = false;
yann@1
    62
       boolean unresolved_reloc;
yann@1
    63
@@ -1982,6 +1982,7 @@ sparc64_elf_relocate_section (output_bfd
yann@1
    64
 	{
yann@1
    65
 	  sym = local_syms + r_symndx;
yann@1
    66
 	  sec = local_sections[r_symndx];
yann@1
    67
+	  orig_addend = rel->r_addend;
yann@1
    68
 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
yann@1
    69
 	}
yann@1
    70
       else
yann@1
    71
@@ -2211,6 +2212,25 @@ sparc64_elf_relocate_section (output_bfd
yann@1
    72
 			    asection *osec;
yann@1
    73
 
yann@1
    74
 			    osec = sec->output_section;
yann@1
    75
+			    /* FIXME: As soon as making sections zero size
yann@1
    76
+			       is possible, this if can go away.  */
yann@1
    77
+			    if (bfd_is_abs_section (osec)
yann@1
    78
+				&& h == NULL
yann@1
    79
+				&& (sec->flags & SEC_MERGE)
yann@1
    80
+				&& ELF_ST_TYPE (sym->st_info) == STT_SECTION
yann@1
    81
+				&& (elf_section_data (sec)->sec_info_type
yann@1
    82
+				    == ELF_INFO_TYPE_MERGE))
yann@1
    83
+			      {
yann@1
    84
+				asection *msec;
yann@1
    85
+
yann@1
    86
+				msec = sec;
yann@1
    87
+				_bfd_merged_section_offset (output_bfd, &msec,
yann@1
    88
+					elf_section_data (sec)->sec_info,
yann@1
    89
+					sym->st_value + orig_addend,
yann@1
    90
+					(bfd_vma) 0);
yann@1
    91
+				osec = msec->output_section;
yann@1
    92
+			      }
yann@1
    93
+
yann@1
    94
 			    indx = elf_section_data (osec)->dynindx;
yann@1
    95
 
yann@1
    96
 			    /* FIXME: we really should be able to link non-pic