aboutsummaryrefslogtreecommitdiff
path: root/libc-symbols.h
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-07-08 06:18:25 +0000
committerRoland McGrath <roland@gnu.org>1996-07-08 06:18:25 +0000
commitaf5b3bc33bbaf9151c34a351bdb257b90d407d5b (patch)
tree7a9d35a2cea2549dad8c3c9276208962732e4954 /libc-symbols.h
parent0676b5fdca8d4f2a8dd442db4d50dc2c1ee8729f (diff)
downloadglibc-af5b3bc33bbaf9151c34a351bdb257b90d407d5b.zip
glibc-af5b3bc33bbaf9151c34a351bdb257b90d407d5b.tar.gz
glibc-af5b3bc33bbaf9151c34a351bdb257b90d407d5b.tar.bz2
Mon Jul 8 02:14:25 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>cvs/libc-960708
* 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.
Diffstat (limited to 'libc-symbols.h')
-rw-r--r--libc-symbols.h54
1 files changed, 35 insertions, 19 deletions
diff --git a/libc-symbols.h b/libc-symbols.h
index aaf9f2a..2f72d5f 100644
--- a/libc-symbols.h
+++ b/libc-symbols.h
@@ -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)));
+ 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.8 or later. */
+#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)