Sun Dec 4 16:53:08 2011 UTC ()
Use the tlsoffset from the correct object.


(skrll)
diff -r1.40 -r1.41 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c

cvs diff -r1.40 -r1.41 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c (expand / switch to unified diff)

--- src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c 2011/09/25 13:34:54 1.40
+++ src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c 2011/12/04 16:53:08 1.41
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: hppa_reloc.c,v 1.40 2011/09/25 13:34:54 chs Exp $ */ 1/* $NetBSD: hppa_reloc.c,v 1.41 2011/12/04 16:53:08 skrll Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2002, 2004 The NetBSD Foundation, Inc. 4 * Copyright (c) 2002, 2004 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matt Fredette and Nick Hudson. 8 * by Matt Fredette and Nick Hudson.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -21,27 +21,27 @@ @@ -21,27 +21,27 @@
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE. 29 * POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32#include <sys/cdefs.h> 32#include <sys/cdefs.h>
33#ifndef lint 33#ifndef lint
34__RCSID("$NetBSD: hppa_reloc.c,v 1.40 2011/09/25 13:34:54 chs Exp $"); 34__RCSID("$NetBSD: hppa_reloc.c,v 1.41 2011/12/04 16:53:08 skrll Exp $");
35#endif /* not lint */ 35#endif /* not lint */
36 36
37#include <stdlib.h> 37#include <stdlib.h>
38#include <sys/types.h> 38#include <sys/types.h>
39#include <sys/queue.h> 39#include <sys/queue.h>
40 40
41#include <string.h> 41#include <string.h>
42 42
43#include "rtld.h" 43#include "rtld.h"
44#include "debug.h" 44#include "debug.h"
45 45
46#ifdef RTLD_DEBUG_HPPA 46#ifdef RTLD_DEBUG_HPPA
47#define hdbg(x) xprintf x 47#define hdbg(x) xprintf x
@@ -471,27 +471,27 @@ _rtld_relocate_nonplt_objects(Obj_Entry  @@ -471,27 +471,27 @@ _rtld_relocate_nonplt_objects(Obj_Entry
471 return -1; 471 return -1;
472 } 472 }
473 rdbg(("COPY (avoid in main)")); 473 rdbg(("COPY (avoid in main)"));
474 break; 474 break;
475 475
476 case R_TYPE(TLS_TPREL32): 476 case R_TYPE(TLS_TPREL32):
477 def = _rtld_find_symdef(symnum, obj, &defobj, false); 477 def = _rtld_find_symdef(symnum, obj, &defobj, false);
478 if (def == NULL) 478 if (def == NULL)
479 return -1; 479 return -1;
480 480
481 if (!defobj->tls_done && _rtld_tls_offset_allocate(obj)) 481 if (!defobj->tls_done && _rtld_tls_offset_allocate(obj))
482 return -1; 482 return -1;
483 483
484 *where = (Elf_Addr)(obj->tlsoffset + def->st_value + 484 *where = (Elf_Addr)(defobj->tlsoffset + def->st_value +
485 rela->r_addend + sizeof(struct tls_tcb)); 485 rela->r_addend + sizeof(struct tls_tcb));
486 486
487 rdbg(("TPREL32 %s in %s --> %p in %s", 487 rdbg(("TPREL32 %s in %s --> %p in %s",
488 obj->strtab + obj->symtab[symnum].st_name, 488 obj->strtab + obj->symtab[symnum].st_name,
489 obj->path, (void *)*where, defobj->path)); 489 obj->path, (void *)*where, defobj->path));
490 break; 490 break;
491 491
492 case R_TYPE(TLS_DTPMOD32): 492 case R_TYPE(TLS_DTPMOD32):
493 def = _rtld_find_symdef(symnum, obj, &defobj, false); 493 def = _rtld_find_symdef(symnum, obj, &defobj, false);
494 if (def == NULL) 494 if (def == NULL)
495 return -1; 495 return -1;
496 496
497 *where = (Elf_Addr)(defobj->tlsindex); 497 *where = (Elf_Addr)(defobj->tlsindex);