summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libc-internal.h125
1 files changed, 77 insertions, 48 deletions
diff --git a/include/libc-internal.h b/include/libc-internal.h
index 0204cc662..efab0c102 100644
--- a/include/libc-internal.h
+++ b/include/libc-internal.h
@@ -21,40 +21,72 @@
#include <features.h>
-/* Some nice features only work properly with ELF */
-#if defined __HAVE_ELF__
-/* Define ALIASNAME as a weak alias for NAME. */
-# define weak_alias(name, aliasname) _weak_alias (name, aliasname)
-# define _weak_alias(name, aliasname) \
- extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
+#ifndef __ASSEMBLER__
+/* GCC understands weak symbols and aliases; use its interface where
+ possible, instead of embedded assembly language. */
+
/* Define ALIASNAME as a strong alias for NAME. */
# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
# define _strong_alias(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+
/* This comes between the return type and function name in
- * a function definition to make that definition weak. */
+ a function definition to make that definition weak. */
# define weak_function __attribute__ ((weak))
# define weak_const_function __attribute__ ((weak, __const__))
+
+/* Define ALIASNAME as a weak alias for NAME.
+ If weak aliases are not available, this defines a strong alias. */
+# define weak_alias(name, aliasname) _weak_alias (name, aliasname)
+# define _weak_alias(name, aliasname) \
+ extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
+
+/* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */
+# define weak_extern(symbol) _weak_extern (weak symbol)
+# define _weak_extern(expr) _Pragma (#expr)
+
+#else /* __ASSEMBLER__ */
+
+# define C_SYMBOL_NAME(name) __C_SYMBOL_PREFIX__ ##name
+
+# define strong_alias(name, aliasname) \
+ .global C_SYMBOL_NAME (aliasname) ; \
+ .set C_SYMBOL_NAME(aliasname),C_SYMBOL_NAME(name)
+
+# define weak_alias(name, aliasname) \
+ .weak C_SYMBOL_NAME(aliasname) ; \
+ C_SYMBOL_NAME(aliasname) = C_SYMBOL_NAME(name)
+
+# define weak_extern(symbol) \
+ .weak C_SYMBOL_NAME(symbol)
+
+#endif /* __ASSEMBLER__ */
+
+/* When a reference to SYMBOL is encountered, the linker will emit a
+ warning message MSG. */
+#ifdef __HAVE_ELF__
+
+/* We want the .gnu.warning.SYMBOL section to be unallocated. */
+# define __make_section_unallocated(section_string) \
+ asm (".section " section_string "\n\t.previous");
+
/* Tacking on "\n\t#" to the section name makes gcc put it's bogus
- * section attributes on what looks like a comment to the assembler. */
-# if defined(__cris__)
-# define link_warning(symbol, msg)
+ section attributes on what looks like a comment to the assembler. */
+# define __sec_comment "\n\t#"
+# ifdef __cris__
+# define link_warning(symbol, msg)
# else
-# define link_warning(symbol, msg) \
- asm (".section " ".gnu.warning." #symbol "\n\t.previous"); \
- static const char __evoke_link_warning_##symbol[] \
- __attribute__ ((unused, section (".gnu.warning." #symbol "\n\t#"))) = msg;
+# define link_warning(symbol, msg) \
+ __make_section_unallocated (".gnu.warning." #symbol) \
+ static const char __evoke_link_warning_##symbol[] \
+ __attribute__ ((used, section (".gnu.warning." #symbol __sec_comment))) \
+ = msg;
# endif
-#else /* !defined __HAVE_ELF__ */
-# define strong_alias(name, aliasname) _strong_alias (name, aliasname)
-# define weak_alias(name, aliasname) _strong_alias (name, aliasname)
-# define _strong_alias(name, aliasname) \
- __asm__(".global " __C_SYMBOL_PREFIX__ #aliasname "\n" \
- ".set " __C_SYMBOL_PREFIX__ #aliasname "," __C_SYMBOL_PREFIX__ #name);
-# define link_warning(symbol, msg) \
- asm (".stabs \"" msg "\",30,0,0,0\n\t" \
- ".stabs \"" #symbol "\",1,0,0,0\n");
-#endif
+#else /* __HAVE_ELF__ */
+# define link_warning(symbol, msg) \
+ asm (".stabs \"" msg "\",30,0,0,0\n\t" \
+ ".stabs \"" __C_SYMBOL_PREFIX__ #symbol "\",1,0,0,0\n");
+#endif /* __HAVE_ELF__ */
#ifndef weak_function
/* If we do not have the __attribute__ ((weak)) syntax, there is no way we
@@ -105,14 +137,26 @@
# define attribute_hidden
#endif
#define hidden_def(name) extern __typeof (name) name attribute_hidden;
-/* Define ALIASNAME as a hidden weak alias for NAME. */
-# define hidden_weak_alias(name, aliasname) _hidden_weak_alias (name, aliasname)
-# define _hidden_weak_alias(name, aliasname) \
- extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))) __attribute__ ((visibility ("hidden")));
-/* Define ALIASNAME as a hidden strong alias for NAME. */
+
+#ifndef __ASSEMBLER__
# define hidden_strong_alias(name, aliasname) _hidden_strong_alias(name, aliasname)
# define _hidden_strong_alias(name, aliasname) \
- extern __typeof (name) aliasname __attribute__ ((alias (#name))) __attribute__ ((visibility ("hidden")));
+ extern __typeof (name) aliasname __attribute__ ((alias (#name))) attribute_hidden;
+
+# define hidden_weak_alias(name, aliasname) _hidden_weak_alias (name, aliasname)
+# define _hidden_weak_alias(name, aliasname) \
+ extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))) attribute_hidden;
+#else /* __ASSEMBLER__ */
+# define hidden_strong_alias(name, aliasname) \
+ .global C_SYMBOL_NAME (aliasname) ; \
+ .hidden C_SYMBOL_NAME (aliasname) ; \
+ .set C_SYMBOL_NAME(aliasname),C_SYMBOL_NAME(name)
+
+# define hidden_weak_alias(name, aliasname) \
+ .weak C_SYMBOL_NAME(aliasname) ; \
+ .hidden C_SYMBOL_NAME(aliasname) ; \
+ C_SYMBOL_NAME(aliasname) = C_SYMBOL_NAME(name)
+#endif /* __ASSEMBLER__ */
#ifdef __UCLIBC_BUILD_RELRO__
# define attribute_relro __attribute__ ((section (".data.rel.ro")))
@@ -204,6 +248,7 @@ extern ssize_t __read(int __fd, void *__buf, size_t __nbytes) attribute_hidden;
extern ssize_t __write(int __fd, __const void *__buf, size_t __n) attribute_hidden;
extern int __close(int __fd) attribute_hidden;
extern __pid_t __getpid (void) attribute_hidden;
+extern void _exit_internal (int __status) __attribute__ ((__noreturn__)) attribute_hidden;
#ifndef __USE_FILE_OFFSET64
extern int __lockf (int __fd, int __cmd, __off_t __len) attribute_hidden;
extern __off_t __lseek (int __fd, __off_t __offset, int __whence) __THROW attribute_hidden;
@@ -231,22 +276,21 @@ extern int __sprintf (char *__restrict __s,
__const char *__restrict __format, ...) attribute_hidden;
/* hack */
+#define abort __abort
#define fprintf __fprintf
#define fclose __fclose
#ifndef __USE_FILE_OFFSET64
#define fopen __fopen
-#define readdir __readdir
#else
#define fopen __fopen64
-#define readdir __readdir64
#endif
#ifdef __USE_LARGEFILE64
#define fopen64 __fopen64
-#define readdir64 __readdir64
#endif
/* #include <stdlib.h> */
extern char *__getenv (__const char *__name) attribute_hidden;
+extern void __exit (int __status) __THROW __attribute__ ((__noreturn__)) attribute_hidden;
/* #include <signal.h> */
extern int __sigprocmask (int __how, __const __sigset_t *__restrict __set,
@@ -325,21 +369,6 @@ typedef struct __dirstream DIR;
extern DIR *__opendir (__const char *__name) attribute_hidden;
extern int __closedir (DIR *__dirp) attribute_hidden;
-#ifndef __USE_FILE_OFFSET64
-extern struct dirent *__readdir (DIR *__dirp) __nonnull ((1)) attribute_hidden;
-#else
-# ifdef __REDIRECT
-extern struct dirent *__REDIRECT (__readdir, (DIR *__dirp), __readdir64)
- __nonnull ((1)) attribute_hidden;
-# else
-# define __readdir __readdir64
-# endif
-#endif
-
-#ifdef __USE_LARGEFILE64
-extern struct dirent64 *__readdir64 (DIR *__dirp) __nonnull ((1)) attribute_hidden;
-#endif
-
/* #include <stdio.h> */
extern int __vfprintf (FILE *__restrict __s, __const char *__restrict __format,
__gnuc_va_list __arg) attribute_hidden;