update from main archive 961203
[platform/upstream/glibc.git] / sysdeps / alpha / dl-machine.h
index a75011f..1c71ec8 100644 (file)
@@ -1,22 +1,22 @@
 /* Machine-dependent ELF dynamic relocation inline functions.  Alpha version.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Richard Henderson <rth@tamu.edu>.
+   Copyright (C) 1996 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Richard Henderson <rth@tamu.edu>.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, write to the Free Software Foundation, Inc.,
+   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* This was written in the absence of an ABI -- don't expect
    it to remain unchanged.  */
@@ -37,13 +37,13 @@ elf_machine_matches_host (Elf64_Word e_machine)
   return e_machine == EM_ALPHA;
 }
 
-/* Return the run-time address of the _GLOBAL_OFFSET_TABLE_.
-   Must be inlined in a function which uses global data.  */
-static inline Elf64_Addr *
-elf_machine_got (void)
+/* Return the link-time address of _DYNAMIC.  The multiple-got-capable
+   linker no longer allocates the first .got entry for this.  But not to
+   worry, no special tricks are needed.  */
+static inline Elf64_Addr
+elf_machine_dynamic (void)
 {
-  register Elf64_Addr gp __asm__("$29");
-  return (Elf64_Addr *)(gp - 0x8000);
+  return (Elf64_Addr) &_DYNAMIC;
 }
 
 /* Return the run-time load address of the shared object.  */
@@ -186,13 +186,17 @@ _dl_runtime_resolve:
 #define RTLD_START asm ("\
 .text
        .globl _start
-       .globl _dl_start_user
+       .ent _start
 _start:
-       br      $gp,0f
+       br      $gp, 0f
 0:     ldgp    $gp, 0($gp)
        /* Pass pointer to argument block to _dl_start.  */
        mov     $sp, $16
        bsr     $26, _dl_start..ng
+       .end _start
+       /* FALLTHRU */
+       .globl _dl_start_user
+       .ent _dl_start_user
 _dl_start_user:
        /* Save the user entry point address in s0.  */
        mov     $0, $9
@@ -217,11 +221,16 @@ _dl_start_user:
        jsr     $26, ($0)
        ldgp    $gp, 0($26)
        br      1b
-2:     /* Pass our finalizer function to the user in $0. */
+2:     /* Clear the startup flag.  */
+       .set at
+       stl     $31, _dl_starting_up
+       .set noat
+       /* Pass our finalizer function to the user in $0. */
        lda     $0, _dl_fini
        /* Jump to the user's entry point.  */
        mov     $9, $27
-       jmp     ($9)");
+       jmp     ($9)
+       .end _dl_start_user");
 
 /* Nonzero iff TYPE describes relocation of a PLT entry, so
    PLT entries should not be allowed to define the value.  */
@@ -341,8 +350,8 @@ elf_machine_rela (struct link_map *map,
     {
       Elf64_Addr loadbase, sym_value;
 
-      loadbase = RESOLVE (&sym, (Elf64_Addr)reloc_addr,
-                         r_info == R_ALPHA_JMP_SLOT);
+      loadbase = RESOLVE (&sym,
+                         r_info == R_ALPHA_JMP_SLOT ? DL_LOOKUP_NOPLT : 0);
       sym_value = sym ? loadbase + sym->st_value : 0;
 
       if (r_info == R_ALPHA_GLOB_DAT)
@@ -373,8 +382,6 @@ elf_machine_rela (struct link_map *map,
            sym_value += reloc->r_addend;
          *reloc_addr = sym_value;
        }
-      else if (r_info == R_ALPHA_COPY)
-       memcpy (reloc_addr, (void *) sym_value, sym->st_size);
       else
        assert (! "unexpected dynamic reloc type");
     }