Deleted Added
full compact
reloc.c (115940) reloc.c (133063)
1/*-
2 * Copyright 1996, 1997, 1998, 1999 John D. Polstra.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 8 unchanged lines hidden (view full) ---

17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 *
1/*-
2 * Copyright 1996, 1997, 1998, 1999 John D. Polstra.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 8 unchanged lines hidden (view full) ---

17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 *
25 * $FreeBSD: head/libexec/rtld-elf/ia64/reloc.c 115940 2003-06-07 07:52:17Z marcel $
25 * $FreeBSD: head/libexec/rtld-elf/ia64/reloc.c 133063 2004-08-03 08:51:00Z dfr $
26 */
27
28/*
29 * Dynamic linker for ELF.
30 *
31 * John Polstra <jdp@polstra.com>.
32 */
33

--- 220 unchanged lines hidden (view full) ---

254 }
255
256 fptr = (void*)where;
257 store64(&fptr->target, target);
258 store64(&fptr->gp, gp);
259 break;
260 }
261
26 */
27
28/*
29 * Dynamic linker for ELF.
30 *
31 * John Polstra <jdp@polstra.com>.
32 */
33

--- 220 unchanged lines hidden (view full) ---

254 }
255
256 fptr = (void*)where;
257 store64(&fptr->target, target);
258 store64(&fptr->gp, gp);
259 break;
260 }
261
262 case R_IA64_DTPMOD64LSB: {
263 const Elf_Sym *def;
264 const Obj_Entry *defobj;
265
266 def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj,
267 false, cache);
268 if (def == NULL)
269 return -1;
270
271 store64(where, defobj->tlsindex);
272 break;
273 }
274
275 case R_IA64_DTPREL64LSB: {
276 const Elf_Sym *def;
277 const Obj_Entry *defobj;
278
279 def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj,
280 false, cache);
281 if (def == NULL)
282 return -1;
283
284 store64(where, def->st_value + rela->r_addend);
285 break;
286 }
287
288 case R_IA64_TPREL64LSB: {
289 const Elf_Sym *def;
290 const Obj_Entry *defobj;
291
292 def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj,
293 false, cache);
294 if (def == NULL)
295 return -1;
296
297 /*
298 * We lazily allocate offsets for static TLS as we
299 * see the first relocation that references the
300 * TLS block. This allows us to support (small
301 * amounts of) static TLS in dynamically loaded
302 * modules. If we run out of space, we generate an
303 * error.
304 */
305 if (!defobj->tls_done) {
306 if (!allocate_tls_offset((Obj_Entry*) defobj)) {
307 _rtld_error("%s: No space available for static "
308 "Thread Local Storage", obj->path);
309 return -1;
310 }
311 }
312
313 store64(where, defobj->tlsoffset + def->st_value + rela->r_addend);
314 break;
315 }
316
262 case R_IA64_NONE:
263 break;
264
265 default:
266 _rtld_error("%s: Unsupported relocation type %d"
267 " in non-PLT relocations\n", obj->path,
268 ELF_R_TYPE(rela->r_info));
269 return -1;

--- 260 unchanged lines hidden (view full) ---

530 /*
531 * The PLT RESERVE section is used to get values to pass to
532 * _rtld_bind when lazy binding.
533 */
534 pltres[0] = (Elf_Addr) obj;
535 pltres[1] = FPTR_TARGET(_rtld_bind_start);
536 pltres[2] = FPTR_GP(_rtld_bind_start);
537}
317 case R_IA64_NONE:
318 break;
319
320 default:
321 _rtld_error("%s: Unsupported relocation type %d"
322 " in non-PLT relocations\n", obj->path,
323 ELF_R_TYPE(rela->r_info));
324 return -1;

--- 260 unchanged lines hidden (view full) ---

585 /*
586 * The PLT RESERVE section is used to get values to pass to
587 * _rtld_bind when lazy binding.
588 */
589 pltres[0] = (Elf_Addr) obj;
590 pltres[1] = FPTR_TARGET(_rtld_bind_start);
591 pltres[2] = FPTR_GP(_rtld_bind_start);
592}
593
594void
595allocate_initial_tls(Obj_Entry *list)
596{
597 register Elf_Addr** tp __asm__("r13");
598
599 /*
600 * Fix the size of the static TLS block by using the maximum
601 * offset allocated so far and adding a bit for dynamic modules to
602 * use.
603 */
604 tls_static_space = tls_last_offset + tls_last_size + RTLD_STATIC_TLS_EXTRA;
605
606 tp = allocate_tls(list, 0, 16, 16);
607}
608
609void *__tls_get_addr(unsigned long module, unsigned long offset)
610{
611 register Elf_Addr** tp __asm__("r13");
612
613 return tls_get_addr_common(tp, module, offset);
614}