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>
Tue May 01 16:49:15 2007 +0000 (2007-05-01)
changeset 56 07a6a48962b7
permissions -rw-r--r--
Merge patches sent by Robert P. J. Day <rpjday@mindspring.com>.
Warning: the buildroot folks purposedly removed the skip-comment patch but didn't really said why. Keeping it for the sake of having it in svn just in case (removing it will be easier thant not having it at all).
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