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
|