aboutsummaryrefslogtreecommitdiff
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. */