mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Remove support for !USE___THREAD
This commit is contained in:
38
ChangeLog
38
ChangeLog
@ -1,5 +1,43 @@
|
|||||||
2011-09-10 Ulrich Drepper <drepper@gmail.com>
|
2011-09-10 Ulrich Drepper <drepper@gmail.com>
|
||||||
|
|
||||||
|
* include/tls.h: Removed. USE___THREAD must always be defined.
|
||||||
|
* bits/libc-tsd.h: Don't handle !USE___THREAD.
|
||||||
|
* elf/dl-libc.c: Likewise.
|
||||||
|
* elf/dl-tsd.c: Likewise.
|
||||||
|
* include/errno.h: Likewise.
|
||||||
|
* include/netdb.h: Likewise.
|
||||||
|
* include/resolv.h: Likewise.
|
||||||
|
* inet/herrno-loc.c: Likewise.
|
||||||
|
* inet/herrno.c: Likewise.
|
||||||
|
* malloc/arena.c: Likewise.
|
||||||
|
* malloc/hooks.c: Likewise.
|
||||||
|
* malloc/malloc.c: Likewise.
|
||||||
|
* resolv/res-state.c: Likewise.
|
||||||
|
* resolv/res_libc.c: Likewise.
|
||||||
|
* sysdeps/i386/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/ia64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/powerpc/powerpc32/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/powerpc/powerpc64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/s390/s390-32/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/s390/s390-64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/sh/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/sparc/sparc32/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/sparc/sparc64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/unix/i386/sysdep.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/sysdep.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/sysdep.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise.
|
||||||
|
* sysdeps/unix/x86_64/sysdep.S: Likewise.
|
||||||
|
* sysdeps/x86_64/dl-machine.h: Likewise.
|
||||||
|
* tls.make.c: Likewise.
|
||||||
|
|
||||||
* configure.in: Remove --with-__thread option. Make tests for
|
* configure.in: Remove --with-__thread option. Make tests for
|
||||||
--no-whole-archive, __builtin_expect, symbol redirection, __thread,
|
--no-whole-archive, __builtin_expect, symbol redirection, __thread,
|
||||||
tls_model attribute fail if no support is available. Remove
|
tls_model attribute fail if no support is available. Remove
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* libc-internal interface for thread-specific data. Stub or TLS version.
|
/* libc-internal interface for thread-specific data. Stub or TLS version.
|
||||||
Copyright (C) 1998,2001,2002,2008 Free Software Foundation, Inc.
|
Copyright (C) 1998,2001,2002,2008,2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -24,12 +24,12 @@
|
|||||||
set of thread-specific `void *' data used only internally by libc.
|
set of thread-specific `void *' data used only internally by libc.
|
||||||
|
|
||||||
__libc_tsd_define(CLASS, TYPE, KEY) -- Define or declare a datum with TYPE
|
__libc_tsd_define(CLASS, TYPE, KEY) -- Define or declare a datum with TYPE
|
||||||
for KEY. CLASS can be `static' for
|
for KEY. CLASS can be `static' for
|
||||||
keys used in only one source file,
|
keys used in only one source file,
|
||||||
empty for global definitions, or
|
empty for global definitions, or
|
||||||
`extern' for global declarations.
|
`extern' for global declarations.
|
||||||
__libc_tsd_address(TYPE, KEY) -- Return the `TYPE *' pointing to
|
__libc_tsd_address(TYPE, KEY) -- Return the `TYPE *' pointing to
|
||||||
the current thread's datum for KEY.
|
the current thread's datum for KEY.
|
||||||
__libc_tsd_get(TYPE, KEY) -- Return the `TYPE' datum for KEY.
|
__libc_tsd_get(TYPE, KEY) -- Return the `TYPE' datum for KEY.
|
||||||
__libc_tsd_set(TYPE, KEY, VALUE) -- Set the datum for KEY to VALUE.
|
__libc_tsd_set(TYPE, KEY, VALUE) -- Set the datum for KEY to VALUE.
|
||||||
|
|
||||||
@ -51,20 +51,11 @@
|
|||||||
We don't define an enum for the possible key values, because the KEYs
|
We don't define an enum for the possible key values, because the KEYs
|
||||||
translate directly into variables by macro magic. */
|
translate directly into variables by macro magic. */
|
||||||
|
|
||||||
#if USE___THREAD
|
#define __libc_tsd_define(CLASS, TYPE, KEY) \
|
||||||
# define __libc_tsd_define(CLASS, TYPE, KEY) \
|
|
||||||
CLASS __thread TYPE __libc_tsd_##KEY attribute_tls_model_ie;
|
CLASS __thread TYPE __libc_tsd_##KEY attribute_tls_model_ie;
|
||||||
|
|
||||||
# define __libc_tsd_address(TYPE, KEY) (&__libc_tsd_##KEY)
|
#define __libc_tsd_address(TYPE, KEY) (&__libc_tsd_##KEY)
|
||||||
# define __libc_tsd_get(TYPE, KEY) (__libc_tsd_##KEY)
|
#define __libc_tsd_get(TYPE, KEY) (__libc_tsd_##KEY)
|
||||||
# define __libc_tsd_set(TYPE, KEY, VALUE) (__libc_tsd_##KEY = (VALUE))
|
#define __libc_tsd_set(TYPE, KEY, VALUE) (__libc_tsd_##KEY = (VALUE))
|
||||||
#else
|
|
||||||
# define __libc_tsd_define(CLASS, TYPE, KEY) \
|
|
||||||
CLASS TYPE __libc_tsd_##KEY##_data;
|
|
||||||
|
|
||||||
# define __libc_tsd_address(TYPE, KEY) (&__libc_tsd_##KEY##_data)
|
|
||||||
# define __libc_tsd_get(TYPE, KEY) (__libc_tsd_##KEY##_data)
|
|
||||||
# define __libc_tsd_set(TYPE, KEY, VALUE) (__libc_tsd_##KEY##_data = (VALUE))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* bits/libc-tsd.h */
|
#endif /* bits/libc-tsd.h */
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* MT support function to get address of `errno' variable, non-threaded
|
/* MT support function to get address of `errno' variable, non-threaded
|
||||||
version.
|
version.
|
||||||
Copyright (C) 1996, 1998, 2002, 2004 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1998, 2002, 2004, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -21,15 +21,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
|
|
||||||
#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO
|
|
||||||
#undef errno
|
|
||||||
extern int errno;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int *
|
int *
|
||||||
#if ! USE___THREAD
|
|
||||||
weak_const_function
|
|
||||||
#endif
|
|
||||||
__errno_location (void)
|
__errno_location (void)
|
||||||
{
|
{
|
||||||
return &errno;
|
return &errno;
|
||||||
|
21
csu/errno.c
21
csu/errno.c
@ -1,5 +1,5 @@
|
|||||||
/* Definition of `errno' variable. Canonical version.
|
/* Definition of `errno' variable. Canonical version.
|
||||||
Copyright (C) 2002, 2004 Free Software Foundation, Inc.
|
Copyright (C) 2002, 2004, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -27,27 +27,10 @@
|
|||||||
/* Code compiled for rtld refers only to this name. */
|
/* Code compiled for rtld refers only to this name. */
|
||||||
int rtld_errno attribute_hidden;
|
int rtld_errno attribute_hidden;
|
||||||
|
|
||||||
#elif USE___THREAD
|
#else
|
||||||
|
|
||||||
__thread int errno;
|
__thread int errno;
|
||||||
extern __thread int __libc_errno __attribute__ ((alias ("errno")))
|
extern __thread int __libc_errno __attribute__ ((alias ("errno")))
|
||||||
attribute_hidden;
|
attribute_hidden;
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* This differs from plain `int errno;' in that it doesn't create
|
|
||||||
a common definition, but a plain symbol that resides in .bss,
|
|
||||||
which can have an alias. */
|
|
||||||
int errno __attribute__ ((nocommon));
|
|
||||||
strong_alias (errno, _errno)
|
|
||||||
|
|
||||||
/* We declare these with compat_symbol so that they are not visible at
|
|
||||||
link time. Programs must use the accessor functions. RTLD is special,
|
|
||||||
since it's not exported from there at any time. */
|
|
||||||
# if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
|
|
||||||
# include <shlib-compat.h>
|
|
||||||
compat_symbol (libc, errno, errno, GLIBC_2_0);
|
|
||||||
compat_symbol (libc, _errno, _errno, GLIBC_2_0);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -307,22 +307,19 @@ libc_freeres_fn (free_mem)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (USE___THREAD || GL(dl_tls_dtv_slotinfo_list) != NULL)
|
/* Free the memory allocated for the dtv slotinfo array. We can do
|
||||||
{
|
this only if all modules which used this memory are unloaded. */
|
||||||
/* Free the memory allocated for the dtv slotinfo array. We can do
|
|
||||||
this only if all modules which used this memory are unloaded. */
|
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (GL(dl_initial_dtv) == NULL)
|
if (GL(dl_initial_dtv) == NULL)
|
||||||
/* There was no initial TLS setup, it was set up later when
|
/* There was no initial TLS setup, it was set up later when
|
||||||
it used the normal malloc. */
|
it used the normal malloc. */
|
||||||
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list));
|
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list));
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
/* The first element of the list does not have to be deallocated.
|
/* The first element of the list does not have to be deallocated.
|
||||||
It was allocated in the dynamic linker (i.e., with a different
|
It was allocated in the dynamic linker (i.e., with a different
|
||||||
malloc), and in the static library it's in .bss space. */
|
malloc), and in the static library it's in .bss space. */
|
||||||
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next);
|
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next);
|
||||||
}
|
|
||||||
|
|
||||||
void *scope_free_list = GL(dl_scope_free_list);
|
void *scope_free_list = GL(dl_scope_free_list);
|
||||||
GL(dl_scope_free_list) = NULL;
|
GL(dl_scope_free_list) = NULL;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Thread-local data used by error handling for runtime dynamic linker.
|
/* Thread-local data used by error handling for runtime dynamic linker.
|
||||||
Copyright (C) 2002, 2005 Free Software Foundation, Inc.
|
Copyright (C) 2002, 2005, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -30,17 +30,13 @@
|
|||||||
void ** __attribute__ ((const))
|
void ** __attribute__ ((const))
|
||||||
_dl_initial_error_catch_tsd (void)
|
_dl_initial_error_catch_tsd (void)
|
||||||
{
|
{
|
||||||
# if USE___THREAD
|
|
||||||
static __thread void *data;
|
static __thread void *data;
|
||||||
# else
|
|
||||||
static void *data;
|
|
||||||
# endif
|
|
||||||
return &data;
|
return &data;
|
||||||
}
|
}
|
||||||
void **(*_dl_error_catch_tsd) (void) __attribute__ ((const))
|
void **(*_dl_error_catch_tsd) (void) __attribute__ ((const))
|
||||||
= &_dl_initial_error_catch_tsd;
|
= &_dl_initial_error_catch_tsd;
|
||||||
|
|
||||||
# elif USE___THREAD
|
# else
|
||||||
|
|
||||||
/* libpthread sets _dl_error_catch_tsd to point to this function.
|
/* libpthread sets _dl_error_catch_tsd to point to this function.
|
||||||
We define it here instead of in libpthread so that it doesn't
|
We define it here instead of in libpthread so that it doesn't
|
||||||
|
@ -21,15 +21,13 @@ extern int rtld_errno attribute_hidden;
|
|||||||
|
|
||||||
# include <tls.h>
|
# include <tls.h>
|
||||||
|
|
||||||
# if USE___THREAD
|
# undef errno
|
||||||
# undef errno
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define errno __libc_errno
|
||||||
# define errno __libc_errno
|
# else
|
||||||
# else
|
# define errno errno /* For #ifndef errno tests. */
|
||||||
# define errno errno /* For #ifndef errno tests. */
|
|
||||||
# endif
|
|
||||||
extern __thread int errno attribute_tls_model_ie;
|
|
||||||
# endif
|
# endif
|
||||||
|
extern __thread int errno attribute_tls_model_ie;
|
||||||
|
|
||||||
# endif /* RTLD_PRIVATE_ERRNO */
|
# endif /* RTLD_PRIVATE_ERRNO */
|
||||||
|
|
||||||
|
@ -2,29 +2,19 @@
|
|||||||
#include <resolv/netdb.h>
|
#include <resolv/netdb.h>
|
||||||
|
|
||||||
/* Macros for accessing h_errno from inside libc. */
|
/* Macros for accessing h_errno from inside libc. */
|
||||||
|
# undef h_errno
|
||||||
# ifdef _LIBC_REENTRANT
|
# ifdef _LIBC_REENTRANT
|
||||||
# include <tls.h>
|
# include <tls.h>
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# undef h_errno
|
# define h_errno __libc_h_errno
|
||||||
# ifndef NOT_IN_libc
|
|
||||||
# define h_errno __libc_h_errno
|
|
||||||
# else
|
|
||||||
# define h_errno h_errno /* For #ifndef h_errno tests. */
|
|
||||||
# endif
|
|
||||||
extern __thread int h_errno attribute_tls_model_ie;
|
|
||||||
# define __set_h_errno(x) (h_errno = (x))
|
|
||||||
# else
|
# else
|
||||||
static inline int
|
# define h_errno h_errno /* For #ifndef h_errno tests. */
|
||||||
__set_h_errno (int __err)
|
|
||||||
{
|
|
||||||
return *__h_errno_location () = __err;
|
|
||||||
}
|
|
||||||
# endif
|
# endif
|
||||||
|
extern __thread int h_errno attribute_tls_model_ie;
|
||||||
# else
|
# else
|
||||||
# undef h_errno
|
|
||||||
# define __set_h_errno(x) (h_errno = (x))
|
|
||||||
extern int h_errno;
|
extern int h_errno;
|
||||||
# endif /* _LIBC_REENTRANT */
|
# endif /* _LIBC_REENTRANT */
|
||||||
|
# define __set_h_errno(x) (h_errno = (x))
|
||||||
|
|
||||||
libc_hidden_proto (hstrerror)
|
libc_hidden_proto (hstrerror)
|
||||||
libc_hidden_proto (innetgr)
|
libc_hidden_proto (innetgr)
|
||||||
|
@ -15,14 +15,12 @@
|
|||||||
|
|
||||||
# ifdef _LIBC_REENTRANT
|
# ifdef _LIBC_REENTRANT
|
||||||
# include <tls.h>
|
# include <tls.h>
|
||||||
# if USE___THREAD
|
# undef _res
|
||||||
# undef _res
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define __resp __libc_resp
|
||||||
# define __resp __libc_resp
|
|
||||||
# endif
|
|
||||||
# define _res (*__resp)
|
|
||||||
extern __thread struct __res_state *__resp attribute_tls_model_ie;
|
|
||||||
# endif
|
# endif
|
||||||
|
# define _res (*__resp)
|
||||||
|
extern __thread struct __res_state *__resp attribute_tls_model_ie;
|
||||||
# else
|
# else
|
||||||
# ifndef __BIND_NOSTATIC
|
# ifndef __BIND_NOSTATIC
|
||||||
# undef _res
|
# undef _res
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
/* This file defines USE___THREAD to 1 or 0 to cut down on the #if mess. */
|
|
||||||
|
|
||||||
#ifndef _include_tls_h
|
|
||||||
#define _include_tls_h 1
|
|
||||||
|
|
||||||
#include_next <tls.h>
|
|
||||||
|
|
||||||
#if !defined NOT_IN_libc || defined IS_IN_libpthread
|
|
||||||
|
|
||||||
# define USE___THREAD 1
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
# define USE___THREAD 0
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1996, 97, 98, 2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 97, 98, 2002, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -19,10 +19,6 @@
|
|||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
|
|
||||||
#if ! USE___THREAD
|
|
||||||
# undef h_errno
|
|
||||||
extern int h_errno;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* When threaded, h_errno may be a per-thread variable. */
|
/* When threaded, h_errno may be a per-thread variable. */
|
||||||
int *
|
int *
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1996,97,98,2002,2003 Free Software Foundation, Inc.
|
/* Copyright (C) 1996,97,98,2002,2003,2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -25,23 +25,7 @@
|
|||||||
/* We need to have the error status variable of the resolver
|
/* We need to have the error status variable of the resolver
|
||||||
accessible in the libc. */
|
accessible in the libc. */
|
||||||
|
|
||||||
#if USE___THREAD
|
|
||||||
__thread int h_errno;
|
__thread int h_errno;
|
||||||
extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno")))
|
extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno")))
|
||||||
attribute_hidden;
|
attribute_hidden;
|
||||||
# define h_errno __libc_h_errno
|
#define h_errno __libc_h_errno
|
||||||
#else
|
|
||||||
/* This differs from plain `int h_errno;' in that it doesn't create
|
|
||||||
a common definition, but a plain symbol that resides in .bss,
|
|
||||||
which can have an alias. */
|
|
||||||
int h_errno __attribute__((section (".bss")));
|
|
||||||
weak_alias (h_errno, _h_errno)
|
|
||||||
|
|
||||||
/* We declare these with compat_symbol so that they are not
|
|
||||||
visible at link time. Programs must use the accessor functions. */
|
|
||||||
# if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
|
|
||||||
# include <shlib-compat.h>
|
|
||||||
compat_symbol (libc, h_errno, h_errno, GLIBC_2_0);
|
|
||||||
compat_symbol (libc, _h_errno, _h_errno, GLIBC_2_0);
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
@ -173,10 +173,6 @@ int __malloc_initialized = -1;
|
|||||||
|
|
||||||
static __malloc_ptr_t (*save_malloc_hook) (size_t __size,
|
static __malloc_ptr_t (*save_malloc_hook) (size_t __size,
|
||||||
__const __malloc_ptr_t);
|
__const __malloc_ptr_t);
|
||||||
# if !defined _LIBC || (defined SHARED && !USE___THREAD)
|
|
||||||
static __malloc_ptr_t (*save_memalign_hook) (size_t __align, size_t __size,
|
|
||||||
__const __malloc_ptr_t);
|
|
||||||
# endif
|
|
||||||
static void (*save_free_hook) (__malloc_ptr_t __ptr,
|
static void (*save_free_hook) (__malloc_ptr_t __ptr,
|
||||||
__const __malloc_ptr_t);
|
__const __malloc_ptr_t);
|
||||||
static Void_t* save_arena;
|
static Void_t* save_arena;
|
||||||
@ -432,34 +428,6 @@ __failing_morecore (ptrdiff_t d)
|
|||||||
extern struct dl_open_hook *_dl_open_hook;
|
extern struct dl_open_hook *_dl_open_hook;
|
||||||
libc_hidden_proto (_dl_open_hook);
|
libc_hidden_proto (_dl_open_hook);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined SHARED && !USE___THREAD
|
|
||||||
/* This is called by __pthread_initialize_minimal when it needs to use
|
|
||||||
malloc to set up the TLS state. We cannot do the full work of
|
|
||||||
ptmalloc_init (below) until __pthread_initialize_minimal has finished,
|
|
||||||
so it has to switch to using the special startup-time hooks while doing
|
|
||||||
those allocations. */
|
|
||||||
void
|
|
||||||
__libc_malloc_pthread_startup (bool first_time)
|
|
||||||
{
|
|
||||||
if (first_time)
|
|
||||||
{
|
|
||||||
ptmalloc_init_minimal ();
|
|
||||||
save_malloc_hook = __malloc_hook;
|
|
||||||
save_memalign_hook = __memalign_hook;
|
|
||||||
save_free_hook = __free_hook;
|
|
||||||
__malloc_hook = malloc_starter;
|
|
||||||
__memalign_hook = memalign_starter;
|
|
||||||
__free_hook = free_starter;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
__malloc_hook = save_malloc_hook;
|
|
||||||
__memalign_hook = save_memalign_hook;
|
|
||||||
__free_hook = save_free_hook;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -475,14 +443,7 @@ ptmalloc_init (void)
|
|||||||
if(__malloc_initialized >= 0) return;
|
if(__malloc_initialized >= 0) return;
|
||||||
__malloc_initialized = 0;
|
__malloc_initialized = 0;
|
||||||
|
|
||||||
#ifdef _LIBC
|
ptmalloc_init_minimal();
|
||||||
# if defined SHARED && !USE___THREAD
|
|
||||||
/* ptmalloc_init_minimal may already have been called via
|
|
||||||
__libc_malloc_pthread_startup, above. */
|
|
||||||
if (mp_.pagesize == 0)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
ptmalloc_init_minimal();
|
|
||||||
|
|
||||||
mutex_init(&main_arena.mutex);
|
mutex_init(&main_arena.mutex);
|
||||||
main_arena.next = &main_arena;
|
main_arena.next = &main_arena;
|
||||||
|
@ -417,7 +417,7 @@ memalign_check(alignment, bytes, caller)
|
|||||||
#ifndef NO_THREADS
|
#ifndef NO_THREADS
|
||||||
|
|
||||||
# ifdef _LIBC
|
# ifdef _LIBC
|
||||||
# if USE___THREAD || !defined SHARED
|
# ifndef SHARED
|
||||||
/* These routines are never needed in this configuration. */
|
/* These routines are never needed in this configuration. */
|
||||||
# define NO_STARTER
|
# define NO_STARTER
|
||||||
# endif
|
# endif
|
||||||
|
@ -1649,19 +1649,7 @@ static Void_t* realloc_check(Void_t* oldmem, size_t bytes,
|
|||||||
static Void_t* memalign_check(size_t alignment, size_t bytes,
|
static Void_t* memalign_check(size_t alignment, size_t bytes,
|
||||||
const Void_t *caller);
|
const Void_t *caller);
|
||||||
#ifndef NO_THREADS
|
#ifndef NO_THREADS
|
||||||
# ifdef _LIBC
|
/* These routines are never needed in this configuration. */
|
||||||
# if USE___THREAD || !defined SHARED
|
|
||||||
/* These routines are never needed in this configuration. */
|
|
||||||
# define NO_STARTER
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# ifdef NO_STARTER
|
|
||||||
# undef NO_STARTER
|
|
||||||
# else
|
|
||||||
static Void_t* malloc_starter(size_t sz, const Void_t *caller);
|
|
||||||
static Void_t* memalign_starter(size_t aln, size_t sz, const Void_t *caller);
|
|
||||||
static void free_starter(Void_t* mem, const Void_t *caller);
|
|
||||||
# endif
|
|
||||||
static Void_t* malloc_atfork(size_t sz, const Void_t *caller);
|
static Void_t* malloc_atfork(size_t sz, const Void_t *caller);
|
||||||
static void free_atfork(Void_t* mem, const Void_t *caller);
|
static void free_atfork(Void_t* mem, const Void_t *caller);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,20 @@
|
|||||||
2011-09-10 Ulrich Drepper <drepper@gmail.com>
|
2011-09-10 Ulrich Drepper <drepper@gmail.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Don't handle
|
||||||
|
!USE___THREAD.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/sem_post.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/sem_trywait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/sem_wait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise.
|
||||||
|
|
||||||
* tst-tls1.c: Support for __thread is now mandatory.
|
* tst-tls1.c: Support for __thread is now mandatory.
|
||||||
* tst-tls2.c: Likewise.
|
* tst-tls2.c: Likewise.
|
||||||
* tst-tls3.c: Likewise.
|
* tst-tls3.c: Likewise.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
|
/* Copyright (C) 2002,2003,2005,2007,2008,2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -81,18 +81,13 @@ __new_sem_post:
|
|||||||
4:
|
4:
|
||||||
#endif
|
#endif
|
||||||
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
||||||
#if USE___THREAD
|
#ifdef NO_TLS_DIRECT_SEG_REFS
|
||||||
# ifdef NO_TLS_DIRECT_SEG_REFS
|
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
addl %gs:0, %edx
|
addl %gs:0, %edx
|
||||||
movl $EINVAL, (%edx)
|
movl $EINVAL, (%edx)
|
||||||
# else
|
#else
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
movl $EINVAL, %gs:(%edx)
|
movl $EINVAL, %gs:(%edx)
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
call __errno_location@plt
|
|
||||||
movl $EINVAL, (%eax)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
@ -107,18 +102,13 @@ __new_sem_post:
|
|||||||
5:
|
5:
|
||||||
#endif
|
#endif
|
||||||
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
||||||
#if USE___THREAD
|
#ifdef NO_TLS_DIRECT_SEG_REFS
|
||||||
# ifdef NO_TLS_DIRECT_SEG_REFS
|
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
addl %gs:0, %edx
|
addl %gs:0, %edx
|
||||||
movl $EOVERFLOW, (%edx)
|
movl $EOVERFLOW, (%edx)
|
||||||
# else
|
#else
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
movl $EOVERFLOW, %gs:(%edx)
|
movl $EOVERFLOW, %gs:(%edx)
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
call __errno_location@plt
|
|
||||||
movl $EOVERFLOW, (%eax)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
|
/* Copyright (C) 2002-2005, 2007, 2009, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -154,18 +154,13 @@ sem_timedwait:
|
|||||||
4:
|
4:
|
||||||
#endif
|
#endif
|
||||||
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
||||||
#if USE___THREAD
|
#ifdef NO_TLS_DIRECT_SEG_REFS
|
||||||
# ifdef NO_TLS_DIRECT_SEG_REFS
|
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
addl %gs:0, %edx
|
addl %gs:0, %edx
|
||||||
movl %esi, (%edx)
|
movl %esi, (%edx)
|
||||||
# else
|
#else
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
movl %esi, %gs:(%edx)
|
movl %esi, %gs:(%edx)
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
call __errno_location@plt
|
|
||||||
movl %esi, (%eax)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
movl 28(%esp), %ebx /* Load semaphore address. */
|
movl 28(%esp), %ebx /* Load semaphore address. */
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005, 2007, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -49,18 +49,13 @@ __new_sem_trywait:
|
|||||||
3:
|
3:
|
||||||
#endif
|
#endif
|
||||||
addl $_GLOBAL_OFFSET_TABLE_, %ecx
|
addl $_GLOBAL_OFFSET_TABLE_, %ecx
|
||||||
#if USE___THREAD
|
#ifdef NO_TLS_DIRECT_SEG_REFS
|
||||||
# ifdef NO_TLS_DIRECT_SEG_REFS
|
|
||||||
movl errno@gotntpoff(%ecx), %edx
|
movl errno@gotntpoff(%ecx), %edx
|
||||||
addl %gs:0, %edx
|
addl %gs:0, %edx
|
||||||
movl $EAGAIN, (%edx)
|
movl $EAGAIN, (%edx)
|
||||||
# else
|
#else
|
||||||
movl errno@gotntpoff(%ecx), %edx
|
movl errno@gotntpoff(%ecx), %edx
|
||||||
movl $EAGAIN, %gs:(%edx)
|
movl $EAGAIN, %gs:(%edx)
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
call __errno_location@plt
|
|
||||||
movl $EAGAIN, (%eax)
|
|
||||||
#endif
|
#endif
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
ret
|
ret
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005, 2007, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -114,18 +114,13 @@ __new_sem_wait:
|
|||||||
8:
|
8:
|
||||||
#endif
|
#endif
|
||||||
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
||||||
#if USE___THREAD
|
#ifdef NO_TLS_DIRECT_SEG_REFS
|
||||||
# ifdef NO_TLS_DIRECT_SEG_REFS
|
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
addl %gs:0, %edx
|
addl %gs:0, %edx
|
||||||
movl %esi, (%edx)
|
movl %esi, (%edx)
|
||||||
# else
|
#else
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
movl %esi, %gs:(%edx)
|
movl %esi, %gs:(%edx)
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
call __errno_location@plt
|
|
||||||
movl %esi, (%eax)
|
|
||||||
#endif
|
#endif
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
|
|
||||||
@ -228,13 +223,13 @@ sem_wait_cleanup:
|
|||||||
.byte 14 # DW_CFA_def_cfa_offset
|
.byte 14 # DW_CFA_def_cfa_offset
|
||||||
.uleb128 8
|
.uleb128 8
|
||||||
.byte 0x83 # DW_CFA_offset %ebx
|
.byte 0x83 # DW_CFA_offset %ebx
|
||||||
.uleb128 2
|
.uleb128 2
|
||||||
.byte 4 # DW_CFA_advance_loc4
|
.byte 4 # DW_CFA_advance_loc4
|
||||||
.long .Lpush_esi-.Lpush_ebx
|
.long .Lpush_esi-.Lpush_ebx
|
||||||
.byte 14 # DW_CFA_def_cfa_offset
|
.byte 14 # DW_CFA_def_cfa_offset
|
||||||
.uleb128 12
|
.uleb128 12
|
||||||
.byte 0x86 # DW_CFA_offset %esi
|
.byte 0x86 # DW_CFA_offset %esi
|
||||||
.uleb128 3
|
.uleb128 3
|
||||||
.byte 4 # DW_CFA_advance_loc4
|
.byte 4 # DW_CFA_advance_loc4
|
||||||
.long .Lsub_esp-.Lpush_esi
|
.long .Lsub_esp-.Lpush_esi
|
||||||
.byte 14 # DW_CFA_def_cfa_offset
|
.byte 14 # DW_CFA_def_cfa_offset
|
||||||
@ -250,9 +245,9 @@ sem_wait_cleanup:
|
|||||||
.byte 14 # DW_CFA_def_cfa_offset
|
.byte 14 # DW_CFA_def_cfa_offset
|
||||||
.uleb128 16
|
.uleb128 16
|
||||||
.byte 0x83 # DW_CFA_offset %ebx
|
.byte 0x83 # DW_CFA_offset %ebx
|
||||||
.uleb128 2
|
.uleb128 2
|
||||||
.byte 0x86 # DW_CFA_offset %esi
|
.byte 0x86 # DW_CFA_offset %esi
|
||||||
.uleb128 3
|
.uleb128 3
|
||||||
.align 4
|
.align 4
|
||||||
.LENDFDE:
|
.LENDFDE:
|
||||||
|
|
||||||
@ -333,18 +328,13 @@ __old_sem_wait:
|
|||||||
4:
|
4:
|
||||||
#endif
|
#endif
|
||||||
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
||||||
#if USE___THREAD
|
#ifdef NO_TLS_DIRECT_SEG_REFS
|
||||||
# ifdef NO_TLS_DIRECT_SEG_REFS
|
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
addl %gs:0, %edx
|
addl %gs:0, %edx
|
||||||
movl %esi, (%edx)
|
movl %esi, (%edx)
|
||||||
# else
|
#else
|
||||||
movl errno@gotntpoff(%ebx), %edx
|
movl errno@gotntpoff(%ebx), %edx
|
||||||
movl %esi, %gs:(%edx)
|
movl %esi, %gs:(%edx)
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
call __errno_location@plt
|
|
||||||
movl %esi, (%eax)
|
|
||||||
#endif
|
#endif
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
jmp 5b
|
jmp 5b
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2004, 2006, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -27,13 +27,12 @@
|
|||||||
|
|
||||||
# undef PSEUDO
|
# undef PSEUDO
|
||||||
|
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define SYSDEP_CANCEL_ERRNO __libc_errno
|
||||||
# define SYSDEP_CANCEL_ERRNO __libc_errno
|
# else
|
||||||
# else
|
# define SYSDEP_CANCEL_ERRNO errno
|
||||||
# define SYSDEP_CANCEL_ERRNO errno
|
# endif
|
||||||
# endif
|
# define SYSDEP_CANCEL_ERROR(args) \
|
||||||
# define SYSDEP_CANCEL_ERROR(args) \
|
|
||||||
.section .gnu.linkonce.t.__syscall_error_##args, "ax"; \
|
.section .gnu.linkonce.t.__syscall_error_##args, "ax"; \
|
||||||
.align 32; \
|
.align 32; \
|
||||||
.proc __syscall_error_##args; \
|
.proc __syscall_error_##args; \
|
||||||
@ -53,28 +52,6 @@ __syscall_error_##args: \
|
|||||||
add loc4 = loc4, r13;; \
|
add loc4 = loc4, r13;; \
|
||||||
st4 [loc4] = loc3; \
|
st4 [loc4] = loc3; \
|
||||||
mov ar.pfs = loc0
|
mov ar.pfs = loc0
|
||||||
# else
|
|
||||||
# define SYSDEP_CANCEL_ERROR(args) \
|
|
||||||
.section .gnu.linkonce.t.__syscall_error_##args, "ax"; \
|
|
||||||
.align 32; \
|
|
||||||
.proc __syscall_error_##args; \
|
|
||||||
.global __syscall_error_##args; \
|
|
||||||
.hidden __syscall_error_##args; \
|
|
||||||
.size __syscall_error_##args, 64; \
|
|
||||||
__syscall_error_##args: \
|
|
||||||
.prologue; \
|
|
||||||
.regstk args, 5, args, 0; \
|
|
||||||
.save ar.pfs, loc0; \
|
|
||||||
.save rp, loc1; \
|
|
||||||
.body; \
|
|
||||||
mov loc4 = r1;; \
|
|
||||||
br.call.sptk.many b0 = __errno_location;; \
|
|
||||||
st4 [r8] = loc3; \
|
|
||||||
mov r1 = loc4; \
|
|
||||||
mov rp = loc1; \
|
|
||||||
mov r8 = -1; \
|
|
||||||
mov ar.pfs = loc0
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef USE_DL_SYSINFO
|
# ifndef USE_DL_SYSINFO
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
|
/* Copyright (C) 2003, 2004, 2007, 2008, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -65,7 +65,7 @@ __new_sem_post:
|
|||||||
|
|
||||||
3:
|
3:
|
||||||
mov #EOVERFLOW, r2
|
mov #EOVERFLOW, r2
|
||||||
4:
|
4:
|
||||||
mov.l r12, @-r15
|
mov.l r12, @-r15
|
||||||
mov.l r8, @-r15
|
mov.l r8, @-r15
|
||||||
sts.l pr, @-r15
|
sts.l pr, @-r15
|
||||||
@ -73,7 +73,6 @@ __new_sem_post:
|
|||||||
mov.l .Lgot3, r12
|
mov.l .Lgot3, r12
|
||||||
add r0, r12
|
add r0, r12
|
||||||
|
|
||||||
#if USE___THREAD
|
|
||||||
mov.l .Lerrno3, r0
|
mov.l .Lerrno3, r0
|
||||||
stc gbr, r1
|
stc gbr, r1
|
||||||
mov.l @(r0, r12), r0
|
mov.l @(r0, r12), r0
|
||||||
@ -84,14 +83,6 @@ __new_sem_post:
|
|||||||
.long errno@GOTTPOFF
|
.long errno@GOTTPOFF
|
||||||
.Lexit:
|
.Lexit:
|
||||||
mov.l r2, @r0
|
mov.l r2, @r0
|
||||||
#else
|
|
||||||
mov r2, r8
|
|
||||||
mov.l .Lerrloc3, r1
|
|
||||||
bsrf r1
|
|
||||||
nop
|
|
||||||
.Lerrloc3b:
|
|
||||||
mov r8, @r0
|
|
||||||
#endif
|
|
||||||
lds.l @r15+, pr
|
lds.l @r15+, pr
|
||||||
mov.l @r15+, r8
|
mov.l @r15+, r8
|
||||||
mov.l @r15+, r12
|
mov.l @r15+, r12
|
||||||
@ -103,9 +94,5 @@ __new_sem_post:
|
|||||||
.long SEM_VALUE_MAX
|
.long SEM_VALUE_MAX
|
||||||
.Lgot3:
|
.Lgot3:
|
||||||
.long _GLOBAL_OFFSET_TABLE_
|
.long _GLOBAL_OFFSET_TABLE_
|
||||||
#if !USE___THREAD
|
|
||||||
.Lerrloc3:
|
|
||||||
.long __errno_location@PLT-(.Lerrloc3b-.)
|
|
||||||
#endif
|
|
||||||
.size __new_sem_post,.-__new_sem_post
|
.size __new_sem_post,.-__new_sem_post
|
||||||
versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)
|
versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2003, 2004, 2007, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -131,7 +131,7 @@ sem_timedwait:
|
|||||||
mov r10, r4
|
mov r10, r4
|
||||||
bsrf r1
|
bsrf r1
|
||||||
mov r0, r10
|
mov r0, r10
|
||||||
.Ldisable0b:
|
.Ldisable0b:
|
||||||
mov r10, r0
|
mov r10, r0
|
||||||
.LcleanupEND:
|
.LcleanupEND:
|
||||||
|
|
||||||
@ -173,7 +173,6 @@ sem_timedwait:
|
|||||||
mov.l .Lgot2, r12
|
mov.l .Lgot2, r12
|
||||||
add r0, r12
|
add r0, r12
|
||||||
|
|
||||||
#if USE___THREAD
|
|
||||||
mov.l .Lerrno2, r0
|
mov.l .Lerrno2, r0
|
||||||
stc gbr, r1
|
stc gbr, r1
|
||||||
mov.l @(r0, r12), r0
|
mov.l @(r0, r12), r0
|
||||||
@ -181,14 +180,8 @@ sem_timedwait:
|
|||||||
add r1, r0
|
add r1, r0
|
||||||
.align 2
|
.align 2
|
||||||
.Lerrno2:
|
.Lerrno2:
|
||||||
.long errno@GOTTPOFF
|
.long errno@GOTTPOFF
|
||||||
.Lexit:
|
.Lexit:
|
||||||
#else
|
|
||||||
mov.l .Lerrloc2, r1
|
|
||||||
bsrf r1
|
|
||||||
nop
|
|
||||||
.Lerrloc2b:
|
|
||||||
#endif
|
|
||||||
mov.l r10, @r0
|
mov.l r10, @r0
|
||||||
DEC (@(NWAITERS,r8), r2)
|
DEC (@(NWAITERS,r8), r2)
|
||||||
bra 10b
|
bra 10b
|
||||||
@ -201,10 +194,6 @@ sem_timedwait:
|
|||||||
.long 1000000000
|
.long 1000000000
|
||||||
.Lgot2:
|
.Lgot2:
|
||||||
.long _GLOBAL_OFFSET_TABLE_
|
.long _GLOBAL_OFFSET_TABLE_
|
||||||
#if !USE___THREAD
|
|
||||||
.Lerrloc2:
|
|
||||||
.long __errno_location@PLT-(.Lerrloc2b-.)
|
|
||||||
#endif
|
|
||||||
.Lenable0:
|
.Lenable0:
|
||||||
.long __pthread_enable_asynccancel-.Lenable0b
|
.long __pthread_enable_asynccancel-.Lenable0b
|
||||||
.Ldisable0:
|
.Ldisable0:
|
||||||
@ -213,7 +202,7 @@ sem_timedwait:
|
|||||||
|
|
||||||
.type sem_wait_cleanup,@function
|
.type sem_wait_cleanup,@function
|
||||||
sem_wait_cleanup:
|
sem_wait_cleanup:
|
||||||
DEC (@(NWAITERS,r8), r2)
|
DEC (@(NWAITERS,r8), r2)
|
||||||
.LcallUR:
|
.LcallUR:
|
||||||
mov.l .Lresume, r1
|
mov.l .Lresume, r1
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
@ -314,25 +303,25 @@ sem_wait_cleanup:
|
|||||||
.byte 14 ! DW_CFA_def_cfa_offset
|
.byte 14 ! DW_CFA_def_cfa_offset
|
||||||
.uleb128 4
|
.uleb128 4
|
||||||
.byte 0x88 ! DW_CFA_offset r8
|
.byte 0x88 ! DW_CFA_offset r8
|
||||||
.uleb128 1
|
.uleb128 1
|
||||||
.byte 4 ! DW_CFA_advance_loc4
|
.byte 4 ! DW_CFA_advance_loc4
|
||||||
.ualong .Lpush_r9-.Lpush_r8
|
.ualong .Lpush_r9-.Lpush_r8
|
||||||
.byte 14 ! DW_CFA_def_cfa_offset
|
.byte 14 ! DW_CFA_def_cfa_offset
|
||||||
.uleb128 8
|
.uleb128 8
|
||||||
.byte 0x89 ! DW_CFA_offset r9
|
.byte 0x89 ! DW_CFA_offset r9
|
||||||
.uleb128 2
|
.uleb128 2
|
||||||
.byte 4 ! DW_CFA_advance_loc4
|
.byte 4 ! DW_CFA_advance_loc4
|
||||||
.ualong .Lpush_r10-.Lpush_r9
|
.ualong .Lpush_r10-.Lpush_r9
|
||||||
.byte 14 ! DW_CFA_def_cfa_offset
|
.byte 14 ! DW_CFA_def_cfa_offset
|
||||||
.uleb128 12
|
.uleb128 12
|
||||||
.byte 0x8a ! DW_CFA_offset r10
|
.byte 0x8a ! DW_CFA_offset r10
|
||||||
.uleb128 3
|
.uleb128 3
|
||||||
.byte 4 ! DW_CFA_advance_loc4
|
.byte 4 ! DW_CFA_advance_loc4
|
||||||
.ualong .Lpush_r12-.Lpush_r10
|
.ualong .Lpush_r12-.Lpush_r10
|
||||||
.byte 14 ! DW_CFA_def_cfa_offset
|
.byte 14 ! DW_CFA_def_cfa_offset
|
||||||
.uleb128 16
|
.uleb128 16
|
||||||
.byte 0x8c ! DW_CFA_offset r12
|
.byte 0x8c ! DW_CFA_offset r12
|
||||||
.uleb128 4
|
.uleb128 4
|
||||||
.byte 4 ! DW_CFA_advance_loc4
|
.byte 4 ! DW_CFA_advance_loc4
|
||||||
.ualong .Lpush_pr-.Lpush_r12
|
.ualong .Lpush_pr-.Lpush_r12
|
||||||
.byte 14 ! DW_CFA_def_cfa_offset
|
.byte 14 ! DW_CFA_def_cfa_offset
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2003, 2004, 2007, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -57,7 +57,6 @@ __new_sem_trywait:
|
|||||||
mov.l .Lgot1, r12
|
mov.l .Lgot1, r12
|
||||||
add r0, r12
|
add r0, r12
|
||||||
|
|
||||||
#if USE___THREAD
|
|
||||||
mov.l .Lerrno1, r0
|
mov.l .Lerrno1, r0
|
||||||
stc gbr, r1
|
stc gbr, r1
|
||||||
mov.l @(r0, r12), r0
|
mov.l @(r0, r12), r0
|
||||||
@ -67,12 +66,6 @@ __new_sem_trywait:
|
|||||||
.Lerrno1:
|
.Lerrno1:
|
||||||
.long errno@GOTTPOFF
|
.long errno@GOTTPOFF
|
||||||
.Lexit:
|
.Lexit:
|
||||||
#else
|
|
||||||
mov.l .Lerrloc1, r1
|
|
||||||
bsrf r1
|
|
||||||
nop
|
|
||||||
.Lerrloc1b:
|
|
||||||
#endif
|
|
||||||
mov.l r8, @r0
|
mov.l r8, @r0
|
||||||
lds.l @r15+, pr
|
lds.l @r15+, pr
|
||||||
mov.l @r15+, r8
|
mov.l @r15+, r8
|
||||||
@ -83,9 +76,5 @@ __new_sem_trywait:
|
|||||||
.align 2
|
.align 2
|
||||||
.Lgot1:
|
.Lgot1:
|
||||||
.long _GLOBAL_OFFSET_TABLE_
|
.long _GLOBAL_OFFSET_TABLE_
|
||||||
#if !USE___THREAD
|
|
||||||
.Lerrloc1:
|
|
||||||
.long __errno_location@PLT-(.Lerrloc1b-.)
|
|
||||||
#endif
|
|
||||||
.size __new_sem_trywait,.-__new_sem_trywait
|
.size __new_sem_trywait,.-__new_sem_trywait
|
||||||
versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1)
|
versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2003, 2004, 2007, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -68,7 +68,7 @@ __new_sem_wait:
|
|||||||
.Lafter_ret:
|
.Lafter_ret:
|
||||||
1:
|
1:
|
||||||
INC (@(NWAITERS,r8),r2)
|
INC (@(NWAITERS,r8),r2)
|
||||||
|
|
||||||
.LcleanupSTART:
|
.LcleanupSTART:
|
||||||
6:
|
6:
|
||||||
mov.l .Lenable0, r1
|
mov.l .Lenable0, r1
|
||||||
@ -96,7 +96,7 @@ __new_sem_wait:
|
|||||||
mov r10, r4
|
mov r10, r4
|
||||||
bsrf r1
|
bsrf r1
|
||||||
mov r0, r10
|
mov r0, r10
|
||||||
.Ldisable0b:
|
.Ldisable0b:
|
||||||
mov r10, r0
|
mov r10, r0
|
||||||
.LcleanupEND:
|
.LcleanupEND:
|
||||||
|
|
||||||
@ -131,7 +131,6 @@ __new_sem_wait:
|
|||||||
mov.l .Lgot0, r12
|
mov.l .Lgot0, r12
|
||||||
add r0, r12
|
add r0, r12
|
||||||
|
|
||||||
#if USE___THREAD
|
|
||||||
mov.l .Lerrno0, r0
|
mov.l .Lerrno0, r0
|
||||||
stc gbr, r1
|
stc gbr, r1
|
||||||
mov.l @(r0, r12), r0
|
mov.l @(r0, r12), r0
|
||||||
@ -141,12 +140,6 @@ __new_sem_wait:
|
|||||||
.Lerrno0:
|
.Lerrno0:
|
||||||
.long errno@GOTTPOFF
|
.long errno@GOTTPOFF
|
||||||
.Lexit:
|
.Lexit:
|
||||||
#else
|
|
||||||
mov.l .Lerrloc0, r1
|
|
||||||
bsrf r1
|
|
||||||
nop
|
|
||||||
.Lerrloc0b:
|
|
||||||
#endif
|
|
||||||
mov.l r8, @r0
|
mov.l r8, @r0
|
||||||
bra 9b
|
bra 9b
|
||||||
mov #-1, r0
|
mov #-1, r0
|
||||||
@ -154,10 +147,6 @@ __new_sem_wait:
|
|||||||
.align 2
|
.align 2
|
||||||
.Lgot0:
|
.Lgot0:
|
||||||
.long _GLOBAL_OFFSET_TABLE_
|
.long _GLOBAL_OFFSET_TABLE_
|
||||||
#if !USE___THREAD
|
|
||||||
.Lerrloc0:
|
|
||||||
.long __errno_location@PLT-(.Lerrloc0b-.)
|
|
||||||
#endif
|
|
||||||
.Lenable0:
|
.Lenable0:
|
||||||
.long __pthread_enable_asynccancel-.Lenable0b
|
.long __pthread_enable_asynccancel-.Lenable0b
|
||||||
.Ldisable0:
|
.Ldisable0:
|
||||||
@ -168,7 +157,7 @@ __new_sem_wait:
|
|||||||
|
|
||||||
.type sem_wait_cleanup,@function
|
.type sem_wait_cleanup,@function
|
||||||
sem_wait_cleanup:
|
sem_wait_cleanup:
|
||||||
DEC (@(NWAITERS,r8), r2)
|
DEC (@(NWAITERS,r8), r2)
|
||||||
.LcallUR:
|
.LcallUR:
|
||||||
mov.l .Lresume, r1
|
mov.l .Lresume, r1
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
@ -269,25 +258,25 @@ sem_wait_cleanup:
|
|||||||
.byte 14 ! DW_CFA_def_cfa_offset
|
.byte 14 ! DW_CFA_def_cfa_offset
|
||||||
.uleb128 4
|
.uleb128 4
|
||||||
.byte 0x88 ! DW_CFA_offset r8
|
.byte 0x88 ! DW_CFA_offset r8
|
||||||
.uleb128 1
|
.uleb128 1
|
||||||
.byte 4 ! DW_CFA_advance_loc4
|
.byte 4 ! DW_CFA_advance_loc4
|
||||||
.ualong .Lpush_r10-.Lpush_r8
|
.ualong .Lpush_r10-.Lpush_r8
|
||||||
.byte 14 ! DW_CFA_def_cfa_offset
|
.byte 14 ! DW_CFA_def_cfa_offset
|
||||||
.uleb128 8
|
.uleb128 8
|
||||||
.byte 0x8a ! DW_CFA_offset r10
|
.byte 0x8a ! DW_CFA_offset r10
|
||||||
.uleb128 2
|
.uleb128 2
|
||||||
.byte 4 ! DW_CFA_advance_loc4
|
.byte 4 ! DW_CFA_advance_loc4
|
||||||
.ualong .Lpush_r12-.Lpush_r10
|
.ualong .Lpush_r12-.Lpush_r10
|
||||||
.byte 14 ! DW_CFA_def_cfa_offset
|
.byte 14 ! DW_CFA_def_cfa_offset
|
||||||
.uleb128 12
|
.uleb128 12
|
||||||
.byte 0x8c ! DW_CFA_offset r12
|
.byte 0x8c ! DW_CFA_offset r12
|
||||||
.uleb128 3
|
.uleb128 3
|
||||||
.byte 4 ! DW_CFA_advance_loc4
|
.byte 4 ! DW_CFA_advance_loc4
|
||||||
.ualong .Lpush_pr-.Lpush_r12
|
.ualong .Lpush_pr-.Lpush_r12
|
||||||
.byte 14 ! DW_CFA_def_cfa_offset
|
.byte 14 ! DW_CFA_def_cfa_offset
|
||||||
.uleb128 16
|
.uleb128 16
|
||||||
.byte 0x91 ! DW_CFA_offset pr
|
.byte 0x91 ! DW_CFA_offset pr
|
||||||
.uleb128 4
|
.uleb128 4
|
||||||
.align 4
|
.align 4
|
||||||
.LENDFDE:
|
.LENDFDE:
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
|
/* Copyright (C) 2002,2003,2005,2007,2008,2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -62,29 +62,15 @@ sem_post:
|
|||||||
retq
|
retq
|
||||||
|
|
||||||
1:
|
1:
|
||||||
#if USE___THREAD
|
|
||||||
movl $EINVAL, %eax
|
movl $EINVAL, %eax
|
||||||
#else
|
|
||||||
callq __errno_location@plt
|
|
||||||
movl $EINVAL, %edx
|
|
||||||
#endif
|
|
||||||
jmp 4f
|
jmp 4f
|
||||||
|
|
||||||
3:
|
3:
|
||||||
#if USE___THREAD
|
|
||||||
movl $EOVERFLOW, %eax
|
movl $EOVERFLOW, %eax
|
||||||
#else
|
|
||||||
callq __errno_location@plt
|
|
||||||
movl $EOVERFLOW, %edx
|
|
||||||
#endif
|
|
||||||
|
|
||||||
4:
|
4:
|
||||||
#if USE___THREAD
|
|
||||||
movq errno@gottpoff(%rip), %rdx
|
movq errno@gottpoff(%rip), %rdx
|
||||||
movl %eax, %fs:(%rdx)
|
movl %eax, %fs:(%rdx)
|
||||||
#else
|
|
||||||
movl %edx, (%rax)
|
|
||||||
#endif
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
retq
|
retq
|
||||||
.size sem_post,.-sem_post
|
.size sem_post,.-sem_post
|
||||||
|
@ -143,39 +143,24 @@ sem_timedwait:
|
|||||||
|
|
||||||
cfi_adjust_cfa_offset(8)
|
cfi_adjust_cfa_offset(8)
|
||||||
3: negq %r9
|
3: negq %r9
|
||||||
#if USE___THREAD
|
|
||||||
movq errno@gottpoff(%rip), %rdx
|
movq errno@gottpoff(%rip), %rdx
|
||||||
movl %r9d, %fs:(%rdx)
|
movl %r9d, %fs:(%rdx)
|
||||||
#else
|
|
||||||
callq __errno_location@plt
|
|
||||||
movl %r9d, (%rax)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
jmp 15b
|
jmp 15b
|
||||||
|
|
||||||
cfi_adjust_cfa_offset(-8)
|
cfi_adjust_cfa_offset(-8)
|
||||||
6:
|
6:
|
||||||
#if USE___THREAD
|
|
||||||
movq errno@gottpoff(%rip), %rdx
|
movq errno@gottpoff(%rip), %rdx
|
||||||
movl $EINVAL, %fs:(%rdx)
|
movl $EINVAL, %fs:(%rdx)
|
||||||
#else
|
|
||||||
callq __errno_location@plt
|
|
||||||
movl $EINVAL, (%rax)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
|
|
||||||
retq
|
retq
|
||||||
|
|
||||||
16:
|
16:
|
||||||
#if USE___THREAD
|
|
||||||
movq errno@gottpoff(%rip), %rdx
|
movq errno@gottpoff(%rip), %rdx
|
||||||
movl $ETIMEDOUT, %fs:(%rdx)
|
movl $ETIMEDOUT, %fs:(%rdx)
|
||||||
#else
|
|
||||||
callq __errno_location@plt
|
|
||||||
movl $ETIMEDOUT, (%rax)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
|
|
||||||
@ -303,13 +288,8 @@ sem_timedwait:
|
|||||||
cfi_rel_offset(%r14, STACKFRAME)
|
cfi_rel_offset(%r14, STACKFRAME)
|
||||||
33: negq %r14
|
33: negq %r14
|
||||||
36:
|
36:
|
||||||
#if USE___THREAD
|
|
||||||
movq errno@gottpoff(%rip), %rdx
|
movq errno@gottpoff(%rip), %rdx
|
||||||
movl %r14d, %fs:(%rdx)
|
movl %r14d, %fs:(%rdx)
|
||||||
#else
|
|
||||||
callq __errno_location@plt
|
|
||||||
movl %r14d, (%rax)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
jmp 45b
|
jmp 45b
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005, 2007, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -41,13 +41,8 @@ sem_trywait:
|
|||||||
retq
|
retq
|
||||||
|
|
||||||
1:
|
1:
|
||||||
#if USE___THREAD
|
|
||||||
movq errno@gottpoff(%rip), %rdx
|
movq errno@gottpoff(%rip), %rdx
|
||||||
movl $EAGAIN, %fs:(%rdx)
|
movl $EAGAIN, %fs:(%rdx)
|
||||||
#else
|
|
||||||
callq __errno_location@plt
|
|
||||||
movl $EAGAIN, (%rax)
|
|
||||||
#endif
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
retq
|
retq
|
||||||
.size sem_trywait,.-sem_trywait
|
.size sem_trywait,.-sem_trywait
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2005, 2007, 2009, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -125,14 +125,8 @@ sem_wait:
|
|||||||
|
|
||||||
cfi_adjust_cfa_offset(8)
|
cfi_adjust_cfa_offset(8)
|
||||||
4: negq %rcx
|
4: negq %rcx
|
||||||
#if USE___THREAD
|
|
||||||
movq errno@gottpoff(%rip), %rdx
|
movq errno@gottpoff(%rip), %rdx
|
||||||
movl %ecx, %fs:(%rdx)
|
movl %ecx, %fs:(%rdx)
|
||||||
#else
|
|
||||||
# error "not supported. %rcx and %rdi must be preserved"
|
|
||||||
callq __errno_location@plt
|
|
||||||
movl %ecx, (%rax)
|
|
||||||
#endif
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
|
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1996, 97, 98, 2002, 2003 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 97, 98, 2002, 2003, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -19,27 +19,10 @@
|
|||||||
#include <resolv.h>
|
#include <resolv.h>
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
|
|
||||||
#if ! USE___THREAD
|
|
||||||
|
|
||||||
# undef _res
|
|
||||||
extern struct __res_state _res;
|
|
||||||
|
|
||||||
/* When threaded, _res may be a per-thread variable. */
|
|
||||||
struct __res_state *
|
|
||||||
weak_const_function
|
|
||||||
__res_state (void)
|
|
||||||
{
|
|
||||||
return &_res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
struct __res_state *
|
struct __res_state *
|
||||||
__res_state (void)
|
__res_state (void)
|
||||||
{
|
{
|
||||||
return __resp;
|
return __resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
libc_hidden_def (__res_state)
|
libc_hidden_def (__res_state)
|
||||||
|
@ -126,12 +126,10 @@ struct __res_state _res __attribute__((section (".bss")));
|
|||||||
|
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
|
|
||||||
#if USE___THREAD
|
|
||||||
#undef __resp
|
#undef __resp
|
||||||
__thread struct __res_state *__resp = &_res;
|
__thread struct __res_state *__resp = &_res;
|
||||||
extern __thread struct __res_state *__libc_resp
|
extern __thread struct __res_state *__libc_resp
|
||||||
__attribute__ ((alias ("__resp"))) attribute_hidden;
|
__attribute__ ((alias ("__resp"))) attribute_hidden;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* We declare this with compat_symbol so that it's not
|
/* We declare this with compat_symbol so that it's not
|
||||||
visible at link time. Programs must use the accessor functions. */
|
visible at link time. Programs must use the accessor functions. */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. i386 version.
|
/* Machine-dependent ELF dynamic relocation inline functions. i386 version.
|
||||||
Copyright (C) 1995-2005, 2006, 2009 Free Software Foundation, Inc.
|
Copyright (C) 1995-2005, 2006, 2009, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -243,18 +243,12 @@ _dl_start_user:\n\
|
|||||||
define the value.
|
define the value.
|
||||||
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
||||||
of the main executable's symbols, as for a COPY reloc. */
|
of the main executable's symbols, as for a COPY reloc. */
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
|
||||||
# define elf_machine_type_class(type) \
|
# define elf_machine_type_class(type) \
|
||||||
((((type) == R_386_JMP_SLOT || (type) == R_386_TLS_DTPMOD32 \
|
((((type) == R_386_JMP_SLOT || (type) == R_386_TLS_DTPMOD32 \
|
||||||
|| (type) == R_386_TLS_DTPOFF32 || (type) == R_386_TLS_TPOFF32 \
|
|| (type) == R_386_TLS_DTPOFF32 || (type) == R_386_TLS_TPOFF32 \
|
||||||
|| (type) == R_386_TLS_TPOFF || (type) == R_386_TLS_DESC) \
|
|| (type) == R_386_TLS_TPOFF || (type) == R_386_TLS_DESC) \
|
||||||
* ELF_RTYPE_CLASS_PLT) \
|
* ELF_RTYPE_CLASS_PLT) \
|
||||||
| (((type) == R_386_COPY) * ELF_RTYPE_CLASS_COPY))
|
| (((type) == R_386_COPY) * ELF_RTYPE_CLASS_COPY))
|
||||||
#else
|
|
||||||
# define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_386_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
|
|
||||||
| (((type) == R_386_COPY) * ELF_RTYPE_CLASS_COPY))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||||
#define ELF_MACHINE_JMP_SLOT R_386_JMP_SLOT
|
#define ELF_MACHINE_JMP_SLOT R_386_JMP_SLOT
|
||||||
@ -357,44 +351,43 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
*reloc_addr = value;
|
*reloc_addr = value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
# if !defined RTLD_BOOTSTRAP || USE___THREAD
|
|
||||||
case R_386_TLS_DTPMOD32:
|
case R_386_TLS_DTPMOD32:
|
||||||
# ifdef RTLD_BOOTSTRAP
|
# ifdef RTLD_BOOTSTRAP
|
||||||
/* During startup the dynamic linker is always the module
|
/* During startup the dynamic linker is always the module
|
||||||
with index 1.
|
with index 1.
|
||||||
XXX If this relocation is necessary move before RESOLVE
|
XXX If this relocation is necessary move before RESOLVE
|
||||||
call. */
|
call. */
|
||||||
*reloc_addr = 1;
|
*reloc_addr = 1;
|
||||||
# else
|
# else
|
||||||
/* Get the information from the link map returned by the
|
/* Get the information from the link map returned by the
|
||||||
resolv function. */
|
resolv function. */
|
||||||
if (sym_map != NULL)
|
if (sym_map != NULL)
|
||||||
*reloc_addr = sym_map->l_tls_modid;
|
*reloc_addr = sym_map->l_tls_modid;
|
||||||
# endif
|
# endif
|
||||||
break;
|
break;
|
||||||
case R_386_TLS_DTPOFF32:
|
case R_386_TLS_DTPOFF32:
|
||||||
# ifndef RTLD_BOOTSTRAP
|
# ifndef RTLD_BOOTSTRAP
|
||||||
/* During relocation all TLS symbols are defined and used.
|
/* During relocation all TLS symbols are defined and used.
|
||||||
Therefore the offset is already correct. */
|
Therefore the offset is already correct. */
|
||||||
if (sym != NULL)
|
if (sym != NULL)
|
||||||
*reloc_addr = sym->st_value;
|
*reloc_addr = sym->st_value;
|
||||||
# endif
|
# endif
|
||||||
break;
|
break;
|
||||||
case R_386_TLS_DESC:
|
case R_386_TLS_DESC:
|
||||||
{
|
{
|
||||||
struct tlsdesc volatile *td =
|
struct tlsdesc volatile *td =
|
||||||
(struct tlsdesc volatile *)reloc_addr;
|
(struct tlsdesc volatile *)reloc_addr;
|
||||||
|
|
||||||
# ifndef RTLD_BOOTSTRAP
|
# ifndef RTLD_BOOTSTRAP
|
||||||
if (! sym)
|
if (! sym)
|
||||||
td->entry = _dl_tlsdesc_undefweak;
|
td->entry = _dl_tlsdesc_undefweak;
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
{
|
{
|
||||||
# ifndef RTLD_BOOTSTRAP
|
# ifndef RTLD_BOOTSTRAP
|
||||||
# ifndef SHARED
|
# ifndef SHARED
|
||||||
CHECK_STATIC_TLS (map, sym_map);
|
CHECK_STATIC_TLS (map, sym_map);
|
||||||
# else
|
# else
|
||||||
if (!TRY_STATIC_TLS (map, sym_map))
|
if (!TRY_STATIC_TLS (map, sym_map))
|
||||||
{
|
{
|
||||||
td->arg = _dl_make_tlsdesc_dynamic
|
td->arg = _dl_make_tlsdesc_dynamic
|
||||||
@ -402,8 +395,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
td->entry = _dl_tlsdesc_dynamic;
|
td->entry = _dl_tlsdesc_dynamic;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
# endif
|
|
||||||
# endif
|
# endif
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
td->arg = (void*)(sym->st_value - sym_map->l_tls_offset
|
td->arg = (void*)(sym->st_value - sym_map->l_tls_offset
|
||||||
+ (ElfW(Word))td->arg);
|
+ (ElfW(Word))td->arg);
|
||||||
@ -426,13 +419,13 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
CHECK_STATIC_TLS (map, sym_map);
|
CHECK_STATIC_TLS (map, sym_map);
|
||||||
*reloc_addr += sym_map->l_tls_offset - sym->st_value;
|
*reloc_addr += sym_map->l_tls_offset - sym->st_value;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
break;
|
break;
|
||||||
case R_386_TLS_TPOFF:
|
case R_386_TLS_TPOFF:
|
||||||
/* The offset is negative, forward from the thread pointer. */
|
/* The offset is negative, forward from the thread pointer. */
|
||||||
# ifdef RTLD_BOOTSTRAP
|
# ifdef RTLD_BOOTSTRAP
|
||||||
*reloc_addr += sym->st_value - map->l_tls_offset;
|
*reloc_addr += sym->st_value - map->l_tls_offset;
|
||||||
# else
|
# else
|
||||||
/* We know the offset of object the symbol is contained in.
|
/* We know the offset of object the symbol is contained in.
|
||||||
It is a negative value which will be added to the
|
It is a negative value which will be added to the
|
||||||
thread pointer. */
|
thread pointer. */
|
||||||
@ -441,9 +434,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
CHECK_STATIC_TLS (map, sym_map);
|
CHECK_STATIC_TLS (map, sym_map);
|
||||||
*reloc_addr += sym->st_value - sym_map->l_tls_offset;
|
*reloc_addr += sym->st_value - sym_map->l_tls_offset;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
break;
|
break;
|
||||||
# endif /* use TLS */
|
|
||||||
|
|
||||||
# ifndef RTLD_BOOTSTRAP
|
# ifndef RTLD_BOOTSTRAP
|
||||||
case R_386_32:
|
case R_386_32:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. IA-64 version.
|
/* Machine-dependent ELF dynamic relocation inline functions. IA-64 version.
|
||||||
Copyright (C) 1995-1997, 2000-2004, 2005, 2006 Free Software Foundation, Inc.
|
Copyright (C) 1995-1997, 2000-2006, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -311,15 +311,10 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
of the main executable's symbols, as for a COPY reloc, which we don't
|
of the main executable's symbols, as for a COPY reloc, which we don't
|
||||||
use. */
|
use. */
|
||||||
/* ??? Ignore *MSB for now. */
|
/* ??? Ignore *MSB for now. */
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
|
||||||
#define elf_machine_type_class(type) \
|
#define elf_machine_type_class(type) \
|
||||||
(((type) == R_IA64_IPLTLSB || (type) == R_IA64_DTPMOD64LSB \
|
(((type) == R_IA64_IPLTLSB || (type) == R_IA64_DTPMOD64LSB \
|
||||||
|| (type) == R_IA64_DTPREL64LSB || (type) == R_IA64_TPREL64LSB) \
|
|| (type) == R_IA64_DTPREL64LSB || (type) == R_IA64_TPREL64LSB) \
|
||||||
* ELF_RTYPE_CLASS_PLT)
|
* ELF_RTYPE_CLASS_PLT)
|
||||||
#else
|
|
||||||
#define elf_machine_type_class(type) \
|
|
||||||
(((type) == R_IA64_IPLTLSB) * ELF_RTYPE_CLASS_PLT)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||||
#define ELF_MACHINE_JMP_SLOT R_IA64_IPLTLSB
|
#define ELF_MACHINE_JMP_SLOT R_IA64_IPLTLSB
|
||||||
@ -405,7 +400,7 @@ elf_machine_rela (struct link_map *map,
|
|||||||
/* Already done in dynamic linker. */
|
/* Already done in dynamic linker. */
|
||||||
if (map != &GL(dl_rtld_map))
|
if (map != &GL(dl_rtld_map))
|
||||||
# endif
|
# endif
|
||||||
value += map->l_addr;
|
value += map->l_addr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -417,7 +412,7 @@ elf_machine_rela (struct link_map *map,
|
|||||||
|
|
||||||
/* RESOLVE_MAP() will return NULL if it fail to locate the symbol. */
|
/* RESOLVE_MAP() will return NULL if it fail to locate the symbol. */
|
||||||
if ((sym_map = RESOLVE_MAP (&sym, version, r_type)))
|
if ((sym_map = RESOLVE_MAP (&sym, version, r_type)))
|
||||||
{
|
{
|
||||||
value = sym_map->l_addr + sym->st_value + reloc->r_addend;
|
value = sym_map->l_addr + sym->st_value + reloc->r_addend;
|
||||||
|
|
||||||
if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DIR64LSB))
|
if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DIR64LSB))
|
||||||
@ -432,26 +427,24 @@ elf_machine_rela (struct link_map *map,
|
|||||||
value = _dl_make_fptr (sym_map, sym, value);
|
value = _dl_make_fptr (sym_map, sym, value);
|
||||||
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_PCREL64LSB))
|
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_PCREL64LSB))
|
||||||
value -= (Elf64_Addr) reloc_addr & -16;
|
value -= (Elf64_Addr) reloc_addr & -16;
|
||||||
#if !defined RTLD_BOOTSTRAP || defined USE___THREAD
|
|
||||||
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DTPMOD64LSB))
|
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DTPMOD64LSB))
|
||||||
# ifdef RTLD_BOOTSTRAP
|
#ifdef RTLD_BOOTSTRAP
|
||||||
/* During startup the dynamic linker is always index 1. */
|
/* During startup the dynamic linker is always index 1. */
|
||||||
value = 1;
|
value = 1;
|
||||||
# else
|
#else
|
||||||
/* Get the information from the link map returned by the
|
/* Get the information from the link map returned by the
|
||||||
resolv function. */
|
resolv function. */
|
||||||
value = sym_map->l_tls_modid;
|
value = sym_map->l_tls_modid;
|
||||||
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DTPREL64LSB))
|
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DTPREL64LSB))
|
||||||
value -= sym_map->l_addr;
|
value -= sym_map->l_addr;
|
||||||
# endif
|
#endif
|
||||||
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_TPREL64LSB))
|
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_TPREL64LSB))
|
||||||
{
|
{
|
||||||
# ifndef RTLD_BOOTSTRAP
|
#ifndef RTLD_BOOTSTRAP
|
||||||
CHECK_STATIC_TLS (map, sym_map);
|
CHECK_STATIC_TLS (map, sym_map);
|
||||||
# endif
|
#endif
|
||||||
value += sym_map->l_tls_offset - sym_map->l_addr;
|
value += sym_map->l_tls_offset - sym_map->l_addr;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
_dl_reloc_bad_type (map, r_type, 0);
|
_dl_reloc_bad_type (map, r_type, 0);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. PowerPC version.
|
/* Machine-dependent ELF dynamic relocation inline functions. PowerPC version.
|
||||||
Copyright (C) 1995-2002, 2003, 2005, 2006 Free Software Foundation, Inc.
|
Copyright (C) 1995-2003, 2005, 2006, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -135,7 +135,6 @@ __elf_preferred_address(struct link_map *loader, size_t maplength,
|
|||||||
/* We never want to use a PLT entry as the destination of a
|
/* We never want to use a PLT entry as the destination of a
|
||||||
reloc, when what is being relocated is a branch. This is
|
reloc, when what is being relocated is a branch. This is
|
||||||
partly for efficiency, but mostly so we avoid loops. */
|
partly for efficiency, but mostly so we avoid loops. */
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
|
||||||
#define elf_machine_type_class(type) \
|
#define elf_machine_type_class(type) \
|
||||||
((((type) == R_PPC_JMP_SLOT \
|
((((type) == R_PPC_JMP_SLOT \
|
||||||
|| (type) == R_PPC_REL24 \
|
|| (type) == R_PPC_REL24 \
|
||||||
@ -143,13 +142,6 @@ __elf_preferred_address(struct link_map *loader, size_t maplength,
|
|||||||
&& (type) <= R_PPC_DTPREL32) \
|
&& (type) <= R_PPC_DTPREL32) \
|
||||||
|| (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \
|
|| (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \
|
||||||
| (((type) == R_PPC_COPY) * ELF_RTYPE_CLASS_COPY))
|
| (((type) == R_PPC_COPY) * ELF_RTYPE_CLASS_COPY))
|
||||||
#else
|
|
||||||
#define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_PPC_JMP_SLOT \
|
|
||||||
|| (type) == R_PPC_REL24 \
|
|
||||||
|| (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \
|
|
||||||
| (((type) == R_PPC_COPY) * ELF_RTYPE_CLASS_COPY))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||||
#define ELF_MACHINE_JMP_SLOT R_PPC_JMP_SLOT
|
#define ELF_MACHINE_JMP_SLOT R_PPC_JMP_SLOT
|
||||||
@ -331,8 +323,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
*reloc_addr = value;
|
*reloc_addr = value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \
|
#ifndef RESOLVE_CONFLICT_FIND_MAP
|
||||||
&& !defined RESOLVE_CONFLICT_FIND_MAP
|
|
||||||
# ifdef RTLD_BOOTSTRAP
|
# ifdef RTLD_BOOTSTRAP
|
||||||
# define NOT_BOOTSTRAP 0
|
# define NOT_BOOTSTRAP 0
|
||||||
# else
|
# else
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions.
|
/* Machine-dependent ELF dynamic relocation inline functions.
|
||||||
PowerPC64 version.
|
PowerPC64 version.
|
||||||
Copyright 1995-2005, 2006, 2008, 2010 Free Software Foundation, Inc.
|
Copyright 1995-2005, 2006, 2008, 2010, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -376,9 +376,9 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
|
|||||||
branch using two instructions; Past that point,
|
branch using two instructions; Past that point,
|
||||||
glink uses three instructions. */
|
glink uses three instructions. */
|
||||||
if (i < 0x8000)
|
if (i < 0x8000)
|
||||||
glink_offset += 2;
|
glink_offset += 2;
|
||||||
else
|
else
|
||||||
glink_offset += 3;
|
glink_offset += 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now, we've modified data. We need to write the changes from
|
/* Now, we've modified data. We need to write the changes from
|
||||||
@ -492,10 +492,10 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
#define dont_expect(X) __builtin_expect ((X), 0)
|
#define dont_expect(X) __builtin_expect ((X), 0)
|
||||||
|
|
||||||
extern void _dl_reloc_overflow (struct link_map *map,
|
extern void _dl_reloc_overflow (struct link_map *map,
|
||||||
const char *name,
|
const char *name,
|
||||||
Elf64_Addr *const reloc_addr,
|
Elf64_Addr *const reloc_addr,
|
||||||
const Elf64_Sym *refsym)
|
const Elf64_Sym *refsym)
|
||||||
attribute_hidden;
|
attribute_hidden;
|
||||||
|
|
||||||
auto inline void __attribute__ ((always_inline))
|
auto inline void __attribute__ ((always_inline))
|
||||||
elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
|
elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
|
||||||
@ -505,7 +505,6 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
|
|||||||
*reloc_addr = l_addr + reloc->r_addend;
|
*reloc_addr = l_addr + reloc->r_addend;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
|
||||||
/* This computes the value used by TPREL* relocs. */
|
/* This computes the value used by TPREL* relocs. */
|
||||||
auto inline Elf64_Addr __attribute__ ((always_inline, const))
|
auto inline Elf64_Addr __attribute__ ((always_inline, const))
|
||||||
elf_machine_tprel (struct link_map *map,
|
elf_machine_tprel (struct link_map *map,
|
||||||
@ -513,18 +512,17 @@ elf_machine_tprel (struct link_map *map,
|
|||||||
const Elf64_Sym *sym,
|
const Elf64_Sym *sym,
|
||||||
const Elf64_Rela *reloc)
|
const Elf64_Rela *reloc)
|
||||||
{
|
{
|
||||||
# ifndef RTLD_BOOTSTRAP
|
#ifndef RTLD_BOOTSTRAP
|
||||||
if (sym_map)
|
if (sym_map)
|
||||||
{
|
{
|
||||||
CHECK_STATIC_TLS (map, sym_map);
|
CHECK_STATIC_TLS (map, sym_map);
|
||||||
# endif
|
#endif
|
||||||
return TLS_TPREL_VALUE (sym_map, sym, reloc);
|
return TLS_TPREL_VALUE (sym_map, sym, reloc);
|
||||||
# ifndef RTLD_BOOTSTRAP
|
#ifndef RTLD_BOOTSTRAP
|
||||||
}
|
}
|
||||||
# endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Call function at address VALUE (an OPD entry) to resolve ifunc relocs. */
|
/* Call function at address VALUE (an OPD entry) to resolve ifunc relocs. */
|
||||||
auto inline Elf64_Addr __attribute__ ((always_inline))
|
auto inline Elf64_Addr __attribute__ ((always_inline))
|
||||||
@ -611,26 +609,25 @@ elf_machine_rela (struct link_map *map,
|
|||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
|
||||||
case R_PPC64_DTPMOD64:
|
case R_PPC64_DTPMOD64:
|
||||||
# ifdef RTLD_BOOTSTRAP
|
#ifdef RTLD_BOOTSTRAP
|
||||||
/* During startup the dynamic linker is always index 1. */
|
/* During startup the dynamic linker is always index 1. */
|
||||||
*reloc_addr = 1;
|
*reloc_addr = 1;
|
||||||
# else
|
#else
|
||||||
/* Get the information from the link map returned by the
|
/* Get the information from the link map returned by the
|
||||||
resolve function. */
|
resolve function. */
|
||||||
if (sym_map != NULL)
|
if (sym_map != NULL)
|
||||||
*reloc_addr = sym_map->l_tls_modid;
|
*reloc_addr = sym_map->l_tls_modid;
|
||||||
# endif
|
#endif
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case R_PPC64_DTPREL64:
|
case R_PPC64_DTPREL64:
|
||||||
/* During relocation all TLS symbols are defined and used.
|
/* During relocation all TLS symbols are defined and used.
|
||||||
Therefore the offset is already correct. */
|
Therefore the offset is already correct. */
|
||||||
# ifndef RTLD_BOOTSTRAP
|
#ifndef RTLD_BOOTSTRAP
|
||||||
if (sym_map != NULL)
|
if (sym_map != NULL)
|
||||||
*reloc_addr = TLS_DTPREL_VALUE (sym, reloc);
|
*reloc_addr = TLS_DTPREL_VALUE (sym, reloc);
|
||||||
# endif
|
#endif
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case R_PPC64_TPREL64:
|
case R_PPC64_TPREL64:
|
||||||
@ -640,21 +637,21 @@ elf_machine_rela (struct link_map *map,
|
|||||||
case R_PPC64_TPREL16_LO_DS:
|
case R_PPC64_TPREL16_LO_DS:
|
||||||
value = elf_machine_tprel (map, sym_map, sym, reloc);
|
value = elf_machine_tprel (map, sym_map, sym, reloc);
|
||||||
if (dont_expect ((value & 3) != 0))
|
if (dont_expect ((value & 3) != 0))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_TPREL16_LO_DS", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_TPREL16_LO_DS", reloc_addr, refsym);
|
||||||
BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
|
BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_PPC64_TPREL16_DS:
|
case R_PPC64_TPREL16_DS:
|
||||||
value = elf_machine_tprel (map, sym_map, sym, reloc);
|
value = elf_machine_tprel (map, sym_map, sym, reloc);
|
||||||
if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
|
if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_TPREL16_DS", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_TPREL16_DS", reloc_addr, refsym);
|
||||||
BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
|
BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_PPC64_TPREL16:
|
case R_PPC64_TPREL16:
|
||||||
value = elf_machine_tprel (map, sym_map, sym, reloc);
|
value = elf_machine_tprel (map, sym_map, sym, reloc);
|
||||||
if (dont_expect ((value + 0x8000) >= 0x10000))
|
if (dont_expect ((value + 0x8000) >= 0x10000))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_TPREL16", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_TPREL16", reloc_addr, refsym);
|
||||||
*(Elf64_Half *) reloc_addr = PPC_LO (value);
|
*(Elf64_Half *) reloc_addr = PPC_LO (value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -692,12 +689,11 @@ elf_machine_rela (struct link_map *map,
|
|||||||
value = elf_machine_tprel (map, sym_map, sym, reloc);
|
value = elf_machine_tprel (map, sym_map, sym, reloc);
|
||||||
*(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value);
|
*(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value);
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */
|
#ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */
|
||||||
case R_PPC64_ADDR16_LO_DS:
|
case R_PPC64_ADDR16_LO_DS:
|
||||||
if (dont_expect ((value & 3) != 0))
|
if (dont_expect ((value & 3) != 0))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_ADDR16_LO_DS", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_ADDR16_LO_DS", reloc_addr, refsym);
|
||||||
BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
|
BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -715,29 +711,29 @@ elf_machine_rela (struct link_map *map,
|
|||||||
|
|
||||||
case R_PPC64_ADDR30:
|
case R_PPC64_ADDR30:
|
||||||
{
|
{
|
||||||
Elf64_Addr delta = value - (Elf64_Xword) reloc_addr;
|
Elf64_Addr delta = value - (Elf64_Xword) reloc_addr;
|
||||||
if (dont_expect ((delta + 0x80000000) >= 0x10000000
|
if (dont_expect ((delta + 0x80000000) >= 0x10000000
|
||||||
|| (delta & 3) != 0))
|
|| (delta & 3) != 0))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, refsym);
|
||||||
BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc);
|
BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_PPC64_COPY:
|
case R_PPC64_COPY:
|
||||||
if (dont_expect (sym == NULL))
|
if (dont_expect (sym == NULL))
|
||||||
/* This can happen in trace mode when an object could not be found. */
|
/* This can happen in trace mode when an object could not be found. */
|
||||||
return;
|
return;
|
||||||
if (dont_expect (sym->st_size > refsym->st_size
|
if (dont_expect (sym->st_size > refsym->st_size
|
||||||
|| (GLRO(dl_verbose)
|
|| (GLRO(dl_verbose)
|
||||||
&& sym->st_size < refsym->st_size)))
|
&& sym->st_size < refsym->st_size)))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("%s: Symbol `%s' has different size" \
|
_dl_error_printf ("%s: Symbol `%s' has different size" \
|
||||||
" in shared object," \
|
" in shared object," \
|
||||||
" consider re-linking\n",
|
" consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
_dl_argv[0] ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr_arg, (char *) value,
|
memcpy (reloc_addr_arg, (char *) value,
|
||||||
@ -766,25 +762,25 @@ elf_machine_rela (struct link_map *map,
|
|||||||
|
|
||||||
case R_PPC64_ADDR32:
|
case R_PPC64_ADDR32:
|
||||||
if (dont_expect ((value + 0x80000000) >= 0x10000000))
|
if (dont_expect ((value + 0x80000000) >= 0x10000000))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_ADDR32", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_ADDR32", reloc_addr, refsym);
|
||||||
*(Elf64_Word *) reloc_addr = value;
|
*(Elf64_Word *) reloc_addr = value;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case R_PPC64_ADDR24:
|
case R_PPC64_ADDR24:
|
||||||
if (dont_expect ((value + 0x2000000) >= 0x4000000 || (value & 3) != 0))
|
if (dont_expect ((value + 0x2000000) >= 0x4000000 || (value & 3) != 0))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_ADDR24", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_ADDR24", reloc_addr, refsym);
|
||||||
BIT_INSERT (*(Elf64_Word *) reloc_addr, value, 0x3fffffc);
|
BIT_INSERT (*(Elf64_Word *) reloc_addr, value, 0x3fffffc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_PPC64_ADDR16:
|
case R_PPC64_ADDR16:
|
||||||
if (dont_expect ((value + 0x8000) >= 0x10000))
|
if (dont_expect ((value + 0x8000) >= 0x10000))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_ADDR16", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_ADDR16", reloc_addr, refsym);
|
||||||
*(Elf64_Half *) reloc_addr = value;
|
*(Elf64_Half *) reloc_addr = value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_PPC64_UADDR16:
|
case R_PPC64_UADDR16:
|
||||||
if (dont_expect ((value + 0x8000) >= 0x10000))
|
if (dont_expect ((value + 0x8000) >= 0x10000))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_UADDR16", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_UADDR16", reloc_addr, refsym);
|
||||||
/* We are big-endian. */
|
/* We are big-endian. */
|
||||||
((char *) reloc_addr_arg)[0] = (value >> 8) & 0xff;
|
((char *) reloc_addr_arg)[0] = (value >> 8) & 0xff;
|
||||||
((char *) reloc_addr_arg)[1] = (value >> 0) & 0xff;
|
((char *) reloc_addr_arg)[1] = (value >> 0) & 0xff;
|
||||||
@ -792,7 +788,7 @@ elf_machine_rela (struct link_map *map,
|
|||||||
|
|
||||||
case R_PPC64_ADDR16_DS:
|
case R_PPC64_ADDR16_DS:
|
||||||
if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
|
if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_ADDR16_DS", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_ADDR16_DS", reloc_addr, refsym);
|
||||||
BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
|
BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -816,11 +812,11 @@ elf_machine_rela (struct link_map *map,
|
|||||||
case R_PPC64_ADDR14_BRTAKEN:
|
case R_PPC64_ADDR14_BRTAKEN:
|
||||||
case R_PPC64_ADDR14_BRNTAKEN:
|
case R_PPC64_ADDR14_BRNTAKEN:
|
||||||
{
|
{
|
||||||
if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
|
if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
|
||||||
_dl_reloc_overflow (map, "R_PPC64_ADDR14", reloc_addr, refsym);
|
_dl_reloc_overflow (map, "R_PPC64_ADDR14", reloc_addr, refsym);
|
||||||
Elf64_Word insn = *(Elf64_Word *) reloc_addr;
|
Elf64_Word insn = *(Elf64_Word *) reloc_addr;
|
||||||
BIT_INSERT (insn, value, 0xfffc);
|
BIT_INSERT (insn, value, 0xfffc);
|
||||||
if (r_type != R_PPC64_ADDR14)
|
if (r_type != R_PPC64_ADDR14)
|
||||||
{
|
{
|
||||||
insn &= ~(1 << 21);
|
insn &= ~(1 << 21);
|
||||||
if (r_type == R_PPC64_ADDR14_BRTAKEN)
|
if (r_type == R_PPC64_ADDR14_BRTAKEN)
|
||||||
@ -830,7 +826,7 @@ elf_machine_rela (struct link_map *map,
|
|||||||
else if ((insn & (0x14 << 21)) == (0x10 << 21))
|
else if ((insn & (0x14 << 21)) == (0x10 << 21))
|
||||||
insn |= 0x08 << 21;
|
insn |= 0x08 << 21;
|
||||||
}
|
}
|
||||||
*(Elf64_Word *) reloc_addr = insn;
|
*(Elf64_Word *) reloc_addr = insn;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. S390 Version.
|
/* Machine-dependent ELF dynamic relocation inline functions. S390 Version.
|
||||||
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2011
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
Contributed by Carl Pederson & Martin Schwidefsky.
|
Contributed by Carl Pederson & Martin Schwidefsky.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
@ -43,7 +43,7 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return (ehdr->e_machine == EM_S390 || ehdr->e_machine == EM_S390_OLD)
|
return (ehdr->e_machine == EM_S390 || ehdr->e_machine == EM_S390_OLD)
|
||||||
&& ehdr->e_ident[EI_CLASS] == ELFCLASS32;
|
&& ehdr->e_ident[EI_CLASS] == ELFCLASS32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -316,8 +316,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
*reloc_addr = value + reloc->r_addend;
|
*reloc_addr = value + reloc->r_addend;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \
|
#ifndef RESOLVE_CONFLICT_FIND_MAP
|
||||||
&& !defined RESOLVE_CONFLICT_FIND_MAP
|
|
||||||
case R_390_TLS_DTPMOD:
|
case R_390_TLS_DTPMOD:
|
||||||
# ifdef RTLD_BOOTSTRAP
|
# ifdef RTLD_BOOTSTRAP
|
||||||
/* During startup the dynamic linker is always the module
|
/* During startup the dynamic linker is always the module
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions.
|
/* Machine-dependent ELF dynamic relocation inline functions.
|
||||||
64 bit S/390 Version.
|
64 bit S/390 Version.
|
||||||
Copyright (C) 2001-2005, 2006 Free Software Foundation, Inc.
|
Copyright (C) 2001-2005, 2006, 2011 Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -288,8 +288,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
*reloc_addr = value + reloc->r_addend;
|
*reloc_addr = value + reloc->r_addend;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \
|
#ifndef RESOLVE_CONFLICT_FIND_MAP
|
||||||
&& !defined RESOLVE_CONFLICT_FIND_MAP
|
|
||||||
case R_390_TLS_DTPMOD:
|
case R_390_TLS_DTPMOD:
|
||||||
# ifdef RTLD_BOOTSTRAP
|
# ifdef RTLD_BOOTSTRAP
|
||||||
/* During startup the dynamic linker is always the module
|
/* During startup the dynamic linker is always the module
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. SH version.
|
/* Machine-dependent ELF dynamic relocation inline functions. SH version.
|
||||||
Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2011
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -208,17 +208,11 @@ __fpscr_values:\n\
|
|||||||
define the value.
|
define the value.
|
||||||
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
||||||
of the main executable's symbols, as for a COPY reloc. */
|
of the main executable's symbols, as for a COPY reloc. */
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
#define elf_machine_type_class(type) \
|
||||||
# define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_SH_JMP_SLOT || (type) == R_SH_TLS_DTPMOD32 \
|
((((type) == R_SH_JMP_SLOT || (type) == R_SH_TLS_DTPMOD32 \
|
||||||
|| (type) == R_SH_TLS_DTPOFF32 || (type) == R_SH_TLS_TPOFF32) \
|
|| (type) == R_SH_TLS_DTPOFF32 || (type) == R_SH_TLS_TPOFF32) \
|
||||||
* ELF_RTYPE_CLASS_PLT) \
|
* ELF_RTYPE_CLASS_PLT) \
|
||||||
| (((type) == R_SH_COPY) * ELF_RTYPE_CLASS_COPY))
|
| (((type) == R_SH_COPY) * ELF_RTYPE_CLASS_COPY))
|
||||||
#else
|
|
||||||
#define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_SH_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
|
|
||||||
| (((type) == R_SH_COPY) * ELF_RTYPE_CLASS_COPY))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||||
#define ELF_MACHINE_JMP_SLOT R_SH_JMP_SLOT
|
#define ELF_MACHINE_JMP_SLOT R_SH_JMP_SLOT
|
||||||
@ -354,35 +348,34 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
/* These addresses are always aligned. */
|
/* These addresses are always aligned. */
|
||||||
*reloc_addr = value;
|
*reloc_addr = value;
|
||||||
break;
|
break;
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
|
||||||
/* XXX Remove TLS relocations which are not needed. */
|
/* XXX Remove TLS relocations which are not needed. */
|
||||||
case R_SH_TLS_DTPMOD32:
|
case R_SH_TLS_DTPMOD32:
|
||||||
# ifdef RTLD_BOOTSTRAP
|
#ifdef RTLD_BOOTSTRAP
|
||||||
/* During startup the dynamic linker is always the module
|
/* During startup the dynamic linker is always the module
|
||||||
with index 1.
|
with index 1.
|
||||||
XXX If this relocation is necessary move before RESOLVE
|
XXX If this relocation is necessary move before RESOLVE
|
||||||
call. */
|
call. */
|
||||||
*reloc_addr = 1;
|
*reloc_addr = 1;
|
||||||
# else
|
#else
|
||||||
/* Get the information from the link map returned by the
|
/* Get the information from the link map returned by the
|
||||||
resolv function. */
|
resolv function. */
|
||||||
if (sym_map != NULL)
|
if (sym_map != NULL)
|
||||||
*reloc_addr = sym_map->l_tls_modid;
|
*reloc_addr = sym_map->l_tls_modid;
|
||||||
# endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case R_SH_TLS_DTPOFF32:
|
case R_SH_TLS_DTPOFF32:
|
||||||
# ifndef RTLD_BOOTSTRAP
|
#ifndef RTLD_BOOTSTRAP
|
||||||
/* During relocation all TLS symbols are defined and used.
|
/* During relocation all TLS symbols are defined and used.
|
||||||
Therefore the offset is already correct. */
|
Therefore the offset is already correct. */
|
||||||
if (sym != NULL)
|
if (sym != NULL)
|
||||||
*reloc_addr = sym->st_value;
|
*reloc_addr = sym->st_value;
|
||||||
# endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case R_SH_TLS_TPOFF32:
|
case R_SH_TLS_TPOFF32:
|
||||||
/* The offset is positive, afterward from the thread pointer. */
|
/* The offset is positive, afterward from the thread pointer. */
|
||||||
# ifdef RTLD_BOOTSTRAP
|
#ifdef RTLD_BOOTSTRAP
|
||||||
*reloc_addr = map->l_tls_offset + sym->st_value + reloc->r_addend;
|
*reloc_addr = map->l_tls_offset + sym->st_value + reloc->r_addend;
|
||||||
# else
|
#else
|
||||||
/* We know the offset of object the symbol is contained in.
|
/* We know the offset of object the symbol is contained in.
|
||||||
It is a positive value which will be added to the thread
|
It is a positive value which will be added to the thread
|
||||||
pointer. To get the variable position in the TLS block
|
pointer. To get the variable position in the TLS block
|
||||||
@ -393,9 +386,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
*reloc_addr = sym_map->l_tls_offset + sym->st_value
|
*reloc_addr = sym_map->l_tls_offset + sym->st_value
|
||||||
+ reloc->r_addend;
|
+ reloc->r_addend;
|
||||||
}
|
}
|
||||||
# endif
|
#endif
|
||||||
break;
|
break;
|
||||||
#endif /* use TLS */
|
|
||||||
case R_SH_DIR32:
|
case R_SH_DIR32:
|
||||||
{
|
{
|
||||||
#ifndef RTLD_BOOTSTRAP
|
#ifndef RTLD_BOOTSTRAP
|
||||||
|
@ -139,7 +139,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
nop
|
nop
|
||||||
.word MAP
|
.word MAP
|
||||||
|
|
||||||
The PC value (pltpc) saved in %g2 by the jmpl points near the
|
The PC value (pltpc) saved in %g2 by the jmpl points near the
|
||||||
location where we store the link_map pointer for this object. */
|
location where we store the link_map pointer for this object. */
|
||||||
|
|
||||||
plt[0] = 0x05000000 | ((rfunc >> 10) & 0x003fffff);
|
plt[0] = 0x05000000 | ((rfunc >> 10) & 0x003fffff);
|
||||||
@ -193,17 +193,11 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
PLT entries should not be allowed to define the value.
|
PLT entries should not be allowed to define the value.
|
||||||
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
||||||
of the main executable's symbols, as for a COPY reloc. */
|
of the main executable's symbols, as for a COPY reloc. */
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
#define elf_machine_type_class(type) \
|
||||||
# define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_SPARC_JMP_SLOT \
|
((((type) == R_SPARC_JMP_SLOT \
|
||||||
|| ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \
|
|| ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \
|
||||||
* ELF_RTYPE_CLASS_PLT) \
|
* ELF_RTYPE_CLASS_PLT) \
|
||||||
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
|
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
|
||||||
#else
|
|
||||||
# define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
|
|
||||||
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||||
#define ELF_MACHINE_JMP_SLOT R_SPARC_JMP_SLOT
|
#define ELF_MACHINE_JMP_SLOT R_SPARC_JMP_SLOT
|
||||||
@ -454,8 +448,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
sparc_fixup_plt (reloc, reloc_addr, value, 0, do_flush);
|
sparc_fixup_plt (reloc, reloc_addr, value, 0, do_flush);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \
|
#ifndef RESOLVE_CONFLICT_FIND_MAP
|
||||||
&& !defined RESOLVE_CONFLICT_FIND_MAP
|
|
||||||
case R_SPARC_TLS_DTPMOD32:
|
case R_SPARC_TLS_DTPMOD32:
|
||||||
/* Get the information from the link map returned by the
|
/* Get the information from the link map returned by the
|
||||||
resolv function. */
|
resolv function. */
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version.
|
/* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version.
|
||||||
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
Copyright (C) 1997-2006, 2009, 2010, 2011 Free Software Foundation, Inc.
|
||||||
2009, 2010 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -77,11 +76,11 @@ elf_machine_load_address (void)
|
|||||||
register Elf64_Addr *got __asm ("%l7");
|
register Elf64_Addr *got __asm ("%l7");
|
||||||
|
|
||||||
__asm ("sethi %%hi(_GLOBAL_OFFSET_TABLE_-4), %1\n\t"
|
__asm ("sethi %%hi(_GLOBAL_OFFSET_TABLE_-4), %1\n\t"
|
||||||
"call 1f\n\t"
|
"call 1f\n\t"
|
||||||
" add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t"
|
" add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t"
|
||||||
"call _DYNAMIC\n\t"
|
"call _DYNAMIC\n\t"
|
||||||
"call _GLOBAL_OFFSET_TABLE_\n"
|
"call _GLOBAL_OFFSET_TABLE_\n"
|
||||||
"1:\tadd %1, %0, %1\n\t" : "=r" (pc), "=r" (got));
|
"1:\tadd %1, %0, %1\n\t" : "=r" (pc), "=r" (got));
|
||||||
|
|
||||||
/* got is now l_addr + _GLOBAL_OFFSET_TABLE_
|
/* got is now l_addr + _GLOBAL_OFFSET_TABLE_
|
||||||
*got is _DYNAMIC
|
*got is _DYNAMIC
|
||||||
@ -115,17 +114,11 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
PLT entries should not be allowed to define the value.
|
PLT entries should not be allowed to define the value.
|
||||||
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
||||||
of the main executable's symbols, as for a COPY reloc. */
|
of the main executable's symbols, as for a COPY reloc. */
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
#define elf_machine_type_class(type) \
|
||||||
# define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_SPARC_JMP_SLOT \
|
((((type) == R_SPARC_JMP_SLOT \
|
||||||
|| ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \
|
|| ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \
|
||||||
* ELF_RTYPE_CLASS_PLT) \
|
* ELF_RTYPE_CLASS_PLT) \
|
||||||
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
|
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
|
||||||
#else
|
|
||||||
# define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
|
|
||||||
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||||
#define ELF_MACHINE_JMP_SLOT R_SPARC_JMP_SLOT
|
#define ELF_MACHINE_JMP_SLOT R_SPARC_JMP_SLOT
|
||||||
@ -168,7 +161,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
|
|
||||||
/* PLT0 looks like:
|
/* PLT0 looks like:
|
||||||
|
|
||||||
sethi %uhi(_dl_runtime_{resolve,profile}_0), %g4
|
sethi %uhi(_dl_runtime_{resolve,profile}_0), %g4
|
||||||
sethi %hi(_dl_runtime_{resolve,profile}_0), %g5
|
sethi %hi(_dl_runtime_{resolve,profile}_0), %g5
|
||||||
or %g4, %ulo(_dl_runtime_{resolve,profile}_0), %g4
|
or %g4, %ulo(_dl_runtime_{resolve,profile}_0), %g4
|
||||||
or %g5, %lo(_dl_runtime_{resolve,profile}_0), %g5
|
or %g5, %lo(_dl_runtime_{resolve,profile}_0), %g5
|
||||||
@ -189,7 +182,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
|
|
||||||
/* PLT1 looks like:
|
/* PLT1 looks like:
|
||||||
|
|
||||||
sethi %uhi(_dl_runtime_{resolve,profile}_1), %g4
|
sethi %uhi(_dl_runtime_{resolve,profile}_1), %g4
|
||||||
sethi %hi(_dl_runtime_{resolve,profile}_1), %g5
|
sethi %hi(_dl_runtime_{resolve,profile}_1), %g5
|
||||||
or %g4, %ulo(_dl_runtime_{resolve,profile}_1), %g4
|
or %g4, %ulo(_dl_runtime_{resolve,profile}_1), %g4
|
||||||
or %g5, %lo(_dl_runtime_{resolve,profile}_1), %g5
|
or %g5, %lo(_dl_runtime_{resolve,profile}_1), %g5
|
||||||
@ -479,8 +472,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
sparc64_fixup_plt (map, reloc, reloc_addr, value, reloc->r_addend, 0);
|
sparc64_fixup_plt (map, reloc, reloc_addr, value, reloc->r_addend, 0);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \
|
#ifndef RESOLVE_CONFLICT_FIND_MAP
|
||||||
&& !defined RESOLVE_CONFLICT_FIND_MAP
|
|
||||||
case R_SPARC_TLS_DTPMOD64:
|
case R_SPARC_TLS_DTPMOD64:
|
||||||
/* Get the information from the link map returned by the
|
/* Get the information from the link map returned by the
|
||||||
resolv function. */
|
resolv function. */
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1991,1992,1993,1994,1995,1996,1997,2000,2002,2004,2005
|
/* Copyright (C) 1991-1997,2000,2002,2004,2005,2011
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -46,57 +46,24 @@ syscall_error:
|
|||||||
notb:
|
notb:
|
||||||
#endif
|
#endif
|
||||||
#ifndef PIC
|
#ifndef PIC
|
||||||
# if USE___THREAD
|
# ifndef NO_TLS_DIRECT_SEG_REFS
|
||||||
# ifndef NO_TLS_DIRECT_SEG_REFS
|
|
||||||
movl %eax, %gs:C_SYMBOL_NAME(errno@NTPOFF)
|
movl %eax, %gs:C_SYMBOL_NAME(errno@NTPOFF)
|
||||||
# else
|
# else
|
||||||
movl %gs:0, %ecx
|
movl %gs:0, %ecx
|
||||||
movl %eax, C_SYMBOL_NAME(errno@NTPOFF)(%ecx)
|
movl %eax, C_SYMBOL_NAME(errno@NTPOFF)(%ecx)
|
||||||
# endif
|
|
||||||
# elif !defined _LIBC_REENTRANT
|
|
||||||
movl %eax, C_SYMBOL_NAME(errno)
|
|
||||||
# else
|
|
||||||
pushl %eax
|
|
||||||
PUSH_ERRNO_LOCATION_RETURN
|
|
||||||
call BP_SYM (__errno_location)
|
|
||||||
POP_ERRNO_LOCATION_RETURN
|
|
||||||
popl %ecx
|
|
||||||
movl %ecx, (%eax)
|
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
/* The caller has pushed %ebx and then set it up to
|
/* The caller has pushed %ebx and then set it up to
|
||||||
point to the GOT before calling us through the PLT. */
|
point to the GOT before calling us through the PLT. */
|
||||||
# if USE___THREAD
|
|
||||||
movl C_SYMBOL_NAME(errno@GOTNTPOFF)(%ebx), %ecx
|
movl C_SYMBOL_NAME(errno@GOTNTPOFF)(%ebx), %ecx
|
||||||
|
|
||||||
/* Pop %ebx value saved before jumping here. */
|
/* Pop %ebx value saved before jumping here. */
|
||||||
popl %ebx
|
popl %ebx
|
||||||
# ifndef NO_TLS_DIRECT_SEG_REFS
|
# ifndef NO_TLS_DIRECT_SEG_REFS
|
||||||
addl %gs:0, %ecx
|
addl %gs:0, %ecx
|
||||||
movl %eax, (%ecx)
|
movl %eax, (%ecx)
|
||||||
# else
|
|
||||||
movl %eax, %gs:0(%ecx)
|
|
||||||
# endif
|
|
||||||
# elif RTLD_PRIVATE_ERRNO
|
|
||||||
movl %eax, C_SYMBOL_NAME(rtld_errno@GOTOFF)(%ebx)
|
|
||||||
|
|
||||||
/* Pop %ebx value saved before jumping here. */
|
|
||||||
popl %ebx
|
|
||||||
# elif !defined _LIBC_REENTRANT
|
|
||||||
movl C_SYMBOL_NAME(errno@GOT)(%ebx), %ecx
|
|
||||||
|
|
||||||
/* Pop %ebx value saved before jumping here. */
|
|
||||||
popl %ebx
|
|
||||||
movl %eax, (%ecx)
|
|
||||||
# else
|
# else
|
||||||
pushl %eax
|
movl %eax, %gs:0(%ecx)
|
||||||
PUSH_ERRNO_LOCATION_RETURN
|
|
||||||
call C_SYMBOL_NAME (BP_SYM (__errno_location)@PLT)
|
|
||||||
POP_ERRNO_LOCATION_RETURN
|
|
||||||
popl %ecx
|
|
||||||
/* Pop %ebx value saved before jumping here. */
|
|
||||||
popl %ebx
|
|
||||||
movl %ecx, (%eax)
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
movl $-1, %eax
|
movl $-1, %eax
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (C) 1992,1993,1995-2000,2002-2006,2007
|
/* Copyright (C) 1992,1993,1995-2000,2002-2006,2007,2011
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper, <drepper@gnu.org>, August 1995.
|
Contributed by Ulrich Drepper, <drepper@gnu.org>, August 1995.
|
||||||
|
|
||||||
@ -121,13 +121,12 @@
|
|||||||
|
|
||||||
# elif defined _LIBC_REENTRANT
|
# elif defined _LIBC_REENTRANT
|
||||||
|
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# else
|
||||||
# else
|
# define SYSCALL_ERROR_ERRNO errno
|
||||||
# define SYSCALL_ERROR_ERRNO errno
|
# endif
|
||||||
# endif
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0:SETUP_PIC_REG (cx); \
|
0:SETUP_PIC_REG (cx); \
|
||||||
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
|
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
|
||||||
movl SYSCALL_ERROR_ERRNO@GOTNTPOFF(%ecx), %ecx; \
|
movl SYSCALL_ERROR_ERRNO@GOTNTPOFF(%ecx), %ecx; \
|
||||||
@ -136,38 +135,13 @@
|
|||||||
SYSCALL_ERROR_HANDLER_TLS_STORE (%edx, %ecx); \
|
SYSCALL_ERROR_HANDLER_TLS_STORE (%edx, %ecx); \
|
||||||
orl $-1, %eax; \
|
orl $-1, %eax; \
|
||||||
jmp L(pseudo_end);
|
jmp L(pseudo_end);
|
||||||
# ifndef NO_TLS_DIRECT_SEG_REFS
|
# ifndef NO_TLS_DIRECT_SEG_REFS
|
||||||
# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \
|
# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \
|
||||||
movl src, %gs:(destoff)
|
movl src, %gs:(destoff)
|
||||||
# else
|
# else
|
||||||
# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \
|
# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \
|
||||||
addl %gs:0, destoff; \
|
addl %gs:0, destoff; \
|
||||||
movl src, (destoff)
|
movl src, (destoff)
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0:pushl %ebx; \
|
|
||||||
cfi_adjust_cfa_offset (4); \
|
|
||||||
cfi_rel_offset (ebx, 0); \
|
|
||||||
SETUP_PIC_REG (bx); \
|
|
||||||
addl $_GLOBAL_OFFSET_TABLE_, %ebx; \
|
|
||||||
xorl %edx, %edx; \
|
|
||||||
subl %eax, %edx; \
|
|
||||||
pushl %edx; \
|
|
||||||
cfi_adjust_cfa_offset (4); \
|
|
||||||
PUSH_ERRNO_LOCATION_RETURN; \
|
|
||||||
call BP_SYM (__errno_location)@PLT; \
|
|
||||||
POP_ERRNO_LOCATION_RETURN; \
|
|
||||||
popl %ecx; \
|
|
||||||
cfi_adjust_cfa_offset (-4); \
|
|
||||||
popl %ebx; \
|
|
||||||
cfi_adjust_cfa_offset (-4); \
|
|
||||||
cfi_restore (ebx); \
|
|
||||||
movl %ecx, (%eax); \
|
|
||||||
orl $-1, %eax; \
|
|
||||||
jmp L(pseudo_end);
|
|
||||||
/* A quick note: it is assumed that the call to `__errno_location' does
|
|
||||||
not modify the stack! */
|
|
||||||
# endif
|
# endif
|
||||||
# else
|
# else
|
||||||
/* Store (- %eax) into errno through the GOT. */
|
/* Store (- %eax) into errno through the GOT. */
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
|
/* Copyright (C) 1999-2001, 2003, 2004, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
|
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ ENTRY(__syscall_error)
|
|||||||
;;
|
;;
|
||||||
st4 [r2]=r8
|
st4 [r2]=r8
|
||||||
mov r8=-1
|
mov r8=-1
|
||||||
#elif USE___THREAD
|
#else
|
||||||
# ifndef NOT_IN_libc
|
# ifndef NOT_IN_libc
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# else
|
# else
|
||||||
@ -46,37 +46,7 @@ ENTRY(__syscall_error)
|
|||||||
mov r8=-1
|
mov r8=-1
|
||||||
add r2=r2,r13;;
|
add r2=r2,r13;;
|
||||||
st4 [r2]=r3
|
st4 [r2]=r3
|
||||||
#elif defined _LIBC_REENTRANT
|
#endif
|
||||||
.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0)
|
|
||||||
alloc r33=ar.pfs, 0, 4, 0, 0
|
|
||||||
mov r32=rp
|
|
||||||
.body
|
|
||||||
mov r35=r8
|
|
||||||
mov r34=r1
|
|
||||||
;;
|
|
||||||
br.call.sptk.many b0 = __errno_location
|
|
||||||
.Lret0: /* force new bundle */
|
|
||||||
st4 [r8]=r35
|
|
||||||
mov r1=r34
|
|
||||||
mov rp=r32
|
|
||||||
mov r8=-1
|
|
||||||
mov ar.pfs=r33
|
|
||||||
#else /* _LIBC_REENTRANT */
|
|
||||||
/*
|
|
||||||
* Note that the gp has to be set properly for this to work.
|
|
||||||
* As long as all syscalls are in the same load unit
|
|
||||||
* (executable or shared library) as this routine, we should
|
|
||||||
* be fine. Otherwise, we would have to first load the global
|
|
||||||
* pointer register from __gp.
|
|
||||||
*/
|
|
||||||
addl r2=@ltoff(errno),gp
|
|
||||||
;;
|
|
||||||
ld8 r2=[r2]
|
|
||||||
mov r3=r8
|
|
||||||
mov r8=-1
|
|
||||||
;;
|
|
||||||
st4 [r2]=r3
|
|
||||||
#endif /* _LIBC_REENTRANT */
|
|
||||||
ret // ret is #define'd in syscall.h!
|
ret // ret is #define'd in syscall.h!
|
||||||
END(__syscall_error)
|
END(__syscall_error)
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2011 Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -32,12 +32,11 @@
|
|||||||
.text
|
.text
|
||||||
ENTRY(__syscall_error)
|
ENTRY(__syscall_error)
|
||||||
#ifndef PIC
|
#ifndef PIC
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# else
|
||||||
# else
|
# define SYSCALL_ERROR_ERRNO errno
|
||||||
# define SYSCALL_ERROR_ERRNO errno
|
# endif
|
||||||
# endif
|
|
||||||
basr %r1,0
|
basr %r1,0
|
||||||
0: l %r1,1f-0b(%r1)
|
0: l %r1,1f-0b(%r1)
|
||||||
ear %r3,%a0
|
ear %r3,%a0
|
||||||
@ -46,34 +45,6 @@ ENTRY(__syscall_error)
|
|||||||
lhi %r2,-1
|
lhi %r2,-1
|
||||||
br %r14
|
br %r14
|
||||||
1: .long SYSCALL_ERROR_ERRNO@ntpoff
|
1: .long SYSCALL_ERROR_ERRNO@ntpoff
|
||||||
# elif !defined _LIBC_REENTRANT
|
|
||||||
basr %r1,0
|
|
||||||
0: l %r1,1f-0b(%r1)
|
|
||||||
lcr %r2,%r2
|
|
||||||
st %r2,0(%r1)
|
|
||||||
lhi %r2,-1
|
|
||||||
br %r14
|
|
||||||
1: .long errno
|
|
||||||
# else
|
|
||||||
stm %r13,%r15,52(%r15)
|
|
||||||
cfi_offset (%r15, -36)
|
|
||||||
cfi_offset (%r14, -40)
|
|
||||||
cfi_offset (%r13, -44)
|
|
||||||
lr %r0,%r15
|
|
||||||
ahi %r15,-96
|
|
||||||
cfi_adjust_cfa_offset (96)
|
|
||||||
lcr %r13,%r2
|
|
||||||
st %r0,0(%r15)
|
|
||||||
basr %r1,0
|
|
||||||
0: l %r1,1f-0b(%r1)
|
|
||||||
basr %r14,%r1
|
|
||||||
st %r13,0(%r2)
|
|
||||||
lm %r13,%r15,148(%r15)
|
|
||||||
cfi_adjust_cfa_offset (-96)
|
|
||||||
lhi %r2,-1
|
|
||||||
br %r14
|
|
||||||
1: .long __errno_location
|
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
# if RTLD_PRIVATE_ERRNO
|
# if RTLD_PRIVATE_ERRNO
|
||||||
basr %r1,0
|
basr %r1,0
|
||||||
@ -83,7 +54,7 @@ ENTRY(__syscall_error)
|
|||||||
lhi %r2,-1
|
lhi %r2,-1
|
||||||
br %r14
|
br %r14
|
||||||
1: .long rtld_errno - 0b
|
1: .long rtld_errno - 0b
|
||||||
# elif USE___THREAD
|
# else
|
||||||
# ifndef NOT_IN_libc
|
# ifndef NOT_IN_libc
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# else
|
# else
|
||||||
@ -98,39 +69,6 @@ ENTRY(__syscall_error)
|
|||||||
lhi %r2,-1
|
lhi %r2,-1
|
||||||
br %r14
|
br %r14
|
||||||
1: .long _GLOBAL_OFFSET_TABLE_-0b
|
1: .long _GLOBAL_OFFSET_TABLE_-0b
|
||||||
# elif !defined _LIBC_REENTRANT
|
|
||||||
basr %r1,0
|
|
||||||
0: al %r1,1f-0b(%r1)
|
|
||||||
l %r1,errno@GOT(%r1)
|
|
||||||
lcr %r2,%r2
|
|
||||||
st %r2,0(0,%r1)
|
|
||||||
lhi %r2,-1
|
|
||||||
br %r14
|
|
||||||
1: .long _GLOBAL_OFFSET_TABLE_-0b
|
|
||||||
# else
|
|
||||||
stm %r11,%r15,44(%r15)
|
|
||||||
cfi_offset (%r15, -36)
|
|
||||||
cfi_offset (%r14, -40)
|
|
||||||
cfi_offset (%r13, -44)
|
|
||||||
cfi_offset (%r12, -48)
|
|
||||||
cfi_offset (%r11, -52)
|
|
||||||
lr %r0,%r15
|
|
||||||
ahi %r15,-96
|
|
||||||
cfi_adjust_cfa_offset (96)
|
|
||||||
lcr %r11,%r2
|
|
||||||
st %r0,0(%r15)
|
|
||||||
basr %r13,0
|
|
||||||
0: l %r12,1f-0b(%r13)
|
|
||||||
l %r1,2f-0b(%r13)
|
|
||||||
la %r12,0(%r12,%r13)
|
|
||||||
bas %r14,0(%r1,%r13)
|
|
||||||
st %r11,0(%r2)
|
|
||||||
lm %r11,%r15,140(%r15)
|
|
||||||
cfi_adjust_cfa_offset (-96)
|
|
||||||
lhi %r2,-1
|
|
||||||
br %r14
|
|
||||||
1: .long _GLOBAL_OFFSET_TABLE_-0b
|
|
||||||
2: .long __errno_location@PLT-0b
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008
|
/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2011
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
@ -56,10 +56,10 @@
|
|||||||
#undef PSEUDO
|
#undef PSEUDO
|
||||||
#define PSEUDO(name, syscall_name, args) \
|
#define PSEUDO(name, syscall_name, args) \
|
||||||
.text; \
|
.text; \
|
||||||
ENTRY (name) \
|
ENTRY (name) \
|
||||||
DO_CALL (syscall_name, args); \
|
DO_CALL (syscall_name, args); \
|
||||||
lhi %r4,-4095 ; \
|
lhi %r4,-4095 ; \
|
||||||
clr %r2,%r4 ; \
|
clr %r2,%r4 ; \
|
||||||
jnl SYSCALL_ERROR_LABEL
|
jnl SYSCALL_ERROR_LABEL
|
||||||
|
|
||||||
#undef PSEUDO_END
|
#undef PSEUDO_END
|
||||||
@ -70,7 +70,7 @@
|
|||||||
#undef PSEUDO_NOERRNO
|
#undef PSEUDO_NOERRNO
|
||||||
#define PSEUDO_NOERRNO(name, syscall_name, args) \
|
#define PSEUDO_NOERRNO(name, syscall_name, args) \
|
||||||
.text; \
|
.text; \
|
||||||
ENTRY (name) \
|
ENTRY (name) \
|
||||||
DO_CALL (syscall_name, args)
|
DO_CALL (syscall_name, args)
|
||||||
|
|
||||||
#undef PSEUDO_END_NOERRNO
|
#undef PSEUDO_END_NOERRNO
|
||||||
@ -80,7 +80,7 @@
|
|||||||
#undef PSEUDO_ERRVAL
|
#undef PSEUDO_ERRVAL
|
||||||
#define PSEUDO_ERRVAL(name, syscall_name, args) \
|
#define PSEUDO_ERRVAL(name, syscall_name, args) \
|
||||||
.text; \
|
.text; \
|
||||||
ENTRY (name) \
|
ENTRY (name) \
|
||||||
DO_CALL (syscall_name, args); \
|
DO_CALL (syscall_name, args); \
|
||||||
lcr %r2,%r2
|
lcr %r2,%r2
|
||||||
|
|
||||||
@ -107,14 +107,13 @@
|
|||||||
br %r14; \
|
br %r14; \
|
||||||
2: .long rtld_errno-1b
|
2: .long rtld_errno-1b
|
||||||
# elif defined _LIBC_REENTRANT
|
# elif defined _LIBC_REENTRANT
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# else
|
||||||
# else
|
# define SYSCALL_ERROR_ERRNO errno
|
||||||
# define SYSCALL_ERROR_ERRNO errno
|
# endif
|
||||||
# endif
|
# define SYSCALL_ERROR_LABEL 0f
|
||||||
# define SYSCALL_ERROR_LABEL 0f
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0: lcr %r0,%r2; \
|
0: lcr %r0,%r2; \
|
||||||
basr %r1,0; \
|
basr %r1,0; \
|
||||||
1: al %r1,2f-1b(%r1); \
|
1: al %r1,2f-1b(%r1); \
|
||||||
@ -124,14 +123,6 @@
|
|||||||
lhi %r2,-1; \
|
lhi %r2,-1; \
|
||||||
br %r14; \
|
br %r14; \
|
||||||
2: .long _GLOBAL_OFFSET_TABLE_-1b
|
2: .long _GLOBAL_OFFSET_TABLE_-1b
|
||||||
# else
|
|
||||||
# define SYSCALL_ERROR_LABEL 0f
|
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0: basr %r1,0; \
|
|
||||||
1: al %r1,2f-1b(%r1); \
|
|
||||||
br %r1; \
|
|
||||||
2: .long syscall_error@plt-1b
|
|
||||||
# endif
|
|
||||||
# else
|
# else
|
||||||
# define SYSCALL_ERROR_LABEL 0f
|
# define SYSCALL_ERROR_LABEL 0f
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
@ -317,8 +308,8 @@
|
|||||||
if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \
|
if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \
|
||||||
{ \
|
{ \
|
||||||
iserr: \
|
iserr: \
|
||||||
__set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \
|
__set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \
|
||||||
_ret = -1L; \
|
_ret = -1L; \
|
||||||
} \
|
} \
|
||||||
out: \
|
out: \
|
||||||
(int) _ret; \
|
(int) _ret; \
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
/* Copyright (C) 2001, 2002, 2003, 2004, 2011 Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -33,12 +33,11 @@
|
|||||||
.text
|
.text
|
||||||
ENTRY(__syscall_error)
|
ENTRY(__syscall_error)
|
||||||
#ifndef PIC
|
#ifndef PIC
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# else
|
||||||
# else
|
# define SYSCALL_ERROR_ERRNO errno
|
||||||
# define SYSCALL_ERROR_ERRNO errno
|
# endif
|
||||||
# endif
|
|
||||||
basr %r1,0
|
basr %r1,0
|
||||||
0: lg %r1,1f-0b(%r1)
|
0: lg %r1,1f-0b(%r1)
|
||||||
ear %r3,%a0
|
ear %r3,%a0
|
||||||
@ -49,29 +48,6 @@ ENTRY(__syscall_error)
|
|||||||
lghi %r2,-1
|
lghi %r2,-1
|
||||||
br %r14
|
br %r14
|
||||||
1: .quad SYSCALL_ERROR_ERRNO@ntpoff
|
1: .quad SYSCALL_ERROR_ERRNO@ntpoff
|
||||||
# elif !defined _LIBC_REENTRANT
|
|
||||||
larl %r1,errno
|
|
||||||
lcr %r2,%r2
|
|
||||||
st %r2,0(%r1)
|
|
||||||
lghi %r2,-1
|
|
||||||
br %r14
|
|
||||||
# else
|
|
||||||
stmg %r13,%r15,104(%r15)
|
|
||||||
cfi_offset (%r15,-40)
|
|
||||||
cfi_offset (%r14,-48)
|
|
||||||
cfi_offset (%r13,-56)
|
|
||||||
lgr %r0,%r15
|
|
||||||
aghi %r15,-160
|
|
||||||
cfi_adjust_cfa_offset (160)
|
|
||||||
lcr %r13,%r2
|
|
||||||
stg %r0,0(%r15)
|
|
||||||
brasl %r14,__errno_location
|
|
||||||
st %r13,0(%r2)
|
|
||||||
lmg %r13,%r15,264(%r15)
|
|
||||||
cfi_adjust_cfa_offset (-160)
|
|
||||||
lghi %r2,-1
|
|
||||||
br %r14
|
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
# if RTLD_PRIVATE_ERRNO
|
# if RTLD_PRIVATE_ERRNO
|
||||||
larl %r1,rtld_errno
|
larl %r1,rtld_errno
|
||||||
@ -79,7 +55,7 @@ ENTRY(__syscall_error)
|
|||||||
st %r2,0(%r1)
|
st %r2,0(%r1)
|
||||||
lghi %r2,-1
|
lghi %r2,-1
|
||||||
br %r14
|
br %r14
|
||||||
# elif USE___THREAD
|
# else
|
||||||
# ifndef NOT_IN_libc
|
# ifndef NOT_IN_libc
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# else
|
# else
|
||||||
@ -94,29 +70,6 @@ ENTRY(__syscall_error)
|
|||||||
st %r2,0(%r1,%r3)
|
st %r2,0(%r1,%r3)
|
||||||
lghi %r2,-1
|
lghi %r2,-1
|
||||||
br %r14
|
br %r14
|
||||||
# elif !defined _LIBC_REENTRANT
|
|
||||||
larl %r1,_GLOBAL_OFFSET_TABLE_
|
|
||||||
lg %r1,errno@GOT(%r1)
|
|
||||||
lcr %r2,%r2
|
|
||||||
st %r2,0(%r1)
|
|
||||||
lghi %r2,-1
|
|
||||||
br %r14
|
|
||||||
# else
|
|
||||||
stmg %r13,%r15,104(%r15)
|
|
||||||
cfi_offset (%r15,-40)
|
|
||||||
cfi_offset (%r14,-48)
|
|
||||||
cfi_offset (%r13,-56)
|
|
||||||
lgr %r0,%r15
|
|
||||||
aghi %r15,-160
|
|
||||||
cfi_adjust_cfa_offset (160)
|
|
||||||
lcr %r13,%r2
|
|
||||||
stg %r0,0(%r15)
|
|
||||||
brasl %r14,__errno_location@PLT
|
|
||||||
st %r13,0(%r2)
|
|
||||||
lmg %r13,%r15,264(%r15)
|
|
||||||
cfi_adjust_cfa_offset (-160)
|
|
||||||
lghi %r2,-1
|
|
||||||
br %r14
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Assembler macros for 64 bit S/390.
|
/* Assembler macros for 64 bit S/390.
|
||||||
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008
|
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2011
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
@ -115,14 +115,13 @@
|
|||||||
lghi %r2,-1; \
|
lghi %r2,-1; \
|
||||||
br %r14
|
br %r14
|
||||||
# elif defined _LIBC_REENTRANT
|
# elif defined _LIBC_REENTRANT
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# else
|
||||||
# else
|
# define SYSCALL_ERROR_ERRNO errno
|
||||||
# define SYSCALL_ERROR_ERRNO errno
|
# endif
|
||||||
# endif
|
# define SYSCALL_ERROR_LABEL 0f
|
||||||
# define SYSCALL_ERROR_LABEL 0f
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0: lcr %r0,%r2; \
|
0: lcr %r0,%r2; \
|
||||||
larl %r1,SYSCALL_ERROR_ERRNO@indntpoff; \
|
larl %r1,SYSCALL_ERROR_ERRNO@indntpoff; \
|
||||||
lg %r1,0(%r1); \
|
lg %r1,0(%r1); \
|
||||||
@ -132,10 +131,6 @@
|
|||||||
st %r0,0(%r1,%r2); \
|
st %r0,0(%r1,%r2); \
|
||||||
lghi %r2,-1; \
|
lghi %r2,-1; \
|
||||||
br %r14
|
br %r14
|
||||||
# else
|
|
||||||
# define SYSCALL_ERROR_LABEL syscall_error@plt
|
|
||||||
# define SYSCALL_ERROR_HANDLER
|
|
||||||
# endif
|
|
||||||
# else
|
# else
|
||||||
# define SYSCALL_ERROR_LABEL 0f
|
# define SYSCALL_ERROR_LABEL 0f
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
@ -319,8 +314,8 @@
|
|||||||
if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \
|
if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \
|
||||||
{ \
|
{ \
|
||||||
iserr: \
|
iserr: \
|
||||||
__set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \
|
__set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \
|
||||||
_ret = -1L; \
|
_ret = -1L; \
|
||||||
} \
|
} \
|
||||||
out: \
|
out: \
|
||||||
(int) _ret; \
|
(int) _ret; \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (C) 1992,1993,1995,1996,1997,1998,1999,2000,2002,2003,2004,
|
/* Copyright (C) 1992,1993,1995-2000,2002-2006,2009,2011
|
||||||
2005,2006,2009 Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
|
Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
|
||||||
Changed by Kaz Kojima, <kkojima@rr.iij4u.or.jp>.
|
Changed by Kaz Kojima, <kkojima@rr.iij4u.or.jp>.
|
||||||
@ -114,13 +114,12 @@
|
|||||||
|
|
||||||
# elif defined _LIBC_REENTRANT
|
# elif defined _LIBC_REENTRANT
|
||||||
|
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# else
|
||||||
# else
|
# define SYSCALL_ERROR_ERRNO errno
|
||||||
# define SYSCALL_ERROR_ERRNO errno
|
# endif
|
||||||
# endif
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
neg r0,r1; \
|
neg r0,r1; \
|
||||||
mov r12,r2; \
|
mov r12,r2; \
|
||||||
mov.l 0f,r12; \
|
mov.l 0f,r12; \
|
||||||
@ -137,43 +136,6 @@
|
|||||||
.align 2; \
|
.align 2; \
|
||||||
0: .long _GLOBAL_OFFSET_TABLE_; \
|
0: .long _GLOBAL_OFFSET_TABLE_; \
|
||||||
1: .long SYSCALL_ERROR_ERRNO@GOTTPOFF
|
1: .long SYSCALL_ERROR_ERRNO@GOTTPOFF
|
||||||
# else
|
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
neg r0,r1; \
|
|
||||||
mov.l r14,@-r15; \
|
|
||||||
cfi_adjust_cfa_offset (4); \
|
|
||||||
cfi_rel_offset (r14, 0); \
|
|
||||||
mov.l r12,@-r15; \
|
|
||||||
cfi_adjust_cfa_offset (4); \
|
|
||||||
cfi_rel_offset (r12, 0); \
|
|
||||||
mov.l r1,@-r15; \
|
|
||||||
cfi_adjust_cfa_offset (4); \
|
|
||||||
cfi_rel_offset (r1, 0); \
|
|
||||||
mov.l 0f,r12; \
|
|
||||||
mova 0f,r0; \
|
|
||||||
add r0,r12; \
|
|
||||||
sts.l pr,@-r15; \
|
|
||||||
cfi_adjust_cfa_offset (4); \
|
|
||||||
cfi_rel_offset (pr, 0); \
|
|
||||||
mov r15,r14; \
|
|
||||||
cfi_def_cfa_register (r14); \
|
|
||||||
mov.l 1f,r1; \
|
|
||||||
bsrf r1; \
|
|
||||||
nop; \
|
|
||||||
2: mov r14,r15; \
|
|
||||||
lds.l @r15+,pr; \
|
|
||||||
mov.l @r15+,r1; \
|
|
||||||
mov.l r1,@r0; \
|
|
||||||
mov.l @r15+,r12; \
|
|
||||||
mov.l @r15+,r14; \
|
|
||||||
bra .Lpseudo_end; \
|
|
||||||
mov _IMM1,r0; \
|
|
||||||
.align 2; \
|
|
||||||
0: .long _GLOBAL_OFFSET_TABLE_; \
|
|
||||||
1: .long PLTJMP(C_SYMBOL_NAME(__errno_location))-(2b-.)
|
|
||||||
/* A quick note: it is assumed that the call to `__errno_location' does
|
|
||||||
not modify the stack! */
|
|
||||||
# endif
|
|
||||||
# else
|
# else
|
||||||
/* Store (-r0) into errno through the GOT. */
|
/* Store (-r0) into errno through the GOT. */
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
@ -324,8 +286,8 @@
|
|||||||
unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \
|
unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \
|
||||||
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \
|
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \
|
||||||
{ \
|
{ \
|
||||||
__set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \
|
__set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \
|
||||||
resultvar = 0xffffffff; \
|
resultvar = 0xffffffff; \
|
||||||
} \
|
} \
|
||||||
(int) resultvar; })
|
(int) resultvar; })
|
||||||
|
|
||||||
@ -347,7 +309,7 @@
|
|||||||
#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
|
#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
|
||||||
({ \
|
({ \
|
||||||
unsigned long int resultvar; \
|
unsigned long int resultvar; \
|
||||||
register long int r3 asm ("%r3") = (name); \
|
register long int r3 asm ("%r3") = (name); \
|
||||||
SUBSTITUTE_ARGS_##nr(args); \
|
SUBSTITUTE_ARGS_##nr(args); \
|
||||||
\
|
\
|
||||||
asm volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \
|
asm volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1997, 2002, 2003, 2004, 2006, 2008
|
/* Copyright (C) 1997, 2002, 2003, 2004, 2006, 2008, 2011
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997.
|
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997.
|
||||||
@ -99,32 +99,19 @@ ENTRY(name); \
|
|||||||
mov -1, %o0;
|
mov -1, %o0;
|
||||||
# elif defined _LIBC_REENTRANT
|
# elif defined _LIBC_REENTRANT
|
||||||
|
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# else
|
||||||
# else
|
# define SYSCALL_ERROR_ERRNO errno
|
||||||
# define SYSCALL_ERROR_ERRNO errno
|
# endif
|
||||||
# endif
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0: SETUP_PIC_REG(o2,g1) \
|
0: SETUP_PIC_REG(o2,g1) \
|
||||||
sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \
|
sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \
|
||||||
add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \
|
add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \
|
||||||
ld [%o2 + %g1], %g1, %tie_ld(SYSCALL_ERROR_ERRNO); \
|
ld [%o2 + %g1], %g1, %tie_ld(SYSCALL_ERROR_ERRNO); \
|
||||||
st %o0, [%g7 + %g1]; \
|
st %o0, [%g7 + %g1]; \
|
||||||
jmp %o7 + 8; \
|
jmp %o7 + 8; \
|
||||||
mov -1, %o0;
|
mov -1, %o0;
|
||||||
# else
|
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0: save %sp, -96, %sp; \
|
|
||||||
cfi_def_cfa_register(%fp); \
|
|
||||||
cfi_window_save; \
|
|
||||||
cfi_register (%o7, %i7); \
|
|
||||||
call __errno_location; \
|
|
||||||
nop; \
|
|
||||||
st %i0, [%o0]; \
|
|
||||||
jmp %i7 + 8; \
|
|
||||||
restore %g0, -1, %o0;
|
|
||||||
# endif
|
|
||||||
# else
|
# else
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
0: SETUP_PIC_REG(o2,g1) \
|
0: SETUP_PIC_REG(o2,g1) \
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1997, 2000, 2002, 2003, 2004, 2006, 2008
|
/* Copyright (C) 1997, 2000, 2002, 2003, 2004, 2006, 2008, 2011
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
|
Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
|
||||||
@ -106,32 +106,19 @@ ENTRY(name); \
|
|||||||
mov -1, %o0;
|
mov -1, %o0;
|
||||||
# elif defined _LIBC_REENTRANT
|
# elif defined _LIBC_REENTRANT
|
||||||
|
|
||||||
# if USE___THREAD
|
# ifndef NOT_IN_libc
|
||||||
# ifndef NOT_IN_libc
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# else
|
||||||
# else
|
# define SYSCALL_ERROR_ERRNO errno
|
||||||
# define SYSCALL_ERROR_ERRNO errno
|
# endif
|
||||||
# endif
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0: SETUP_PIC_REG(o2,g1) \
|
0: SETUP_PIC_REG(o2,g1) \
|
||||||
sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \
|
sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \
|
||||||
add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \
|
add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \
|
||||||
ldx [%o2 + %g1], %g1, %tie_ldx(SYSCALL_ERROR_ERRNO);\
|
ldx [%o2 + %g1], %g1, %tie_ldx(SYSCALL_ERROR_ERRNO);\
|
||||||
st %o0, [%g7 + %g1]; \
|
st %o0, [%g7 + %g1]; \
|
||||||
jmp %o7 + 8; \
|
jmp %o7 + 8; \
|
||||||
mov -1, %o0;
|
mov -1, %o0;
|
||||||
# else
|
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0: save %sp, -176, %sp; \
|
|
||||||
cfi_def_cfa_register(%fp); \
|
|
||||||
cfi_window_save; \
|
|
||||||
cfi_register (%o7, %i7); \
|
|
||||||
call __errno_location; \
|
|
||||||
nop; \
|
|
||||||
st %i0, [%o0]; \
|
|
||||||
jmp %i7 + 8; \
|
|
||||||
restore %g0, -1, %o0;
|
|
||||||
# endif
|
|
||||||
# else
|
# else
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
# define SYSCALL_ERROR_HANDLER \
|
||||||
0: SETUP_PIC_REG(o2,g1) \
|
0: SETUP_PIC_REG(o2,g1) \
|
||||||
|
@ -124,7 +124,7 @@
|
|||||||
movl %edx, (%rcx); \
|
movl %edx, (%rcx); \
|
||||||
orq $-1, %rax; \
|
orq $-1, %rax; \
|
||||||
jmp L(pseudo_end);
|
jmp L(pseudo_end);
|
||||||
# elif USE___THREAD
|
# else
|
||||||
# ifndef NOT_IN_libc
|
# ifndef NOT_IN_libc
|
||||||
# define SYSCALL_ERROR_ERRNO __libc_errno
|
# define SYSCALL_ERROR_ERRNO __libc_errno
|
||||||
# else
|
# else
|
||||||
@ -138,34 +138,6 @@
|
|||||||
movl %edx, %fs:(%rcx); \
|
movl %edx, %fs:(%rcx); \
|
||||||
orq $-1, %rax; \
|
orq $-1, %rax; \
|
||||||
jmp L(pseudo_end);
|
jmp L(pseudo_end);
|
||||||
# elif defined _LIBC_REENTRANT
|
|
||||||
/* Store (- %rax) into errno through the GOT.
|
|
||||||
Note that errno occupies only 4 bytes. */
|
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0: \
|
|
||||||
xorl %edx, %edx; \
|
|
||||||
subq %rax, %rdx; \
|
|
||||||
pushq %rdx; \
|
|
||||||
cfi_adjust_cfa_offset(8); \
|
|
||||||
PUSH_ERRNO_LOCATION_RETURN; \
|
|
||||||
call BP_SYM (__errno_location)@PLT; \
|
|
||||||
POP_ERRNO_LOCATION_RETURN; \
|
|
||||||
popq %rdx; \
|
|
||||||
cfi_adjust_cfa_offset(-8); \
|
|
||||||
movl %edx, (%rax); \
|
|
||||||
orq $-1, %rax; \
|
|
||||||
jmp L(pseudo_end);
|
|
||||||
|
|
||||||
/* A quick note: it is assumed that the call to `__errno_location' does
|
|
||||||
not modify the stack! */
|
|
||||||
# else /* Not _LIBC_REENTRANT. */
|
|
||||||
# define SYSCALL_ERROR_HANDLER \
|
|
||||||
0:movq errno@GOTPCREL(%RIP), %rcx; \
|
|
||||||
xorl %edx, %edx; \
|
|
||||||
subq %rax, %rdx; \
|
|
||||||
movl %edx, (%rcx); \
|
|
||||||
orq $-1, %rax; \
|
|
||||||
jmp L(pseudo_end);
|
|
||||||
# endif /* PIC */
|
# endif /* PIC */
|
||||||
|
|
||||||
/* The Linux/x86-64 kernel expects the system call parameters in
|
/* The Linux/x86-64 kernel expects the system call parameters in
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
|
/* Copyright (C) 2001, 2002, 2004, 2005, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -45,43 +45,11 @@ syscall_error:
|
|||||||
movl $EAGAIN, %eax /* Yes; translate it to EAGAIN. */
|
movl $EAGAIN, %eax /* Yes; translate it to EAGAIN. */
|
||||||
notb:
|
notb:
|
||||||
#endif
|
#endif
|
||||||
#if USE___THREAD
|
#ifdef PIC
|
||||||
# ifdef PIC
|
|
||||||
movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx
|
movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx
|
||||||
movl %eax, %fs:0(%rcx)
|
movl %eax, %fs:0(%rcx)
|
||||||
# else
|
|
||||||
movl %eax, %fs:C_SYMBOL_NAME(errno@TPOFF)
|
|
||||||
# endif
|
|
||||||
#elif !defined PIC
|
|
||||||
# ifndef _LIBC_REENTRANT
|
|
||||||
movl %eax, C_SYMBOL_NAME(errno)
|
|
||||||
# else
|
|
||||||
pushq %rax
|
|
||||||
cfi_adjust_cfa_offset(8)
|
|
||||||
PUSH_ERRNO_LOCATION_RETURN
|
|
||||||
call BP_SYM (__errno_location)
|
|
||||||
POP_ERRNO_LOCATION_RETURN
|
|
||||||
popq %rcx
|
|
||||||
cfi_adjust_cfa_offset(-8)
|
|
||||||
movl %ecx, (%rax)
|
|
||||||
# endif
|
|
||||||
#else
|
#else
|
||||||
# if RTLD_PRIVATE_ERRNO
|
movl %eax, %fs:C_SYMBOL_NAME(errno@TPOFF)
|
||||||
leaq rtld_errno(%rip), %rcx
|
|
||||||
movl %eax, (%rcx)
|
|
||||||
# elif !defined _LIBC_REENTRANT
|
|
||||||
movq C_SYMBOL_NAME(errno)@GOTPCREL(%rip), %rcx
|
|
||||||
movl %eax, (%rcx)
|
|
||||||
# else
|
|
||||||
pushq %rax
|
|
||||||
cfi_adjust_cfa_offset(8)
|
|
||||||
PUSH_ERRNO_LOCATION_RETURN
|
|
||||||
call C_SYMBOL_NAME (BP_SYM (__errno_location)@PLT)
|
|
||||||
POP_ERRNO_LOCATION_RETURN
|
|
||||||
popq %rcx
|
|
||||||
cfi_adjust_cfa_offset(-8)
|
|
||||||
movl %ecx, (%rax)
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
movq $-1, %rax
|
movq $-1, %rax
|
||||||
ret
|
ret
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. x86-64 version.
|
/* Machine-dependent ELF dynamic relocation inline functions. x86-64 version.
|
||||||
Copyright (C) 2001-2006, 2008, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2001-2006, 2008-2010, 2011 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Andreas Jaeger <aj@suse.de>.
|
Contributed by Andreas Jaeger <aj@suse.de>.
|
||||||
|
|
||||||
@ -195,8 +195,7 @@ _dl_start_user:\n\
|
|||||||
define the value.
|
define the value.
|
||||||
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
||||||
of the main executable's symbols, as for a COPY reloc. */
|
of the main executable's symbols, as for a COPY reloc. */
|
||||||
#if !defined RTLD_BOOTSTRAP || USE___THREAD
|
#define elf_machine_type_class(type) \
|
||||||
# define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_X86_64_JUMP_SLOT \
|
((((type) == R_X86_64_JUMP_SLOT \
|
||||||
|| (type) == R_X86_64_DTPMOD64 \
|
|| (type) == R_X86_64_DTPMOD64 \
|
||||||
|| (type) == R_X86_64_DTPOFF64 \
|
|| (type) == R_X86_64_DTPOFF64 \
|
||||||
@ -204,11 +203,6 @@ _dl_start_user:\n\
|
|||||||
|| (type) == R_X86_64_TLSDESC) \
|
|| (type) == R_X86_64_TLSDESC) \
|
||||||
* ELF_RTYPE_CLASS_PLT) \
|
* ELF_RTYPE_CLASS_PLT) \
|
||||||
| (((type) == R_X86_64_COPY) * ELF_RTYPE_CLASS_COPY))
|
| (((type) == R_X86_64_COPY) * ELF_RTYPE_CLASS_COPY))
|
||||||
#else
|
|
||||||
# define elf_machine_type_class(type) \
|
|
||||||
((((type) == R_X86_64_JUMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
|
|
||||||
| (((type) == R_X86_64_COPY) * ELF_RTYPE_CLASS_COPY))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||||
#define ELF_MACHINE_JMP_SLOT R_X86_64_JUMP_SLOT
|
#define ELF_MACHINE_JMP_SLOT R_X86_64_JUMP_SLOT
|
||||||
@ -302,10 +296,6 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
&& __builtin_expect (sym->st_shndx != SHN_UNDEF, 1))
|
&& __builtin_expect (sym->st_shndx != SHN_UNDEF, 1))
|
||||||
value = ((Elf64_Addr (*) (void)) value) ();
|
value = ((Elf64_Addr (*) (void)) value) ();
|
||||||
|
|
||||||
# if defined RTLD_BOOTSTRAP && !USE___THREAD
|
|
||||||
assert (r_type == R_X86_64_GLOB_DAT || r_type == R_X86_64_JUMP_SLOT);
|
|
||||||
*reloc_addr = value + reloc->r_addend;
|
|
||||||
# else
|
|
||||||
switch (r_type)
|
switch (r_type)
|
||||||
{
|
{
|
||||||
case R_X86_64_GLOB_DAT:
|
case R_X86_64_GLOB_DAT:
|
||||||
@ -453,7 +443,6 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
break;
|
break;
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,8 +2,4 @@
|
|||||||
|
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
|
|
||||||
#if USE___THREAD
|
|
||||||
@@@ use-thread = yes @@@
|
@@@ use-thread = yes @@@
|
||||||
#else
|
|
||||||
@@@ use-thread = no @@@
|
|
||||||
#endif
|
|
||||||
|
Reference in New Issue
Block a user