summary refs log tree commit diff
path: root/libc-symbols.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc-symbols.h')
-rw-r--r--libc-symbols.h52
1 files changed, 32 insertions, 20 deletions
diff --git a/libc-symbols.h b/libc-symbols.h
index bb5f54e16c..f7231f9c7c 100644
--- a/libc-symbols.h
+++ b/libc-symbols.h
@@ -27,14 +27,13 @@ Cambridge, MA 02139, USA.  */
    We include config.h which is generated by configure.
    It should define for us the following symbols:
 
+   * HAVE_ASM_SET_DIRECTIVE if we have `.set B, A' instead of `A = B'.
+   * ASM_GLOBAL_DIRECTIVE with `.globl' or `.global'.
    * HAVE_GNU_LD if using GNU ld, with support for weak symbols in a.out,
    and for symbol set and warning messages extensions in a.out and ELF.
-   This implies HAVE_WEAK_SYMBOLS; set by --with-gnu-ld.
-   * HAVE_ELF if using ELF, which supports weak symbols.
-   This implies HAVE_WEAK_SYMBOLS; set by --with-elf.
-
-   * HAVE_WEAK_SYMBOLS if weak symbols are available in the assembler and
-   linker being used.  Set by --with-weak-symbols.
+   * HAVE_ELF if using ELF, which supports weak symbols using `.weak'.
+   * HAVE_ASM_WEAK_DIRECTIVE if we have weak symbols using `.weak'.
+   * HAVE_ASM_WEAKEXT_DIRECTIVE if we have weak symbols using `.weakext'.
 
    */
 
@@ -79,23 +78,14 @@ extern const char _libc_intl_domainname[];
 /*
 
 */
-/* The symbols in all the user (non-_) macros are C symbols.  Predefined
-   should be HAVE_WEAK_SYMBOLS and/or HAVE_ELF and/or HAVE_GNU_LD.
-   HAVE_WEAK_SYMBOLS is implied by the other two.  HAVE_GNU_LD without
-   HAVE_ELF implies a.out.  */
+/* The symbols in all the user (non-_) macros are C symbols.
+   HAVE_GNU_LD without HAVE_ELF implies a.out.  */
 
-#ifndef HAVE_WEAK_SYMBOLS
-#if defined (HAVE_ELF) || defined (HAVE_GNU_LD)
+#if defined (HAVE_ASM_WEAK_DIRECTIVE) || defined (HAVE_ASM_WEAKEXT_DIRECTIVE)
 #define HAVE_WEAK_SYMBOLS
 #endif
-#endif
 
 #ifndef __SYMBOL_PREFIX
-#ifdef HAVE_ELF
-#define NO_UNDERSCORES
-#else
-#include <sysdep.h>		/* Should define NO_UNDERSCORES.  */
-#endif
 #ifdef NO_UNDERSCORES
 #define __SYMBOL_PREFIX
 #else
@@ -143,8 +133,21 @@ extern const char _libc_intl_domainname[];
 
 
 #ifdef HAVE_WEAK_SYMBOLS
+
 #ifdef ASSEMBLER
 
+#ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
+
+/* Define ALIAS as a weak alias for ORIGINAL.
+   If weak aliases are not available, this defines a strong alias.  */
+#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)
+
+#else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
+
 /* Define ALIAS as a weak alias for ORIGINAL.
    If weak aliases are not available, this defines a strong alias.  */
 #define weak_alias(original, alias)	\
@@ -154,12 +157,21 @@ extern const char _libc_intl_domainname[];
 /* Declare SYMBOL to be weak.  */
 #define weak_symbol(symbol)	.weak C_SYMBOL_NAME (symbol)
 
-#else
+#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) \
+  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) \
   asm (".weak " __SYMBOL_PREFIX #alias "\n" \
        __SYMBOL_PREFIX #alias " = " __SYMBOL_PREFIX #original);
-#endif
+#endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
+#endif /* ! ASSEMBLER */
 #else
 #define	weak_alias(original, alias) strong_alias(original, alias)
 #define weak_symbol(symbol)	/* Do nothing.  */