mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-05 01:00:14 +00:00
Mon Jul 8 02:14:25 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* libc-symbols.h [GCC >= 2.7] (strong_alias, weak_alias): Use extern storage class. GCC gives an error for non-extern data defns with the alias attribute. Mon Jul 8 00:11:15 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> * libc-symbols.h (weak_function): New macro. For GCC 2.7+ define as __attribute__ ((weak)). * elf/dl-minimal.c: Use weak_function as keyword in function defns instead of weak_symbol (NAME) after the defn. * stdlib/strtol.c: Likewise. * sysdeps/mach/hurd/dl-sysdep.c: Likewise. * sysdeps/alpha/dl-machine.h (elf_machine_rela) [RTLD_BOOTSTRAP]: If this is defined, don't declare _dl_rtld_map as weak, and don't check for MAP pointing to it. RESOLVE is always null in this case, so test with #ifdef instead of if. * libc-symbols.h (symbol_set_declare): Use weak_extern instead of weak_symbol. * csu/initfini.c (_init): Likewise. * locale/setlocale.c (DEFINE_CATEGORY): Likewise. * misc/efgcvt_r.c: Likewise. * sysdeps/alpha/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/i386/dl-machine.h (elf_machine_rel): Likewise. * libc-symbols.h [ASSEMBLER] (weak_symbol): Macro removed. It was not used in any assembler code. (weak_symbol_asm): Renamed to weak_extern_asm. (weak_extern): New macro replaces weak_symbol for weak extern refs; define to weak_extern_asm for [!ASSEMBLER]. * libc-symbols.h [! ASSEMBLER] [HAVE_WEAK_SYMBOLS] (weak_symbol_asm, weak_alias_asm): New macros, renamed from weak_symbol/weak_alias; define those now as aliases. Change conditional to use __attribute__ syntax for GCC 2.7+, not 2.8+ [GCC >= 2.7] [HAVE_WEAK_SYMBOLS] (weak_symbol): Do weak_symbol_asm after GCC weak attribute decl.
This commit is contained in:
parent
0676b5fdca
commit
af5b3bc33b
42
ChangeLog
42
ChangeLog
@ -1,10 +1,51 @@
|
|||||||
|
Mon Jul 8 02:14:25 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* libc-symbols.h [GCC >= 2.7] (strong_alias, weak_alias): Use extern
|
||||||
|
storage class. GCC gives an error for non-extern data defns with the
|
||||||
|
alias attribute.
|
||||||
|
|
||||||
Mon Jul 8 01:37:34 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu>
|
Mon Jul 8 01:37:34 1996 Michael I. Bushnell, p/BSG <mib@gnu.ai.mit.edu>
|
||||||
|
|
||||||
* string/argz-insert.c (__argz_insert): (__argz_insert): Use
|
* string/argz-insert.c (__argz_insert): (__argz_insert): Use
|
||||||
memmove instead of memcpy for possible overlapping strings.
|
memmove instead of memcpy for possible overlapping strings.
|
||||||
|
|
||||||
|
Mon Jul 8 00:11:15 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* libc-symbols.h (weak_function): New macro.
|
||||||
|
For GCC 2.7+ define as __attribute__ ((weak)).
|
||||||
|
* elf/dl-minimal.c: Use weak_function as keyword in function defns
|
||||||
|
instead of weak_symbol (NAME) after the defn.
|
||||||
|
* stdlib/strtol.c: Likewise.
|
||||||
|
* sysdeps/mach/hurd/dl-sysdep.c: Likewise.
|
||||||
|
|
||||||
|
* sysdeps/alpha/dl-machine.h (elf_machine_rela) [RTLD_BOOTSTRAP]:
|
||||||
|
If this is defined, don't declare _dl_rtld_map as weak, and
|
||||||
|
don't check for MAP pointing to it. RESOLVE is always null in this
|
||||||
|
case, so test with #ifdef instead of if.
|
||||||
|
|
||||||
|
* libc-symbols.h (symbol_set_declare): Use weak_extern instead of
|
||||||
|
weak_symbol.
|
||||||
|
* csu/initfini.c (_init): Likewise.
|
||||||
|
* locale/setlocale.c (DEFINE_CATEGORY): Likewise.
|
||||||
|
* misc/efgcvt_r.c: Likewise.
|
||||||
|
* sysdeps/alpha/dl-machine.h (elf_machine_rela): Likewise.
|
||||||
|
* sysdeps/i386/dl-machine.h (elf_machine_rel): Likewise.
|
||||||
|
|
||||||
|
* libc-symbols.h [ASSEMBLER] (weak_symbol): Macro removed.
|
||||||
|
It was not used in any assembler code.
|
||||||
|
(weak_symbol_asm): Renamed to weak_extern_asm.
|
||||||
|
(weak_extern): New macro replaces weak_symbol for weak extern refs;
|
||||||
|
define to weak_extern_asm for [!ASSEMBLER].
|
||||||
|
|
||||||
Sun Jul 7 18:42:06 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
|
Sun Jul 7 18:42:06 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* libc-symbols.h [! ASSEMBLER] [HAVE_WEAK_SYMBOLS] (weak_symbol_asm,
|
||||||
|
weak_alias_asm): New macros, renamed from weak_symbol/weak_alias;
|
||||||
|
define those now as aliases.
|
||||||
|
Change conditional to use __attribute__ syntax for GCC 2.7+, not 2.8+
|
||||||
|
[GCC >= 2.7] [HAVE_WEAK_SYMBOLS] (weak_symbol): Do weak_symbol_asm
|
||||||
|
after GCC weak attribute decl.
|
||||||
|
|
||||||
* sysdeps/gnu/errlist.awk (BEGIN): Initialize associative array ALIAS,
|
* sysdeps/gnu/errlist.awk (BEGIN): Initialize associative array ALIAS,
|
||||||
map EWOULDBLOCK->EAGAIN, EDEADLOCK->EDEADLK.
|
map EWOULDBLOCK->EAGAIN, EDEADLOCK->EDEADLK.
|
||||||
(element printer): Check for elt in ALIAS, instead of special case
|
(element printer): Check for elt in ALIAS, instead of special case
|
||||||
@ -34,7 +75,6 @@ Fri May 31 11:48:46 1996 Miles Bader <miles@gnu.ai.mit.edu>
|
|||||||
(line_wrap_set_lmargin, line_wrap_set_rmargin,
|
(line_wrap_set_lmargin, line_wrap_set_rmargin,
|
||||||
line_wrap_set_wmargin, line_wrap_point): Use __line_wrap_update.
|
line_wrap_set_wmargin, line_wrap_point): Use __line_wrap_update.
|
||||||
|
|
||||||
|
|
||||||
* stdio/linewrap.h (struct line_wrap_data): Rename POINT field to
|
* stdio/linewrap.h (struct line_wrap_data): Rename POINT field to
|
||||||
POINT_COL. Add POINT_OFFS field.
|
POINT_COL. Add POINT_OFFS field.
|
||||||
(__line_wrap_update): New decl.
|
(__line_wrap_update): New decl.
|
||||||
|
@ -30,7 +30,7 @@ Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
static void *alloc_ptr, *alloc_end, *alloc_last_block;
|
static void *alloc_ptr, *alloc_end, *alloc_last_block;
|
||||||
|
|
||||||
void *
|
void * weak_function
|
||||||
malloc (size_t n)
|
malloc (size_t n)
|
||||||
{
|
{
|
||||||
extern int _dl_zerofd;
|
extern int _dl_zerofd;
|
||||||
@ -71,20 +71,18 @@ malloc (size_t n)
|
|||||||
alloc_ptr += n;
|
alloc_ptr += n;
|
||||||
return alloc_last_block;
|
return alloc_last_block;
|
||||||
}
|
}
|
||||||
weak_symbol (malloc)
|
|
||||||
|
|
||||||
/* This will rarely be called. */
|
/* This will rarely be called. */
|
||||||
void
|
void weak_function
|
||||||
free (void *ptr)
|
free (void *ptr)
|
||||||
{
|
{
|
||||||
/* We can free only the last block allocated. */
|
/* We can free only the last block allocated. */
|
||||||
if (ptr == alloc_last_block)
|
if (ptr == alloc_last_block)
|
||||||
alloc_ptr = alloc_last_block;
|
alloc_ptr = alloc_last_block;
|
||||||
}
|
}
|
||||||
weak_symbol (free)
|
|
||||||
|
|
||||||
/* This is only called with the most recent block returned by malloc. */
|
/* This is only called with the most recent block returned by malloc. */
|
||||||
void *
|
void * weak_function
|
||||||
realloc (void *ptr, size_t n)
|
realloc (void *ptr, size_t n)
|
||||||
{
|
{
|
||||||
void *new;
|
void *new;
|
||||||
@ -94,31 +92,27 @@ realloc (void *ptr, size_t n)
|
|||||||
assert (new == ptr);
|
assert (new == ptr);
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
weak_symbol (realloc)
|
|
||||||
|
|
||||||
/* Avoid signal frobnication in setjmp/longjmp. Keeps things smaller. */
|
/* Avoid signal frobnication in setjmp/longjmp. Keeps things smaller. */
|
||||||
|
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
|
|
||||||
int __sigjmp_save (sigjmp_buf env, int savemask)
|
int weak_function
|
||||||
|
__sigjmp_save (sigjmp_buf env, int savemask)
|
||||||
{ env[0].__mask_was_saved = savemask; return 0; }
|
{ env[0].__mask_was_saved = savemask; return 0; }
|
||||||
weak_symbol (__sigjmp_save)
|
|
||||||
|
|
||||||
void
|
void weak_function
|
||||||
longjmp (jmp_buf env, int val) { __longjmp (env[0].__jmpbuf, val); }
|
longjmp (jmp_buf env, int val) { __longjmp (env[0].__jmpbuf, val); }
|
||||||
weak_symbol (longjmp)
|
|
||||||
|
|
||||||
|
|
||||||
/* Define our own stub for the localization function used by strerror.
|
/* Define our own stub for the localization function used by strerror.
|
||||||
English-only in the dynamic linker keeps it smaller. */
|
English-only in the dynamic linker keeps it smaller. */
|
||||||
|
|
||||||
char *
|
char * weak_function
|
||||||
__dgettext (const char *domainname, const char *msgid)
|
__dgettext (const char *domainname, const char *msgid)
|
||||||
{
|
{
|
||||||
assert (domainname == _libc_intl_domainname);
|
assert (domainname == _libc_intl_domainname);
|
||||||
return (char *) msgid;
|
return (char *) msgid;
|
||||||
}
|
}
|
||||||
weak_symbol (__dgettext)
|
|
||||||
weak_alias (__dgettext, dgettext)
|
weak_alias (__dgettext, dgettext)
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
@ -127,7 +121,7 @@ weak_alias (__dgettext, dgettext)
|
|||||||
If we are linked into the user program (-ldl), the normal __assert_fail
|
If we are linked into the user program (-ldl), the normal __assert_fail
|
||||||
defn can override this one. */
|
defn can override this one. */
|
||||||
|
|
||||||
void
|
void weak_function
|
||||||
__assert_fail (const char *assertion,
|
__assert_fail (const char *assertion,
|
||||||
const char *file, unsigned int line, const char *function)
|
const char *file, unsigned int line, const char *function)
|
||||||
{
|
{
|
||||||
@ -140,9 +134,8 @@ __assert_fail (const char *assertion,
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
weak_symbol (__assert_fail)
|
|
||||||
|
|
||||||
void
|
void weak_function
|
||||||
__assert_perror_fail (int errnum,
|
__assert_perror_fail (int errnum,
|
||||||
const char *file, unsigned int line,
|
const char *file, unsigned int line,
|
||||||
const char *function)
|
const char *function)
|
||||||
@ -155,6 +148,5 @@ __assert_perror_fail (int errnum,
|
|||||||
"Unexpected error: ", strerror (errnum), "\n", NULL);
|
"Unexpected error: ", strerror (errnum), "\n", NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
weak_symbol (__assert_perror_fail)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -143,8 +143,9 @@ extern const char _libc_intl_domainname[];
|
|||||||
#define weak_alias(original, alias) \
|
#define weak_alias(original, alias) \
|
||||||
.weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
|
.weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
|
||||||
|
|
||||||
/* Declare SYMBOL to be weak. */
|
/* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */
|
||||||
#define weak_symbol(symbol) .weakext C_SYMBOL_NAME (symbol)
|
#define weak_extern(symbol) \
|
||||||
|
.weakext C_SYMBOL_NAME (symbol)
|
||||||
|
|
||||||
#else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
#else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
||||||
|
|
||||||
@ -154,49 +155,65 @@ extern const char _libc_intl_domainname[];
|
|||||||
.weak C_SYMBOL_NAME (alias); \
|
.weak C_SYMBOL_NAME (alias); \
|
||||||
C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
|
||||||
|
|
||||||
/* Declare SYMBOL to be weak. */
|
|
||||||
#define weak_symbol(symbol) .weak C_SYMBOL_NAME (symbol)
|
/* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */
|
||||||
|
#define weak_extern(symbol) \
|
||||||
|
.weak C_SYMBOL_NAME (symbol)
|
||||||
|
|
||||||
#endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
#endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
||||||
|
|
||||||
#else /* ! ASSEMBLER */
|
#else /* ! ASSEMBLER */
|
||||||
|
|
||||||
#ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
|
#ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
|
||||||
#define weak_symbol(symbol) asm (".weakext " __SYMBOL_PREFIX #symbol);
|
#define weak_extern_asm(symbol) asm (".weakext " __SYMBOL_PREFIX #symbol);
|
||||||
#define weak_alias(original, alias) \
|
#define weak_alias_asm(original, alias) \
|
||||||
asm (".weakext " __SYMBOL_PREFIX #alias ", " __SYMBOL_PREFIX #original);
|
asm (".weakext " __SYMBOL_PREFIX #alias ", " __SYMBOL_PREFIX #original);
|
||||||
#else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
#else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
||||||
#define weak_symbol(symbol) asm (".weak " __SYMBOL_PREFIX #symbol);
|
#define weak_extern_asm(symbol) asm (".weak " __SYMBOL_PREFIX #symbol);
|
||||||
#define weak_alias(original, alias) \
|
#define weak_alias_asm(original, alias) \
|
||||||
asm (".weak " __SYMBOL_PREFIX #alias "\n" \
|
asm (".weak " __SYMBOL_PREFIX #alias "\n" \
|
||||||
__SYMBOL_PREFIX #alias " = " __SYMBOL_PREFIX #original);
|
__SYMBOL_PREFIX #alias " = " __SYMBOL_PREFIX #original);
|
||||||
#endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
#endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
|
||||||
|
|
||||||
|
#define weak_alias(o, a) weak_alias_asm (o, a)
|
||||||
|
#define weak_extern(symbol) weak_extern_asm (symbol)
|
||||||
|
|
||||||
#endif /* ! ASSEMBLER */
|
#endif /* ! ASSEMBLER */
|
||||||
#else
|
#else
|
||||||
#define weak_alias(original, alias) strong_alias(original, alias)
|
#define weak_alias(original, alias) strong_alias(original, alias)
|
||||||
#define weak_symbol(symbol) /* Do nothing. */
|
#define weak_extern(symbol) /* Do nothing; the ref will be strong. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if (!defined (ASSEMBLER) && \
|
#if (!defined (ASSEMBLER) && \
|
||||||
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)))
|
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)))
|
||||||
/* GCC 2.8 and later has special syntax for weak symbols and aliases.
|
/* GCC 2.7 and later has special syntax for weak symbols and aliases.
|
||||||
Using that is better when possible, because the compiler and assembler
|
Using that is better when possible, because the compiler and assembler
|
||||||
are better clued in to what we are doing. */
|
are better clued in to what we are doing. */
|
||||||
#undef strong_alias
|
#undef strong_alias
|
||||||
#define strong_alias(name, aliasname) \
|
#define strong_alias(name, aliasname) \
|
||||||
__typeof (name) aliasname __attribute__ ((alias (#name)));
|
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
||||||
|
|
||||||
#ifdef HAVE_WEAK_SYMBOLS
|
#ifdef HAVE_WEAK_SYMBOLS
|
||||||
#undef weak_symbol
|
|
||||||
#define weak_symbol(name) \
|
|
||||||
extern __typeof (name) name __attribute__ ((weak));
|
|
||||||
#undef weak_alias
|
#undef weak_alias
|
||||||
#define weak_alias(name, aliasname) \
|
#define weak_alias(name, aliasname) \
|
||||||
__typeof (name) aliasname __attribute__ ((weak, alias (#name)));
|
extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
|
||||||
#endif /* HAVE_WEAK_SYMBOLS. */
|
|
||||||
#endif /* Not ASSEMBLER, and GCC 2.8 or later. */
|
|
||||||
|
|
||||||
|
/* This comes between the return type and function name in
|
||||||
|
a function definition to make that definition weak. */
|
||||||
|
#define weak_function __attribute__ ((weak))
|
||||||
|
|
||||||
|
#endif /* HAVE_WEAK_SYMBOLS. */
|
||||||
|
#endif /* Not ASSEMBLER, and GCC 2.7 or later. */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef weak_function
|
||||||
|
/* If we do not have the __attribute__ ((weak)) syntax, there is no way we
|
||||||
|
can define functions as weak symbols. The compiler will emit a `.globl'
|
||||||
|
directive for the function symbol, and a `.weak' directive in addition
|
||||||
|
will produce an error from the assembler. */
|
||||||
|
#define weak_function /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* When a reference to SYMBOL is encountered, the linker will emit a
|
/* When a reference to SYMBOL is encountered, the linker will emit a
|
||||||
@ -260,8 +277,7 @@ extern const char _libc_intl_domainname[];
|
|||||||
#define symbol_set_declare(set) \
|
#define symbol_set_declare(set) \
|
||||||
extern void *const __start_##set __attribute__ ((__weak__)); \
|
extern void *const __start_##set __attribute__ ((__weak__)); \
|
||||||
extern void *const __stop_##set __attribute__ ((__weak__)); \
|
extern void *const __stop_##set __attribute__ ((__weak__)); \
|
||||||
/* Gratuitously repeat weak decl, in case using broken GCC (<2.8). */\
|
weak_extern (__start_##set) weak_extern (__stop_##set)
|
||||||
weak_symbol (__start_##set) weak_symbol (__stop_##set)
|
|
||||||
|
|
||||||
/* Return a pointer (void *const *) to the first element of SET. */
|
/* Return a pointer (void *const *) to the first element of SET. */
|
||||||
#define symbol_set_first_element(set) (&__start_##set)
|
#define symbol_set_first_element(set) (&__start_##set)
|
||||||
|
@ -338,6 +338,9 @@ noconv:
|
|||||||
|
|
||||||
/* External user entry point. */
|
/* External user entry point. */
|
||||||
INT
|
INT
|
||||||
|
#ifdef weak_function
|
||||||
|
weak_function
|
||||||
|
#endif
|
||||||
strtol (nptr, endptr, base)
|
strtol (nptr, endptr, base)
|
||||||
const STRING_TYPE *nptr;
|
const STRING_TYPE *nptr;
|
||||||
STRING_TYPE **endptr;
|
STRING_TYPE **endptr;
|
||||||
@ -345,10 +348,3 @@ strtol (nptr, endptr, base)
|
|||||||
{
|
{
|
||||||
return INTERNAL (strtol) (nptr, endptr, base, 0);
|
return INTERNAL (strtol) (nptr, endptr, base, 0);
|
||||||
}
|
}
|
||||||
#ifdef weak_symbol
|
|
||||||
/* We need to weaken this symbol because some the the defined
|
|
||||||
functions do not come from ANSI. The indirection is necessary
|
|
||||||
because `strtol' might be a macro. */
|
|
||||||
#define weak_this(x) weak_symbol (x)
|
|
||||||
weak_this (strtol)
|
|
||||||
#endif
|
|
||||||
|
@ -161,7 +161,14 @@ elf_machine_rela (struct link_map *map,
|
|||||||
{
|
{
|
||||||
Elf64_Addr *const reloc_addr = (void *)(map->l_addr + reloc->r_offset);
|
Elf64_Addr *const reloc_addr = (void *)(map->l_addr + reloc->r_offset);
|
||||||
unsigned long r_info = ELF64_R_TYPE (reloc->r_info);
|
unsigned long r_info = ELF64_R_TYPE (reloc->r_info);
|
||||||
weak_symbol (_dl_rtld_map); /* Defined in rtld.c, but not in libc.a. */
|
#ifndef RTLD_BOOTSTRAP
|
||||||
|
/* This is defined in rtld.c, but nowhere in the static libc.a; make the
|
||||||
|
reference weak so static programs can still link. This declaration
|
||||||
|
cannot be done when compiling rtld.c (i.e. #ifdef RTLD_BOOTSTRAP)
|
||||||
|
because rtld.c contains the common defn for _dl_rtld_map, which is
|
||||||
|
incompatible with a weak decl in the same file. */
|
||||||
|
weak_extern (_dl_rtld_map);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* We cannot use a switch here because we cannot locate the switch
|
/* We cannot use a switch here because we cannot locate the switch
|
||||||
jump table until we've self-relocated. */
|
jump table until we've self-relocated. */
|
||||||
@ -169,38 +176,37 @@ elf_machine_rela (struct link_map *map,
|
|||||||
if (r_info == R_ALPHA_RELATIVE)
|
if (r_info == R_ALPHA_RELATIVE)
|
||||||
{
|
{
|
||||||
/* Already done in dynamic linker. */
|
/* Already done in dynamic linker. */
|
||||||
if (!resolve || map != &_dl_rtld_map)
|
#ifndef RTLD_BOOTSTRAP
|
||||||
|
if (map != &_dl_rtld_map)
|
||||||
|
#endif
|
||||||
*reloc_addr += map->l_addr;
|
*reloc_addr += map->l_addr;
|
||||||
}
|
}
|
||||||
else if (r_info == R_ALPHA_NONE)
|
else if (r_info == R_ALPHA_NONE)
|
||||||
;
|
return;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Elf64_Addr loadbase, sym_value;
|
Elf64_Addr loadbase, sym_value;
|
||||||
|
|
||||||
if (resolve)
|
#ifndef RTLD_BOOTSTRAP
|
||||||
{
|
loadbase = (*resolve)(&sym, (Elf64_Addr)reloc_addr,
|
||||||
loadbase = (*resolve)(&sym, (Elf64_Addr)reloc_addr,
|
r_info == R_ALPHA_JMP_SLOT);
|
||||||
r_info == R_ALPHA_JMP_SLOT);
|
#else
|
||||||
}
|
loadbase = map->l_addr;
|
||||||
else
|
#endif
|
||||||
loadbase = map->l_addr;
|
|
||||||
|
|
||||||
sym_value = sym ? loadbase + sym->st_value : 0;
|
sym_value = sym ? loadbase + sym->st_value : 0;
|
||||||
|
|
||||||
if (r_info == R_ALPHA_GLOB_DAT)
|
if (r_info == R_ALPHA_GLOB_DAT)
|
||||||
{
|
*reloc_addr = sym_value;
|
||||||
*reloc_addr = sym_value;
|
|
||||||
}
|
|
||||||
else if (r_info == R_ALPHA_JMP_SLOT)
|
else if (r_info == R_ALPHA_JMP_SLOT)
|
||||||
{
|
{
|
||||||
*reloc_addr = sym_value;
|
*reloc_addr = sym_value;
|
||||||
elf_alpha_fix_plt(map, reloc, (Elf64_Addr)reloc_addr, sym_value);
|
elf_alpha_fix_plt (map, reloc, (Elf64_Addr) reloc_addr, sym_value);
|
||||||
}
|
}
|
||||||
else if (r_info == R_ALPHA_REFQUAD)
|
else if (r_info == R_ALPHA_REFQUAD)
|
||||||
{
|
{
|
||||||
sym_value += *reloc_addr;
|
sym_value += *reloc_addr;
|
||||||
if (resolve && map == &_dl_rtld_map)
|
#ifndef RTLD_BOOTSTRAP
|
||||||
|
if (map == &_dl_rtld_map)
|
||||||
{
|
{
|
||||||
/* Undo the relocation done here during bootstrapping.
|
/* Undo the relocation done here during bootstrapping.
|
||||||
Now we will relocate anew, possibly using a binding
|
Now we will relocate anew, possibly using a binding
|
||||||
@ -213,6 +219,7 @@ elf_machine_rela (struct link_map *map,
|
|||||||
sym_value -= dlsymtab[ELF64_R_SYM(reloc->r_info)].st_value;
|
sym_value -= dlsymtab[ELF64_R_SYM(reloc->r_info)].st_value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
sym_value += reloc->r_addend;
|
sym_value += reloc->r_addend;
|
||||||
*reloc_addr = sym_value;
|
*reloc_addr = sym_value;
|
||||||
}
|
}
|
||||||
|
@ -271,7 +271,7 @@ _dl_sysdep_message (const char *msg, ...)
|
|||||||
dynamic linker re-relocates itself to be user-visible (for -ldl),
|
dynamic linker re-relocates itself to be user-visible (for -ldl),
|
||||||
it will get the user's definition (i.e. usually libc's). */
|
it will get the user's definition (i.e. usually libc's). */
|
||||||
|
|
||||||
int
|
int weak_function
|
||||||
__open (const char *file_name, int mode, ...)
|
__open (const char *file_name, int mode, ...)
|
||||||
{
|
{
|
||||||
enum retry_type doretry;
|
enum retry_type doretry;
|
||||||
@ -496,7 +496,7 @@ __open (const char *file_name, int mode, ...)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int weak_function
|
||||||
__close (int fd)
|
__close (int fd)
|
||||||
{
|
{
|
||||||
if (fd != (int) MACH_PORT_NULL)
|
if (fd != (int) MACH_PORT_NULL)
|
||||||
@ -504,7 +504,7 @@ __close (int fd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
caddr_t
|
caddr_t weak_function
|
||||||
__mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
|
__mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
|
||||||
{
|
{
|
||||||
error_t err;
|
error_t err;
|
||||||
@ -546,7 +546,7 @@ __mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
|
|||||||
return err ? (caddr_t) __hurd_fail (err) : (caddr_t) mapaddr;
|
return err ? (caddr_t) __hurd_fail (err) : (caddr_t) mapaddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void weak_function
|
||||||
_exit (int status)
|
_exit (int status)
|
||||||
{
|
{
|
||||||
__proc_mark_exit (_dl_hurd_data->portarray[INIT_PORT_PROC],
|
__proc_mark_exit (_dl_hurd_data->portarray[INIT_PORT_PROC],
|
||||||
@ -554,11 +554,6 @@ _exit (int status)
|
|||||||
while (__task_terminate (__mach_task_self ()))
|
while (__task_terminate (__mach_task_self ()))
|
||||||
__mach_task_self_ = (__mach_task_self) ();
|
__mach_task_self_ = (__mach_task_self) ();
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_symbol (_exit)
|
|
||||||
weak_symbol (__open)
|
|
||||||
weak_symbol (__close)
|
|
||||||
weak_symbol (__mmap)
|
|
||||||
|
|
||||||
|
|
||||||
/* This function is called by interruptible RPC stubs. For initial
|
/* This function is called by interruptible RPC stubs. For initial
|
||||||
@ -566,7 +561,7 @@ weak_symbol (__mmap)
|
|||||||
weak, the real defn in libc.so will override it if we are linked into
|
weak, the real defn in libc.so will override it if we are linked into
|
||||||
the user program (-ldl). */
|
the user program (-ldl). */
|
||||||
|
|
||||||
error_t
|
error_t weak_function
|
||||||
_hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
|
_hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
|
||||||
mach_msg_option_t option,
|
mach_msg_option_t option,
|
||||||
mach_msg_size_t send_size,
|
mach_msg_size_t send_size,
|
||||||
@ -578,4 +573,3 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
|
|||||||
return __mach_msg (msg, option, send_size, rcv_size, rcv_name,
|
return __mach_msg (msg, option, send_size, rcv_size, rcv_name,
|
||||||
timeout, notify);
|
timeout, notify);
|
||||||
}
|
}
|
||||||
weak_symbol (_hurd_intr_rpc_mach_msg)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user