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:
Roland McGrath 1996-07-08 06:18:25 +00:00
parent 0676b5fdca
commit af5b3bc33b
6 changed files with 117 additions and 72 deletions

View File

@ -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>
* string/argz-insert.c (__argz_insert): (__argz_insert): Use
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>
* 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,
map EWOULDBLOCK->EAGAIN, EDEADLOCK->EDEADLK.
(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_wmargin, line_wrap_point): Use __line_wrap_update.
* stdio/linewrap.h (struct line_wrap_data): Rename POINT field to
POINT_COL. Add POINT_OFFS field.
(__line_wrap_update): New decl.

View File

@ -30,7 +30,7 @@ Cambridge, MA 02139, USA. */
static void *alloc_ptr, *alloc_end, *alloc_last_block;
void *
void * weak_function
malloc (size_t n)
{
extern int _dl_zerofd;
@ -71,20 +71,18 @@ malloc (size_t n)
alloc_ptr += n;
return alloc_last_block;
}
weak_symbol (malloc)
/* This will rarely be called. */
void
void weak_function
free (void *ptr)
{
/* We can free only the last block allocated. */
if (ptr == alloc_last_block)
alloc_ptr = alloc_last_block;
}
weak_symbol (free)
/* This is only called with the most recent block returned by malloc. */
void *
void * weak_function
realloc (void *ptr, size_t n)
{
void *new;
@ -94,31 +92,27 @@ realloc (void *ptr, size_t n)
assert (new == ptr);
return new;
}
weak_symbol (realloc)
/* Avoid signal frobnication in setjmp/longjmp. Keeps things smaller. */
#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; }
weak_symbol (__sigjmp_save)
void
void weak_function
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.
English-only in the dynamic linker keeps it smaller. */
char *
char * weak_function
__dgettext (const char *domainname, const char *msgid)
{
assert (domainname == _libc_intl_domainname);
return (char *) msgid;
}
weak_symbol (__dgettext)
weak_alias (__dgettext, dgettext)
#ifndef NDEBUG
@ -127,7 +121,7 @@ weak_alias (__dgettext, dgettext)
If we are linked into the user program (-ldl), the normal __assert_fail
defn can override this one. */
void
void weak_function
__assert_fail (const char *assertion,
const char *file, unsigned int line, const char *function)
{
@ -140,9 +134,8 @@ __assert_fail (const char *assertion,
NULL);
}
weak_symbol (__assert_fail)
void
void weak_function
__assert_perror_fail (int errnum,
const char *file, unsigned int line,
const char *function)
@ -155,6 +148,5 @@ __assert_perror_fail (int errnum,
"Unexpected error: ", strerror (errnum), "\n", NULL);
}
weak_symbol (__assert_perror_fail)
#endif

View File

