diff options
-rw-r--r-- | include/libc-internal.h | 125 |
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; |