OSDN Git Service

Support strong_alias and begin merging usage of weak_function
authorEric Andersen <andersen@codepoet.org>
Mon, 18 Feb 2002 08:34:59 +0000 (08:34 -0000)
committerEric Andersen <andersen@codepoet.org>
Mon, 18 Feb 2002 08:34:59 +0000 (08:34 -0000)
include/features.h
libc/misc/internals/__uClibc_main.c

index 22795e0..562dca9 100644 (file)
 
 /* Some nice features only work properly with ELF */
 #if defined _LIBC && 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)));
+/* 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.  */
+# define weak_function __attribute__ ((weak))
+/* 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. */
 #  define link_warning(symbol, msg)                                          \
        asm (".section "  ".gnu.warning." #symbol  "\n\t.previous");          \
            static const char __evoke_link_warning_##symbol[]                 \
            __attribute__ ((section (".gnu.warning." #symbol "\n\t#"))) = msg;
-#  define _weak_alias(name, aliasname) \
-      extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
-/*
-#   define _weak_alias(name, aliasname)                                              \
-       asm(".global " C_SYMBOL_PREFIX #name ";"                              \
-           ".weak " C_SYMBOL_PREFIX #aliasname ";"                           \
-           C_SYMBOL_PREFIX #aliasname "="  C_SYMBOL_PREFIX #name ";");
-*/
-#   define weak_symbol(name)                                                 \
-       asm(".weak " C_SYMBOL_PREFIX #name ";");
 #else
-#  define weak_alias(name, aliasname) _weak_alias (name, aliasname)
+#  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 _" #aliasname "\n.set _" #aliasname ",_" #name);
 #  define link_warning(symbol, msg) \
        asm (".stabs \"" msg "\",30,0,0,0\n\t" \
              ".stabs \"" #symbol "\",1,0,0,0\n");
-#  define _weak_alias(name, aliasname) \
-       __asm__(".global _" #aliasname "\n.set _" #aliasname ",_" #name);
 #endif
 
 /* --- this is added to integrate linuxthreads */
index ad17d79..b6addb9 100644 (file)
  */
 
 extern int main(int argc, char **argv, char **envp);
-extern void __uClibc_empty_func(void);
 
 void __uClibc_main(int argc, char **argv, char **envp)
         __attribute__ ((__noreturn__));
 
+
+
 #ifdef HAVE_ELF
 weak_alias(__environ, environ);
-weak_symbol(__init_stdio);
-weak_symbol(__stdio_close_all);
-#endif 
-
+extern void weak_function __init_stdio(void);
+extern void weak_function __stdio_close_all(void);
+extern void weak_function __pthread_initialize_minimal (void);
+#else
 extern void __init_stdio(void);
 extern void __stdio_close_all(void);
+extern void __pthread_initialize_minimal (void);
+#endif 
 
 typedef void (*vfuncp) (void);
 vfuncp __uClibc_cleanup = __stdio_close_all;
@@ -47,6 +50,19 @@ void __uClibc_main(int argc, char **argv, char **envp)
         */
        __environ = envp;
 
+       /* Initialize the thread library at least a bit so at least
+        * errno will be properly setup */
+       if (__pthread_initialize_minimal)
+           __pthread_initialize_minimal ();
+
+#if 0
+       /* Some security at this point.  Prevent starting a SUID binary
+        * where the standard file descriptors are not opened.  We have
+        * to do this only for statically linked applications since
+        * otherwise the dynamic loader did the work already.  */
+       if (__builtin_expect (__libc_enable_secure, 0))
+           __libc_check_standard_fds ();
+#endif
        /*
         * Initialize stdio here.  In the static library case, this will
         * be bypassed if not needed because of the weak alias above.
@@ -85,11 +101,12 @@ char **__environ = 0;
  * NOTE!!! This is only true for the _static_ case!!!
  */
 
+weak_alias(__environ, environ);
+#if 0
 void __uClibc_empty_func(void)
 {
 }
-
-weak_alias(__environ, environ);
-/*weak_alias(__uClibc_empty_func, __init_stdio);*/
-/*weak_alias(__uClibc_empty_func, __stdio_close_all);*/
+weak_alias(__uClibc_empty_func, __init_stdio);
+weak_alias(__uClibc_empty_func, __stdio_close_all);
+#endif
 #endif