@ -143,8 +143,9 @@ extern const char _libc_intl_domainname[];
#define weak_alias(original, alias) \
.weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
/* Declare SYMBOL to be weak. */
#define weak_symbol(symbol) .weakext C_SYMBOL_NAME (symbol)
/* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */
#define weak_extern(symbol) \
.weakext C_SYMBOL_NAME (symbol)
#else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
@ -154,49 +155,65 @@ extern const char _libc_intl_domainname[];
.weak C_SYMBOL_NAME (alias); \
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 */
#else /* ! ASSEMBLER */
#ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
#define weak_symbol(symbol) asm (".weakext " __SYMBOL_PREFIX #symbol);
#define weak_alias(original, alias) \
#define weak_extern_asm(symbol) asm (".weakext " __SYMBOL_PREFIX #symbol);
#define weak_alias_asm(original, alias) \
asm (".weakext " __SYMBOL_PREFIX #alias ", " __SYMBOL_PREFIX #original);
#else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
#define weak_symbol(symbol) asm (".weak " __SYMBOL_PREFIX #symbol);
#define weak_alias(original, alias) \
#define weak_extern_asm(symbol) asm (".weak " __SYMBOL_PREFIX #symbol);
#define weak_alias_asm(original, alias) \
asm (".weak " __SYMBOL_PREFIX #alias "\n" \
__SYMBOL_PREFIX #alias " = " __SYMBOL_PREFIX #original);
#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 */
#else
#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
#if (!defined (ASSEMBLER) && \
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)))
/* GCC 2.8 and later has special syntax for weak symbols and aliases.
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)))
/* GCC 2.7 and later has special syntax for weak symbols and aliases.
Using that is better when possible, because the compiler and assembler
are better clued in to what we are doing. */
#undef strong_alias
#define strong_alias(name, aliasname) \
__typeof (name) aliasname __attribute__ ((alias (#name)));
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
#ifdef HAVE_WEAK_SYMBOLS
#undef weak_symbol
#define weak_symbol(name) \
extern __typeof (name) name __attribute__ ((weak));
#undef weak_alias
#define weak_alias(name, aliasname) \
__typeof (name) aliasname __attribute__ ((weak, alias (#name)));
#endif /* HAVE_WEAK_SYMBOLS. */
#endif /* Not ASSEMBLER, and GCC 2.8 or later. */
extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
/* 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
@ -260,8 +277,7 @@ extern const char _libc_intl_domainname[];
#define symbol_set_declare(set) \
extern void *const __start_##set __attribute__ ((__weak__)); \
extern void *const __stop_##set __attribute__ ((__weak__)); \
/* Gratuitously repeat weak decl, in case using broken GCC (<2.8). */\
weak_symbol (__start_##set) weak_symbol (__stop_##set)
weak_extern (__start_##set) weak_extern (__stop_##set)
/* Return a pointer (void *const *) to the first element of SET. */
#define symbol_set_first_element(set) (&__start_##set)

View File

@ -338,6 +338,9 @@ noconv:
/* External user entry point. */
INT
#ifdef weak_function
weak_function
#endif
strtol (nptr, endptr, base)
const STRING_TYPE *nptr;
STRING_TYPE **endptr;
@ -345,10 +348,3 @@ strtol (nptr, endptr, base)
{
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

View File

@ -161,7 +161,14 @@ elf_machine_rela (struct link_map *map,
{
Elf64_Addr *const reloc_addr = (void *)(map->l_addr + reloc->r_offset);
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
jump table until we've self-relocated. */
@ -169,38 +176,37 @@ elf_machine_rela (struct link_map *map,
if (r_info == R_ALPHA_RELATIVE)
{
/* 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;
}
else if (r_info == R_ALPHA_NONE)
;
return;
else
{
Elf64_Addr loadbase, sym_value;
if (resolve)
{
loadbase = (*resolve)(&sym, (Elf64_Addr)reloc_addr,
r_info == R_ALPHA_JMP_SLOT);
}
else
loadbase = map->l_addr;
#ifndef RTLD_BOOTSTRAP
loadbase = (*resolve)(&sym, (Elf64_Addr)reloc_addr,
r_info == R_ALPHA_JMP_SLOT);
#else
loadbase = map->l_addr;
#endif
sym_value = sym ? loadbase + sym->st_value : 0;
if (r_info == R_ALPHA_GLOB_DAT)
{
*reloc_addr = sym_value;
}
*reloc_addr = sym_value;
else if (r_info == R_ALPHA_JMP_SLOT)
{
*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)
{
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.
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;
}
else
#endif
sym_value += reloc->r_addend;
*reloc_addr = sym_value;
}

View File

@ -271,7 +271,7 @@ _dl_sysdep_message (const char *msg, ...)
dynamic linker re-relocates itself to be user-visible (for -ldl),
it will get the user's definition (i.e. usually libc's). */
int
int weak_function
__open (const char *file_name, int mode, ...)
{
enum retry_type doretry;
@ -496,7 +496,7 @@ __open (const char *file_name, int mode, ...)
}
}
int
int weak_function
__close (int fd)
{
if (fd != (int) MACH_PORT_NULL)
@ -504,7 +504,7 @@ __close (int fd)
return 0;
}
caddr_t
caddr_t weak_function
__mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
{
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;
}
void
void weak_function
_exit (int status)
{
__proc_mark_exit (_dl_hurd_data->portarray[INIT_PORT_PROC],
@ -554,11 +554,6 @@ _exit (int status)
while (__task_terminate (__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
@ -566,7 +561,7 @@ weak_symbol (__mmap)
weak, the real defn in libc.so will override it if we are linked into
the user program (-ldl). */
error_t
error_t weak_function
_hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
mach_msg_option_t option,
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,
timeout, notify);
}
weak_symbol (_hurd_intr_rpc_mach_msg)