]> git.pld-linux.org Git - packages/glibc.git/blame - glibc-sparc64-dl-machine.patch
- added dirs for dz,km,mg messages
[packages/glibc.git] / glibc-sparc64-dl-machine.patch
CommitLineData
f619ebc0
JB
1--- glibc-2.3.6/sysdeps/sparc/sparc64/dl-machine.h.orig 2005-12-27 01:19:34.023832576 +0100
2+++ glibc-2.3.6/sysdeps/sparc/sparc64/dl-machine.h 2005-12-27 01:19:26.440985344 +0100
3@@ -18,6 +18,9 @@
4 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
5 02111-1307 USA. */
6
7+#ifndef dl_machine_h
8+#define dl_machine_h
9+
10 #define ELF_MACHINE_NAME "sparc64"
bb4ca147 11
f619ebc0
JB
12 #include <string.h>
13@@ -233,232 +236,6 @@
14 return value;
bb4ca147 15 }
bb4ca147 16
f619ebc0
JB
17-#ifdef RESOLVE
18-
19-/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
20- MAP is the object containing the reloc. */
21-
22-auto inline void
23-__attribute__ ((always_inline))
24-elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
25- const Elf64_Sym *sym, const struct r_found_version *version,
26- void *const reloc_addr_arg)
27-{
28- Elf64_Addr *const reloc_addr = reloc_addr_arg;
29- const unsigned long int r_type = ELF64_R_TYPE_ID (reloc->r_info);
30-
31-#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
32- if (__builtin_expect (r_type == R_SPARC_RELATIVE, 0))
33- *reloc_addr = map->l_addr + reloc->r_addend;
34-# ifndef RTLD_BOOTSTRAP
35- else if (r_type == R_SPARC_NONE) /* Who is Wilbur? */
36- return;
37-# endif
38- else
39-#endif
40- {
41-#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
42- const Elf64_Sym *const refsym = sym;
43-#endif
44- Elf64_Addr value;
45-#ifndef RESOLVE_CONFLICT_FIND_MAP
46- if (sym->st_shndx != SHN_UNDEF &&
47- ELF64_ST_BIND (sym->st_info) == STB_LOCAL)
48- value = map->l_addr;
49- else
50- {
51- value = RESOLVE (&sym, version, r_type);
52- if (sym)
53- value += sym->st_value;
54- }
55-#else
56- value = 0;
57-#endif
58- value += reloc->r_addend; /* Assume copy relocs have zero addend. */
59-
60- switch (r_type)
61- {
62-#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
63- case R_SPARC_COPY:
64- if (sym == NULL)
65- /* This can happen in trace mode if an object could not be
66- found. */
67- break;
68- if (sym->st_size > refsym->st_size
69- || (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
70- {
71- const char *strtab;
72-
73- strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
74- _dl_error_printf ("\
75-%s: Symbol `%s' has different size in shared object, consider re-linking\n",
76- rtld_progname ?: "<program name unknown>",
77- strtab + refsym->st_name);
78- }
79- memcpy (reloc_addr_arg, (void *) value,
80- MIN (sym->st_size, refsym->st_size));
81- break;
82-#endif
83- case R_SPARC_64:
84- case R_SPARC_GLOB_DAT:
85- *reloc_addr = value;
86- break;
87-#ifndef RTLD_BOOTSTRAP
88- case R_SPARC_8:
89- *(char *) reloc_addr = value;
90- break;
91- case R_SPARC_16:
92- *(short *) reloc_addr = value;
93- break;
94- case R_SPARC_32:
95- *(unsigned int *) reloc_addr = value;
96- break;
97- case R_SPARC_DISP8:
98- *(char *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
99- break;
100- case R_SPARC_DISP16:
101- *(short *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
102- break;
103- case R_SPARC_DISP32:
104- *(unsigned int *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
105- break;
106- case R_SPARC_WDISP30:
107- *(unsigned int *) reloc_addr =
108- ((*(unsigned int *)reloc_addr & 0xc0000000) |
109- ((value - (Elf64_Addr) reloc_addr) >> 2));
110- break;
111-
112- /* MEDLOW code model relocs */
113- case R_SPARC_LO10:
114- *(unsigned int *) reloc_addr =
115- ((*(unsigned int *)reloc_addr & ~0x3ff) |
116- (value & 0x3ff));
117- break;
118- case R_SPARC_HI22:
119- *(unsigned int *) reloc_addr =
120- ((*(unsigned int *)reloc_addr & 0xffc00000) |
121- (value >> 10));
122- break;
123- case R_SPARC_OLO10:
124- *(unsigned int *) reloc_addr =
125- ((*(unsigned int *)reloc_addr & ~0x1fff) |
126- (((value & 0x3ff) + ELF64_R_TYPE_DATA (reloc->r_info)) & 0x1fff));
127- break;
128-
129- /* MEDMID code model relocs */
130- case R_SPARC_H44:
131- *(unsigned int *) reloc_addr =
132- ((*(unsigned int *)reloc_addr & 0xffc00000) |
133- (value >> 22));
134- break;
135- case R_SPARC_M44:
136- *(unsigned int *) reloc_addr =
137- ((*(unsigned int *)reloc_addr & ~0x3ff) |
138- ((value >> 12) & 0x3ff));
139- break;
140- case R_SPARC_L44:
141- *(unsigned int *) reloc_addr =
142- ((*(unsigned int *)reloc_addr & ~0xfff) |
143- (value & 0xfff));
144- break;
145-
146- /* MEDANY code model relocs */
147- case R_SPARC_HH22:
148- *(unsigned int *) reloc_addr =
149- ((*(unsigned int *)reloc_addr & 0xffc00000) |
150- (value >> 42));
151- break;
152- case R_SPARC_HM10:
153- *(unsigned int *) reloc_addr =
154- ((*(unsigned int *)reloc_addr & ~0x3ff) |
155- ((value >> 32) & 0x3ff));
156- break;
157- case R_SPARC_LM22:
158- *(unsigned int *) reloc_addr =
159- ((*(unsigned int *)reloc_addr & 0xffc00000) |
160- ((value >> 10) & 0x003fffff));
161- break;
162-#endif
163- case R_SPARC_JMP_SLOT:
164-#ifdef RESOLVE_CONFLICT_FIND_MAP
165- /* R_SPARC_JMP_SLOT conflicts against .plt[32768+]
166- relocs should be turned into R_SPARC_64 relocs
167- in .gnu.conflict section.
168- r_addend non-zero does not mean it is a .plt[32768+]
169- reloc, instead it is the actual address of the function
170- to call. */
171- sparc64_fixup_plt (NULL, reloc, reloc_addr, value, 0, 0);
172-#else
173- sparc64_fixup_plt (map, reloc, reloc_addr, value,
174- reloc->r_addend, 0);
175-#endif
176- break;
177-#ifndef RTLD_BOOTSTRAP
178- case R_SPARC_UA16:
179- ((unsigned char *) reloc_addr_arg) [0] = value >> 8;
180- ((unsigned char *) reloc_addr_arg) [1] = value;
181- break;
182- case R_SPARC_UA32:
183- ((unsigned char *) reloc_addr_arg) [0] = value >> 24;
184- ((unsigned char *) reloc_addr_arg) [1] = value >> 16;
185- ((unsigned char *) reloc_addr_arg) [2] = value >> 8;
186- ((unsigned char *) reloc_addr_arg) [3] = value;
187- break;
188- case R_SPARC_UA64:
189- if (! ((long) reloc_addr_arg & 3))
190- {
191- /* Common in .eh_frame */
192- ((unsigned int *) reloc_addr_arg) [0] = value >> 32;
193- ((unsigned int *) reloc_addr_arg) [1] = value;
194- break;
195- }
196- ((unsigned char *) reloc_addr_arg) [0] = value >> 56;
197- ((unsigned char *) reloc_addr_arg) [1] = value >> 48;
198- ((unsigned char *) reloc_addr_arg) [2] = value >> 40;
199- ((unsigned char *) reloc_addr_arg) [3] = value >> 32;
200- ((unsigned char *) reloc_addr_arg) [4] = value >> 24;
201- ((unsigned char *) reloc_addr_arg) [5] = value >> 16;
202- ((unsigned char *) reloc_addr_arg) [6] = value >> 8;
203- ((unsigned char *) reloc_addr_arg) [7] = value;
204- break;
205-#endif
206-#if !defined RTLD_BOOTSTRAP || defined _NDEBUG
207- default:
208- _dl_reloc_bad_type (map, r_type, 0);
209- break;
210-#endif
211- }
212- }
213-}
214-
215-auto inline void
216-__attribute__ ((always_inline))
217-elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
218- void *const reloc_addr_arg)
219-{
220- Elf64_Addr *const reloc_addr = reloc_addr_arg;
221- *reloc_addr = l_addr + reloc->r_addend;
222-}
223-
224-auto inline void
225-__attribute__ ((always_inline))
226-elf_machine_lazy_rel (struct link_map *map,
227- Elf64_Addr l_addr, const Elf64_Rela *reloc)
228-{
229- switch (ELF64_R_TYPE (reloc->r_info))
230- {
231- case R_SPARC_NONE:
232- break;
233- case R_SPARC_JMP_SLOT:
234- break;
235- default:
236- _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
237- break;
238- }
239-}
240-
241-#endif /* RESOLVE */
242-
243 /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
244 PLT entries should not be allowed to define the value.
245 ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
246@@ -766,3 +543,231 @@
247 " add %sp, 6*8, %sp\n" \
248 " .size _dl_start_user, . - _dl_start_user\n" \
249 " .previous\n");
250+
251+#endif /* dl_machine_h */
252+
253+#ifdef RESOLVE
254+
255+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
256+ MAP is the object containing the reloc. */
257+
258+auto inline void
259+__attribute__ ((always_inline))
260+elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
261+ const Elf64_Sym *sym, const struct r_found_version *version,
262+ void *const reloc_addr_arg)
263+{
264+ Elf64_Addr *const reloc_addr = reloc_addr_arg;
265+ const unsigned long int r_type = ELF64_R_TYPE_ID (reloc->r_info);
266+
267+#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
268+ if (__builtin_expect (r_type == R_SPARC_RELATIVE, 0))
269+ *reloc_addr = map->l_addr + reloc->r_addend;
270+# ifndef RTLD_BOOTSTRAP
271+ else if (r_type == R_SPARC_NONE) /* Who is Wilbur? */
272+ return;
273+# endif
274+ else
275+#endif
276+ {
277+#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
278+ const Elf64_Sym *const refsym = sym;
279+#endif
280+ Elf64_Addr value;
281+#ifndef RESOLVE_CONFLICT_FIND_MAP
282+ if (sym->st_shndx != SHN_UNDEF &&
283+ ELF64_ST_BIND (sym->st_info) == STB_LOCAL)
284+ value = map->l_addr;
285+ else
286+ {
287+ value = RESOLVE (&sym, version, r_type);
288+ if (sym)
289+ value += sym->st_value;
290+ }
291+#else
292+ value = 0;
293+#endif
294+ value += reloc->r_addend; /* Assume copy relocs have zero addend. */
295+
296+ switch (r_type)
297+ {
298+#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
299+ case R_SPARC_COPY:
300+ if (sym == NULL)
301+ /* This can happen in trace mode if an object could not be
302+ found. */
303+ break;
304+ if (sym->st_size > refsym->st_size
305+ || (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
306+ {
307+ const char *strtab;
308+
309+ strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
310+ _dl_error_printf ("\
311+%s: Symbol `%s' has different size in shared object, consider re-linking\n",
312+ rtld_progname ?: "<program name unknown>",
313+ strtab + refsym->st_name);
314+ }
315+ memcpy (reloc_addr_arg, (void *) value,
316+ MIN (sym->st_size, refsym->st_size));
317+ break;
318+#endif
319+ case R_SPARC_64:
320+ case R_SPARC_GLOB_DAT:
321+ *reloc_addr = value;
322+ break;
323+#ifndef RTLD_BOOTSTRAP
324+ case R_SPARC_8:
325+ *(char *) reloc_addr = value;
326+ break;
327+ case R_SPARC_16:
328+ *(short *) reloc_addr = value;
329+ break;
330+ case R_SPARC_32:
331+ *(unsigned int *) reloc_addr = value;
332+ break;
333+ case R_SPARC_DISP8:
334+ *(char *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
335+ break;
336+ case R_SPARC_DISP16:
337+ *(short *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
338+ break;
339+ case R_SPARC_DISP32:
340+ *(unsigned int *) reloc_addr = (value - (Elf64_Addr) reloc_addr);
341+ break;
342+ case R_SPARC_WDISP30:
343+ *(unsigned int *) reloc_addr =
344+ ((*(unsigned int *)reloc_addr & 0xc0000000) |
345+ ((value - (Elf64_Addr) reloc_addr) >> 2));
346+ break;
347+
348+ /* MEDLOW code model relocs */
349+ case R_SPARC_LO10:
350+ *(unsigned int *) reloc_addr =
351+ ((*(unsigned int *)reloc_addr & ~0x3ff) |
352+ (value & 0x3ff));
353+ break;
354+ case R_SPARC_HI22:
355+ *(unsigned int *) reloc_addr =
356+ ((*(unsigned int *)reloc_addr & 0xffc00000) |
357+ (value >> 10));
358+ break;
359+ case R_SPARC_OLO10:
360+ *(unsigned int *) reloc_addr =
361+ ((*(unsigned int *)reloc_addr & ~0x1fff) |
362+ (((value & 0x3ff) + ELF64_R_TYPE_DATA (reloc->r_info)) & 0x1fff));
363+ break;
364+
365+ /* MEDMID code model relocs */
366+ case R_SPARC_H44:
367+ *(unsigned int *) reloc_addr =
368+ ((*(unsigned int *)reloc_addr & 0xffc00000) |
369+ (value >> 22));
370+ break;
371+ case R_SPARC_M44:
372+ *(unsigned int *) reloc_addr =
373+ ((*(unsigned int *)reloc_addr & ~0x3ff) |
374+ ((value >> 12) & 0x3ff));
375+ break;
376+ case R_SPARC_L44:
377+ *(unsigned int *) reloc_addr =
378+ ((*(unsigned int *)reloc_addr & ~0xfff) |
379+ (value & 0xfff));
380+ break;
381+
382+ /* MEDANY code model relocs */
383+ case R_SPARC_HH22:
384+ *(unsigned int *) reloc_addr =
385+ ((*(unsigned int *)reloc_addr & 0xffc00000) |
386+ (value >> 42));
387+ break;
388+ case R_SPARC_HM10:
389+ *(unsigned int *) reloc_addr =
390+ ((*(unsigned int *)reloc_addr & ~0x3ff) |
391+ ((value >> 32) & 0x3ff));
392+ break;
393+ case R_SPARC_LM22:
394+ *(unsigned int *) reloc_addr =
395+ ((*(unsigned int *)reloc_addr & 0xffc00000) |
396+ ((value >> 10) & 0x003fffff));
397+ break;
398+#endif
399+ case R_SPARC_JMP_SLOT:
400+#ifdef RESOLVE_CONFLICT_FIND_MAP
401+ /* R_SPARC_JMP_SLOT conflicts against .plt[32768+]
402+ relocs should be turned into R_SPARC_64 relocs
403+ in .gnu.conflict section.
404+ r_addend non-zero does not mean it is a .plt[32768+]
405+ reloc, instead it is the actual address of the function
406+ to call. */
407+ sparc64_fixup_plt (NULL, reloc, reloc_addr, value, 0, 0);
408+#else
409+ sparc64_fixup_plt (map, reloc, reloc_addr, value,
410+ reloc->r_addend, 0);
411+#endif
412+ break;
413+#ifndef RTLD_BOOTSTRAP
414+ case R_SPARC_UA16:
415+ ((unsigned char *) reloc_addr_arg) [0] = value >> 8;
416+ ((unsigned char *) reloc_addr_arg) [1] = value;
417+ break;
418+ case R_SPARC_UA32:
419+ ((unsigned char *) reloc_addr_arg) [0] = value >> 24;
420+ ((unsigned char *) reloc_addr_arg) [1] = value >> 16;
421+ ((unsigned char *) reloc_addr_arg) [2] = value >> 8;
422+ ((unsigned char *) reloc_addr_arg) [3] = value;
423+ break;
424+ case R_SPARC_UA64:
425+ if (! ((long) reloc_addr_arg & 3))
426+ {
427+ /* Common in .eh_frame */
428+ ((unsigned int *) reloc_addr_arg) [0] = value >> 32;
429+ ((unsigned int *) reloc_addr_arg) [1] = value;
430+ break;
431+ }
432+ ((unsigned char *) reloc_addr_arg) [0] = value >> 56;
433+ ((unsigned char *) reloc_addr_arg) [1] = value >> 48;
434+ ((unsigned char *) reloc_addr_arg) [2] = value >> 40;
435+ ((unsigned char *) reloc_addr_arg) [3] = value >> 32;
436+ ((unsigned char *) reloc_addr_arg) [4] = value >> 24;
437+ ((unsigned char *) reloc_addr_arg) [5] = value >> 16;
438+ ((unsigned char *) reloc_addr_arg) [6] = value >> 8;
439+ ((unsigned char *) reloc_addr_arg) [7] = value;
440+ break;
441+#endif
442+#if !defined RTLD_BOOTSTRAP || defined _NDEBUG
443+ default:
444+ _dl_reloc_bad_type (map, r_type, 0);
445+ break;
446+#endif
447+ }
448+ }
449+}
450+
451+auto inline void
452+__attribute__ ((always_inline))
453+elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
454+ void *const reloc_addr_arg)
455+{
456+ Elf64_Addr *const reloc_addr = reloc_addr_arg;
457+ *reloc_addr = l_addr + reloc->r_addend;
458+}
459+
460+auto inline void
461+__attribute__ ((always_inline))
462+elf_machine_lazy_rel (struct link_map *map,
463+ Elf64_Addr l_addr, const Elf64_Rela *reloc)
464+{
465+ switch (ELF64_R_TYPE (reloc->r_info))
466+ {
467+ case R_SPARC_NONE:
468+ break;
469+ case R_SPARC_JMP_SLOT:
470+ break;
471+ default:
472+ _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
473+ break;
474+ }
475+}
476+
477+#endif /* RESOLVE */
This page took 0.349718 seconds and 4 git commands to generate.