diff options
author | Richard Purdie <richard@openedhand.com> | 2007-09-04 16:01:58 +0000 |
---|---|---|
committer | Richard Purdie <richard@openedhand.com> | 2007-09-04 16:01:58 +0000 |
commit | 7d4aa7f04e661d0546569f2f5a581e44e447de84 (patch) | |
tree | f268a340e4fcb69d56c93e668269bd5ce2822811 /meta/packages/prelink/prelink-20061027 | |
parent | 5758f9ccce20d3e1e5519cf689d39511a953600b (diff) | |
download | poky-7d4aa7f04e661d0546569f2f5a581e44e447de84.tar.gz |
prelink: Fix R_ARM_TLS_DTPMOD32 problems
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@2688 311d38ba-8fff-0310-9ca6-ca027cbcb966
Diffstat (limited to 'meta/packages/prelink/prelink-20061027')
-rw-r--r-- | meta/packages/prelink/prelink-20061027/arm_eabi.patch | 75 |
1 files changed, 41 insertions, 34 deletions
diff --git a/meta/packages/prelink/prelink-20061027/arm_eabi.patch b/meta/packages/prelink/prelink-20061027/arm_eabi.patch index b138b5a6d5..dbce9d2895 100644 --- a/meta/packages/prelink/prelink-20061027/arm_eabi.patch +++ b/meta/packages/prelink/prelink-20061027/arm_eabi.patch | |||
@@ -1,20 +1,22 @@ | |||
1 | --- | 1 | --- |
2 | src/arch-arm.c | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- | 2 | src/arch-arm.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- |
3 | 1 file changed, 165 insertions(+), 5 deletions(-) | 3 | 1 file changed, 172 insertions(+), 5 deletions(-) |
4 | 4 | ||
5 | Index: prelink-0.0.20061027/src/arch-arm.c | 5 | Index: prelink-0.0.20061027/src/arch-arm.c |
6 | =================================================================== | 6 | =================================================================== |
7 | --- prelink-0.0.20061027.orig/src/arch-arm.c 2006-08-13 16:18:17.000000000 +0100 | 7 | --- prelink-0.0.20061027.orig/src/arch-arm.c 2006-08-13 16:18:17.000000000 +0100 |
8 | +++ prelink-0.0.20061027/src/arch-arm.c 2007-01-14 00:05:33.000000000 +0000 | 8 | +++ prelink-0.0.20061027/src/arch-arm.c 2007-09-04 12:29:06.000000000 +0100 |
9 | @@ -145,6 +145,24 @@ arm_prelink_rel (struct prelink_info *in | 9 | @@ -145,6 +145,26 @@ arm_prelink_rel (struct prelink_info *in |
10 | error (0, 0, "%s: R_ARM_PC24 relocs with non-zero addend should not be present in prelinked REL sections", | 10 | error (0, 0, "%s: R_ARM_PC24 relocs with non-zero addend should not be present in prelinked REL sections", |
11 | dso->filename); | 11 | dso->filename); |
12 | return 1; | 12 | return 1; |
13 | + case R_ARM_TLS_DTPOFF32: | 13 | + /* DTPOFF32, DTPMOD32 and TPOFF32 is impossible to predict unless prelink |
14 | + write_le32 (dso, rel->r_offset, value); | 14 | + sets the rules. Also for DTPOFF32/TPOFF32 there is REL->RELA problem. */ |
15 | + case R_ARM_TLS_DTPOFF32: | ||
16 | + if (dso->ehdr.e_type == ET_EXEC) | ||
17 | + error (0, 0, "%s: R_ARM_TLS_DTPOFF32 relocs should not be present in prelinked ET_EXEC REL sections", | ||
18 | + dso->filename); | ||
15 | + break; | 19 | + break; |
16 | + /* DTPMOD32 and TPOFF32 is impossible to predict unless prelink | ||
17 | + sets the rules. Also for TPOFF{32,} there is REL->RELA problem. */ | ||
18 | + case R_ARM_TLS_DTPMOD32: | 20 | + case R_ARM_TLS_DTPMOD32: |
19 | + if (dso->ehdr.e_type == ET_EXEC) | 21 | + if (dso->ehdr.e_type == ET_EXEC) |
20 | + { | 22 | + { |
@@ -31,14 +33,15 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
31 | case R_ARM_COPY: | 33 | case R_ARM_COPY: |
32 | if (dso->ehdr.e_type == ET_EXEC) | 34 | if (dso->ehdr.e_type == ET_EXEC) |
33 | /* COPY relocs are handled specially in generic code. */ | 35 | /* COPY relocs are handled specially in generic code. */ |
34 | @@ -195,6 +213,24 @@ arm_prelink_rela (struct prelink_info *i | 36 | @@ -195,6 +215,25 @@ arm_prelink_rela (struct prelink_info *i |
35 | write_le32 (dso, rela->r_offset, | 37 | write_le32 (dso, rela->r_offset, |
36 | (read_ule32 (dso, rela->r_offset) & 0xff000000) | val); | 38 | (read_ule32 (dso, rela->r_offset) & 0xff000000) | val); |
37 | break; | 39 | break; |
38 | + case R_ARM_TLS_DTPOFF32: | 40 | + case R_ARM_TLS_DTPOFF32: |
39 | + write_le32 (dso, rela->r_offset, value + rela->r_addend); | 41 | + if (dso->ehdr.e_type == ET_EXEC) |
42 | + write_le32 (dso, rela->r_offset, value + rela->r_addend); | ||
40 | + break; | 43 | + break; |
41 | + /* DTPMOD32 and TPOFF32 is impossible to predict unless prelink | 44 | + /* DTPMOD32 and TPOFF32 are impossible to predict unless prelink |
42 | + sets the rules. */ | 45 | + sets the rules. */ |
43 | + case R_ARM_TLS_DTPMOD32: | 46 | + case R_ARM_TLS_DTPMOD32: |
44 | + if (dso->ehdr.e_type == ET_EXEC) | 47 | + if (dso->ehdr.e_type == ET_EXEC) |
@@ -56,7 +59,7 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
56 | case R_ARM_COPY: | 59 | case R_ARM_COPY: |
57 | if (dso->ehdr.e_type == ET_EXEC) | 60 | if (dso->ehdr.e_type == ET_EXEC) |
58 | /* COPY relocs are handled specially in generic code. */ | 61 | /* COPY relocs are handled specially in generic code. */ |
59 | @@ -315,6 +351,7 @@ arm_prelink_conflict_rel (DSO *dso, stru | 62 | @@ -315,6 +354,7 @@ arm_prelink_conflict_rel (DSO *dso, stru |
60 | { | 63 | { |
61 | GElf_Addr value; | 64 | GElf_Addr value; |
62 | struct prelink_conflict *conflict; | 65 | struct prelink_conflict *conflict; |
@@ -64,7 +67,7 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
64 | GElf_Rela *ret; | 67 | GElf_Rela *ret; |
65 | 68 | ||
66 | if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE | 69 | if (GELF_R_TYPE (rel->r_info) == R_ARM_RELATIVE |
67 | @@ -324,8 +361,31 @@ arm_prelink_conflict_rel (DSO *dso, stru | 70 | @@ -324,8 +364,32 @@ arm_prelink_conflict_rel (DSO *dso, stru |
68 | conflict = prelink_conflict (info, GELF_R_SYM (rel->r_info), | 71 | conflict = prelink_conflict (info, GELF_R_SYM (rel->r_info), |
69 | GELF_R_TYPE (rel->r_info)); | 72 | GELF_R_TYPE (rel->r_info)); |
70 | if (conflict == NULL) | 73 | if (conflict == NULL) |
@@ -75,8 +78,9 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
75 | + return 0; | 78 | + return 0; |
76 | + switch (GELF_R_TYPE (rel->r_info)) | 79 | + switch (GELF_R_TYPE (rel->r_info)) |
77 | + { | 80 | + { |
78 | + /* Even local DTPMOD and TPOFF relocs need conflicts. */ | 81 | + /* Even local DTPMOD and {D,}TPOFF relocs need conflicts. */ |
79 | + case R_ARM_TLS_DTPMOD32: | 82 | + case R_ARM_TLS_DTPMOD32: |
83 | + case R_ARM_TLS_DTPOFF32: | ||
80 | + case R_ARM_TLS_TPOFF32: | 84 | + case R_ARM_TLS_TPOFF32: |
81 | + break; | 85 | + break; |
82 | + default: | 86 | + default: |
@@ -98,7 +102,7 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
98 | ret = prelink_conflict_add_rela (info); | 102 | ret = prelink_conflict_add_rela (info); |
99 | if (ret == NULL) | 103 | if (ret == NULL) |
100 | return 1; | 104 | return 1; |
101 | @@ -342,6 +402,33 @@ arm_prelink_conflict_rel (DSO *dso, stru | 105 | @@ -342,6 +406,33 @@ arm_prelink_conflict_rel (DSO *dso, stru |
102 | error (0, 0, "%s: R_ARM_%s relocs should not be present in prelinked REL sections", | 106 | error (0, 0, "%s: R_ARM_%s relocs should not be present in prelinked REL sections", |
103 | dso->filename, GELF_R_TYPE (rel->r_info) == R_ARM_ABS32 ? "ABS32" : "PC24"); | 107 | dso->filename, GELF_R_TYPE (rel->r_info) == R_ARM_ABS32 ? "ABS32" : "PC24"); |
104 | return 1; | 108 | return 1; |
@@ -121,7 +125,7 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
121 | + ret->r_addend = tls->modid; | 125 | + ret->r_addend = tls->modid; |
122 | + break; | 126 | + break; |
123 | + case R_ARM_TLS_DTPOFF32: | 127 | + case R_ARM_TLS_DTPOFF32: |
124 | + ret->r_addend = value; | 128 | + ret->r_addend = value + read_ule32 (dso, rel->r_offset); |
125 | + break; | 129 | + break; |
126 | + case R_ARM_TLS_TPOFF32: | 130 | + case R_ARM_TLS_TPOFF32: |
127 | + ret->r_addend = value + read_ule32 (dso, rel->r_offset) | 131 | + ret->r_addend = value + read_ule32 (dso, rel->r_offset) |
@@ -132,7 +136,7 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
132 | case R_ARM_COPY: | 136 | case R_ARM_COPY: |
133 | error (0, 0, "R_ARM_COPY should not be present in shared libraries"); | 137 | error (0, 0, "R_ARM_COPY should not be present in shared libraries"); |
134 | return 1; | 138 | return 1; |
135 | @@ -359,6 +446,7 @@ arm_prelink_conflict_rela (DSO *dso, str | 139 | @@ -359,6 +450,7 @@ arm_prelink_conflict_rela (DSO *dso, str |
136 | { | 140 | { |
137 | GElf_Addr value; | 141 | GElf_Addr value; |
138 | struct prelink_conflict *conflict; | 142 | struct prelink_conflict *conflict; |
@@ -140,7 +144,7 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
140 | GElf_Rela *ret; | 144 | GElf_Rela *ret; |
141 | Elf32_Sword val; | 145 | Elf32_Sword val; |
142 | 146 | ||
143 | @@ -369,8 +457,31 @@ arm_prelink_conflict_rela (DSO *dso, str | 147 | @@ -369,8 +461,32 @@ arm_prelink_conflict_rela (DSO *dso, str |
144 | conflict = prelink_conflict (info, GELF_R_SYM (rela->r_info), | 148 | conflict = prelink_conflict (info, GELF_R_SYM (rela->r_info), |
145 | GELF_R_TYPE (rela->r_info)); | 149 | GELF_R_TYPE (rela->r_info)); |
146 | if (conflict == NULL) | 150 | if (conflict == NULL) |
@@ -151,8 +155,9 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
151 | + return 0; | 155 | + return 0; |
152 | + switch (GELF_R_TYPE (rela->r_info)) | 156 | + switch (GELF_R_TYPE (rela->r_info)) |
153 | + { | 157 | + { |
154 | + /* Even local DTPMOD and TPOFF relocs need conflicts. */ | 158 | + /* Even local DTPMOD and {D,}TPOFF relocs need conflicts. */ |
155 | + case R_ARM_TLS_DTPMOD32: | 159 | + case R_ARM_TLS_DTPMOD32: |
160 | + case R_ARM_TLS_DTPOFF32: | ||
156 | + case R_ARM_TLS_TPOFF32: | 161 | + case R_ARM_TLS_TPOFF32: |
157 | + break; | 162 | + break; |
158 | + default: | 163 | + default: |
@@ -174,7 +179,7 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
174 | ret = prelink_conflict_add_rela (info); | 179 | ret = prelink_conflict_add_rela (info); |
175 | if (ret == NULL) | 180 | if (ret == NULL) |
176 | return 1; | 181 | return 1; |
177 | @@ -398,6 +509,32 @@ arm_prelink_conflict_rela (DSO *dso, str | 182 | @@ -398,6 +514,32 @@ arm_prelink_conflict_rela (DSO *dso, str |
178 | case R_ARM_COPY: | 183 | case R_ARM_COPY: |
179 | error (0, 0, "R_ARM_COPY should not be present in shared libraries"); | 184 | error (0, 0, "R_ARM_COPY should not be present in shared libraries"); |
180 | return 1; | 185 | return 1; |
@@ -197,7 +202,7 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
197 | + ret->r_addend = tls->modid; | 202 | + ret->r_addend = tls->modid; |
198 | + break; | 203 | + break; |
199 | + case R_ARM_TLS_DTPOFF32: | 204 | + case R_ARM_TLS_DTPOFF32: |
200 | + ret->r_addend += value; | 205 | + ret->r_addend = value + rela->r_addend; |
201 | + break; | 206 | + break; |
202 | + case R_ARM_TLS_TPOFF32: | 207 | + case R_ARM_TLS_TPOFF32: |
203 | + ret->r_addend = value + rela->r_addend + tls->offset; | 208 | + ret->r_addend = value + rela->r_addend + tls->offset; |
@@ -207,68 +212,70 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
207 | default: | 212 | default: |
208 | error (0, 0, "%s: Unknown arm relocation type %d", dso->filename, | 213 | error (0, 0, "%s: Unknown arm relocation type %d", dso->filename, |
209 | (int) GELF_R_TYPE (rela->r_info)); | 214 | (int) GELF_R_TYPE (rela->r_info)); |
210 | @@ -418,6 +555,7 @@ arm_rel_to_rela (DSO *dso, GElf_Rel *rel | 215 | @@ -418,6 +560,8 @@ arm_rel_to_rela (DSO *dso, GElf_Rel *rel |
211 | abort (); | 216 | abort (); |
212 | case R_ARM_RELATIVE: | 217 | case R_ARM_RELATIVE: |
213 | case R_ARM_ABS32: | 218 | case R_ARM_ABS32: |
214 | + case R_ARM_TLS_TPOFF32: | 219 | + case R_ARM_TLS_TPOFF32: |
220 | + case R_ARM_TLS_DTPOFF32: | ||
215 | rela->r_addend = (Elf32_Sword) read_ule32 (dso, rel->r_offset); | 221 | rela->r_addend = (Elf32_Sword) read_ule32 (dso, rel->r_offset); |
216 | break; | 222 | break; |
217 | case R_ARM_PC24: | 223 | case R_ARM_PC24: |
218 | @@ -426,6 +564,8 @@ arm_rel_to_rela (DSO *dso, GElf_Rel *rel | 224 | @@ -426,6 +570,7 @@ arm_rel_to_rela (DSO *dso, GElf_Rel *rel |
219 | break; | 225 | break; |
220 | case R_ARM_COPY: | 226 | case R_ARM_COPY: |
221 | case R_ARM_GLOB_DAT: | 227 | case R_ARM_GLOB_DAT: |
222 | + case R_ARM_TLS_DTPOFF32: | ||
223 | + case R_ARM_TLS_DTPMOD32: | 228 | + case R_ARM_TLS_DTPMOD32: |
224 | rela->r_addend = 0; | 229 | rela->r_addend = 0; |
225 | break; | 230 | break; |
226 | } | 231 | } |
227 | @@ -445,6 +585,7 @@ arm_rela_to_rel (DSO *dso, GElf_Rela *re | 232 | @@ -445,6 +590,8 @@ arm_rela_to_rel (DSO *dso, GElf_Rela *re |
228 | abort (); | 233 | abort (); |
229 | case R_ARM_RELATIVE: | 234 | case R_ARM_RELATIVE: |
230 | case R_ARM_ABS32: | 235 | case R_ARM_ABS32: |
231 | + case R_ARM_TLS_TPOFF32: | 236 | + case R_ARM_TLS_TPOFF32: |
237 | + case R_ARM_TLS_DTPOFF32: | ||
232 | write_le32 (dso, rela->r_offset, rela->r_addend); | 238 | write_le32 (dso, rela->r_offset, rela->r_addend); |
233 | break; | 239 | break; |
234 | case R_ARM_PC24: | 240 | case R_ARM_PC24: |
235 | @@ -453,6 +594,8 @@ arm_rela_to_rel (DSO *dso, GElf_Rela *re | 241 | @@ -453,6 +600,7 @@ arm_rela_to_rel (DSO *dso, GElf_Rela *re |
236 | | ((rela->r_addend >> 2) & 0xffffff)); | 242 | | ((rela->r_addend >> 2) & 0xffffff)); |
237 | break; | 243 | break; |
238 | case R_ARM_GLOB_DAT: | 244 | case R_ARM_GLOB_DAT: |
239 | + case R_ARM_TLS_DTPMOD32: | 245 | + case R_ARM_TLS_DTPMOD32: |
240 | + case R_ARM_TLS_DTPOFF32: | ||
241 | write_le32 (dso, rela->r_offset, 0); | 246 | write_le32 (dso, rela->r_offset, 0); |
242 | break; | 247 | break; |
243 | } | 248 | } |
244 | @@ -488,6 +631,13 @@ arm_need_rel_to_rela (DSO *dso, int firs | 249 | @@ -488,6 +636,15 @@ arm_need_rel_to_rela (DSO *dso, int firs |
245 | /* FALLTHROUGH */ | 250 | /* FALLTHROUGH */ |
246 | case R_ARM_PC24: | 251 | case R_ARM_PC24: |
247 | return 1; | 252 | return 1; |
253 | + case R_ARM_TLS_DTPOFF32: | ||
248 | + case R_ARM_TLS_TPOFF32: | 254 | + case R_ARM_TLS_TPOFF32: |
249 | + /* In shared libraries TPOFF is changed always into | 255 | + /* In shared libraries {D,}TPOFF32 is changed always into |
250 | + conflicts, for executables we need to preserve | 256 | + conflicts, for executables we need to preserve |
251 | + original addend. */ | 257 | + original addend. */ |
252 | + if (dso->ehdr.e_type == ET_EXEC) | 258 | + if (dso->ehdr.e_type == ET_EXEC) { |
253 | + return 1; | 259 | + return 1; |
260 | + } | ||
254 | + break; | 261 | + break; |
255 | } | 262 | } |
256 | } | 263 | } |
257 | } | 264 | } |
258 | @@ -612,6 +762,12 @@ arm_undo_prelink_rel (DSO *dso, GElf_Rel | 265 | @@ -612,6 +769,12 @@ arm_undo_prelink_rel (DSO *dso, GElf_Rel |
259 | return 0; | 266 | return 0; |
260 | error (0, 0, "%s: R_ARM_COPY reloc in shared library?", dso->filename); | 267 | error (0, 0, "%s: R_ARM_COPY reloc in shared library?", dso->filename); |
261 | return 1; | 268 | return 1; |
262 | + case R_ARM_TLS_DTPMOD32: | 269 | + case R_ARM_TLS_DTPMOD32: |
263 | + case R_ARM_TLS_DTPOFF32: | ||
264 | + write_le32 (dso, rel->r_offset, 0); | 270 | + write_le32 (dso, rel->r_offset, 0); |
265 | + break; | 271 | + break; |
272 | + case R_ARM_TLS_DTPOFF32: | ||
266 | + case R_ARM_TLS_TPOFF32: | 273 | + case R_ARM_TLS_TPOFF32: |
267 | + break; | 274 | + break; |
268 | default: | 275 | default: |
269 | error (0, 0, "%s: Unknown arm relocation type %d", dso->filename, | 276 | error (0, 0, "%s: Unknown arm relocation type %d", dso->filename, |
270 | (int) GELF_R_TYPE (rel->r_info)); | 277 | (int) GELF_R_TYPE (rel->r_info)); |
271 | @@ -634,6 +790,10 @@ arm_reloc_class (int reloc_type) | 278 | @@ -634,6 +797,10 @@ arm_reloc_class (int reloc_type) |
272 | { | 279 | { |
273 | case R_ARM_COPY: return RTYPE_CLASS_COPY; | 280 | case R_ARM_COPY: return RTYPE_CLASS_COPY; |
274 | case R_ARM_JUMP_SLOT: return RTYPE_CLASS_PLT; | 281 | case R_ARM_JUMP_SLOT: return RTYPE_CLASS_PLT; |
@@ -279,7 +286,7 @@ Index: prelink-0.0.20061027/src/arch-arm.c | |||
279 | default: return RTYPE_CLASS_VALID; | 286 | default: return RTYPE_CLASS_VALID; |
280 | } | 287 | } |
281 | } | 288 | } |
282 | @@ -646,7 +806,7 @@ PL_ARCH = { | 289 | @@ -646,7 +813,7 @@ PL_ARCH = { |
283 | .R_JMP_SLOT = R_ARM_JUMP_SLOT, | 290 | .R_JMP_SLOT = R_ARM_JUMP_SLOT, |
284 | .R_COPY = R_ARM_COPY, | 291 | .R_COPY = R_ARM_COPY, |
285 | .R_RELATIVE = R_ARM_RELATIVE, | 292 | .R_RELATIVE = R_ARM_RELATIVE, |