Browse Source

libc-symbols: improve comments and make macros a bit more readable.
no code changes

Denis Vlasenko 15 years ago
parent
commit
1e950c61e5
1 changed files with 157 additions and 134 deletions
  1. 157 134
      include/libc-symbols.h

+ 157 - 134
include/libc-symbols.h

@@ -200,34 +200,34 @@
 
 
 # ifdef HAVE_ASM_SET_DIRECTIVE
 # ifdef HAVE_ASM_SET_DIRECTIVE
 #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
 #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
-#   define strong_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original) ASM_LINE_SEP	\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP		\
-  .set C_SYMBOL_DOT_NAME (alias),C_SYMBOL_DOT_NAME (original)
-#   define strong_data_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
+#   define strong_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias)		ASM_LINE_SEP \
+	.set	C_SYMBOL_NAME(alias),C_SYMBOL_NAME(original)	ASM_LINE_SEP \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME(alias)		ASM_LINE_SEP \
+	.set	C_SYMBOL_DOT_NAME(alias),C_SYMBOL_DOT_NAME(original)
+#   define strong_data_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias)		ASM_LINE_SEP \
+	.set	C_SYMBOL_NAME(alias),C_SYMBOL_NAME(original)
 #  else
 #  else
-#   define strong_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
+#   define strong_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias)		ASM_LINE_SEP \
+	.set	C_SYMBOL_NAME(alias),C_SYMBOL_NAME(original)
 #   define strong_data_alias(original, alias) strong_alias(original, alias)
 #   define strong_data_alias(original, alias) strong_alias(original, alias)
 #  endif
 #  endif
 # else
 # else
 #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
 #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
-#   define strong_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP		\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP		\
-  C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
-#   define strong_data_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+#   define strong_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias)		ASM_LINE_SEP \
+	C_SYMBOL_NAME(alias) = C_SYMBOL_NAME(original)		ASM_LINE_SEP \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME(alias)		ASM_LINE_SEP \
+	C_SYMBOL_DOT_NAME(alias) = C_SYMBOL_DOT_NAME(original)
+#   define strong_data_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias)		ASM_LINE_SEP \
+	C_SYMBOL_NAME(alias) = C_SYMBOL_NAME(original)
 #  else
 #  else
-#   define strong_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+#   define strong_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias)		ASM_LINE_SEP \
+	C_SYMBOL_NAME(alias) = C_SYMBOL_NAME(original)
 #   define strong_data_alias(original, alias) strong_alias(original, alias)
 #   define strong_data_alias(original, alias) strong_alias(original, alias)
 #  endif
 #  endif
 # endif
 # endif
@@ -235,45 +235,45 @@
 # ifdef HAVE_WEAK_SYMBOLS
 # ifdef HAVE_WEAK_SYMBOLS
 #  ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
 #  ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
 #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
 #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
-#    define weak_alias(original, alias)					\
-  .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original) ASM_LINE_SEP \
-  .weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
+#    define weak_alias(original, alias) \
+	.weakext C_SYMBOL_NAME(alias),C_SYMBOL_NAME(original)	ASM_LINE_SEP \
+	.weakext C_SYMBOL_DOT_NAME(alias),C_SYMBOL_DOT_NAME(original)
 #   else
 #   else
-#    define weak_alias(original, alias)					\
-  .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
+#    define weak_alias(original, alias) \
+	.weakext C_SYMBOL_NAME(alias),C_SYMBOL_NAME(original)
 #   endif
 #   endif
-#   define weak_extern(symbol)						\
-  .weakext C_SYMBOL_NAME (symbol)
+#   define weak_extern(symbol) \
+	.weakext C_SYMBOL_NAME(symbol)
 
 
 #  else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
 #  else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
 
 
 #   ifdef HAVE_ASM_SET_DIRECTIVE
 #   ifdef HAVE_ASM_SET_DIRECTIVE
 #    ifdef HAVE_ASM_GLOBAL_DOT_NAME
 #    ifdef HAVE_ASM_GLOBAL_DOT_NAME
-#     define weak_alias(original, alias)				\
-  .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-  .set C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original) ASM_LINE_SEP	\
-  .weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP				\
-  .set C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
+#     define weak_alias(original, alias) \
+	.weak	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	.set	C_SYMBOL_NAME(alias),C_SYMBOL_NAME(original)	ASM_LINE_SEP \
+	.weak	C_SYMBOL_DOT_NAME(alias)			ASM_LINE_SEP \
+	.set	C_SYMBOL_DOT_NAME(alias),C_SYMBOL_DOT_NAME(original)
 #    else
 #    else
-#     define weak_alias(original, alias)				\
-  .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-  .set C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
+#     define weak_alias(original, alias) \
+	.weak	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	.set	C_SYMBOL_NAME(alias),C_SYMBOL_NAME(original)
 #    endif
 #    endif
 #   else /* ! HAVE_ASM_SET_DIRECTIVE */
 #   else /* ! HAVE_ASM_SET_DIRECTIVE */
 #    ifdef HAVE_ASM_GLOBAL_DOT_NAME
 #    ifdef HAVE_ASM_GLOBAL_DOT_NAME
-#     define weak_alias(original, alias)				\
-  .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP		\
-  .weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP				\
-  C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
+#     define weak_alias(original, alias) \
+	.weak	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	C_SYMBOL_NAME(alias) = C_SYMBOL_NAME(original)		ASM_LINE_SEP \
+	.weak	C_SYMBOL_DOT_NAME(alias)			ASM_LINE_SEP \
+	C_SYMBOL_DOT_NAME(alias) = C_SYMBOL_DOT_NAME(original)
 #    else
 #    else
-#     define weak_alias(original, alias)				\
-  .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+#     define weak_alias(original, alias) \
+	.weak	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	C_SYMBOL_NAME(alias) = C_SYMBOL_NAME(original)
 #    endif
 #    endif
 #   endif
 #   endif
-#   define weak_extern(symbol)						\
-  .weak C_SYMBOL_NAME (symbol)
+#   define weak_extern(symbol) \
+	.weak	C_SYMBOL_NAME(symbol)
 
 
 #  endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
 #  endif /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
 
 
@@ -285,6 +285,7 @@
 
 
 #endif /* __ASSEMBLER__ */
 #endif /* __ASSEMBLER__ */
 
 
+
 /* On some platforms we can make internal function calls (i.e., calls of
 /* On some platforms we can make internal function calls (i.e., calls of
    functions not exported) a bit faster by using a different calling
    functions not exported) a bit faster by using a different calling
    convention.  */
    convention.  */
@@ -292,10 +293,12 @@
 # define internal_function	/* empty */
 # define internal_function	/* empty */
 #endif
 #endif
 
 
+
 /* We want the .gnu.warning.SYMBOL section to be unallocated.  */
 /* We want the .gnu.warning.SYMBOL section to be unallocated.  */
 #define __make_section_unallocated(section_string)	\
 #define __make_section_unallocated(section_string)	\
   __asm__ (".section " section_string "\n\t.previous");
   __asm__ (".section " section_string "\n\t.previous");
 
 
+
 /* Tacking on "\n#APP\n\t#" to the section name makes gcc put it's bogus
 /* Tacking on "\n#APP\n\t#" to the section name makes gcc put it's bogus
    section attributes on what looks like a comment to the assembler.  */
    section attributes on what looks like a comment to the assembler.  */
 #ifdef __sparc__ /* HAVE_SECTION_QUOTES */
 #ifdef __sparc__ /* HAVE_SECTION_QUOTES */
@@ -304,6 +307,7 @@
 # define __sec_comment "\n#APP\n\t#"
 # define __sec_comment "\n#APP\n\t#"
 #endif
 #endif
 
 
+
 /* When a reference to SYMBOL is encountered, the linker will emit a
 /* When a reference to SYMBOL is encountered, the linker will emit a
    warning message MSG.  */
    warning message MSG.  */
 #define link_warning(symbol, msg) \
 #define link_warning(symbol, msg) \
@@ -317,8 +321,7 @@
 #ifdef SHARED
 #ifdef SHARED
 # define INTUSE(name) name##_internal
 # define INTUSE(name) name##_internal
 # define INTDEF(name) strong_alias (name, name##_internal)
 # define INTDEF(name) strong_alias (name, name##_internal)
-# define INTVARDEF(name) \
-  _INTVARDEF (name, name##_internal)
+# define INTVARDEF(name) _INTVARDEF (name, name##_internal)
 # if defined HAVE_VISIBILITY_ATTRIBUTE
 # if defined HAVE_VISIBILITY_ATTRIBUTE
 #  define _INTVARDEF(name, aliasname) \
 #  define _INTVARDEF(name, aliasname) \
   extern __typeof (name) aliasname __attribute__ ((alias (#name), \
   extern __typeof (name) aliasname __attribute__ ((alias (#name), \
@@ -337,65 +340,61 @@
 # define INTVARDEF2(name, newname)
 # define INTVARDEF2(name, newname)
 #endif
 #endif
 
 
+
 /* The following macros are used for PLT bypassing within libc.so
 /* The following macros are used for PLT bypassing within libc.so
    (and if needed other libraries similarly).
    (and if needed other libraries similarly).
-   First of all, you need to have the function prototyped somewhere,
-   say in foo/foo.h:
-
-   int foo (int __bar);
 
 
    If calls to foo within libc.so should always go to foo defined in libc.so,
    If calls to foo within libc.so should always go to foo defined in libc.so,
    then in include/foo.h you add:
    then in include/foo.h you add:
 
 
-   libc_hidden_proto (foo)
+   int foo(int __bar);
+   libc_hidden_proto(foo)
 
 
    line and after the foo function definition:
    line and after the foo function definition:
 
 
-   int foo (int __bar)
-   {
+   int foo(int __bar) {
      return __bar;
      return __bar;
    }
    }
-   libc_hidden_def (foo)
+   libc_hidden_def(foo)
 
 
    or
    or
 
 
-   int foo (int __bar)
-   {
+   int foo(int __bar) {
      return __bar;
      return __bar;
    }
    }
-   libc_hidden_weak (foo)
+   libc_hidden_weak(foo)
 
 
-   Similarly for global data.  If references to foo within libc.so should
-   always go to foo defined in libc.so, then in include/foo.h you add:
+   Similarly for global data: if references to foo within libc.so
+   should always go to foo defined in libc.so, then in include/foo.h:
 
 
-   libc_hidden_proto (foo)
+   extern int foo;
+   libc_hidden_proto(foo)
 
 
-   line and after foo's definition:
+   and after foo's definition:
 
 
    int foo = INITIAL_FOO_VALUE;
    int foo = INITIAL_FOO_VALUE;
-   libc_hidden_data_def (foo)
+   libc_hidden_data_def(foo)
 
 
    or
    or
 
 
    int foo = INITIAL_FOO_VALUE;
    int foo = INITIAL_FOO_VALUE;
-   libc_hidden_data_weak (foo)
+   libc_hidden_data_weak(foo)
 
 
    If foo is normally just an alias (strong or weak) to some other function,
    If foo is normally just an alias (strong or weak) to some other function,
    you should use the normal strong_alias first, then add libc_hidden_def
    you should use the normal strong_alias first, then add libc_hidden_def
    or libc_hidden_weak:
    or libc_hidden_weak:
 
 
-   int baz (int __bar)
-   {
+   int baz(int __bar) {
      return __bar;
      return __bar;
    }
    }
-   strong_alias (baz, foo)
-   libc_hidden_weak (foo)
+   strong_alias(baz, foo)
+   libc_hidden_weak(foo)
 
 
    If the function should be internal to multiple objects, say ld.so and
    If the function should be internal to multiple objects, say ld.so and
    libc.so, the best way is to use:
    libc.so, the best way is to use:
 
 
    #if !defined NOT_IN_libc || defined IS_IN_rtld
    #if !defined NOT_IN_libc || defined IS_IN_rtld
-   hidden_proto (foo)
+   hidden_proto(foo)
    #endif
    #endif
 
 
    in include/foo.h and the normal macros at all function definitions
    in include/foo.h and the normal macros at all function definitions
@@ -404,29 +403,47 @@
    If versioned_symbol macro is used to define foo,
    If versioned_symbol macro is used to define foo,
    libc_hidden_ver macro should be used, as in:
    libc_hidden_ver macro should be used, as in:
 
 
-   int __real_foo (int __bar)
-   {
+   int __real_foo(int __bar) {
      return __bar;
      return __bar;
    }
    }
-   versioned_symbol (libc, __real_foo, foo, GLIBC_2_1);
-   libc_hidden_ver (__real_foo, foo)  */
+   versioned_symbol(libc, __real_foo, foo, GLIBC_2_1);
+   libc_hidden_ver(__real_foo, foo)
+ */
 
 
 /* uClibc specific (the above comment was copied from glibc):
 /* uClibc specific (the above comment was copied from glibc):
- * a. when ppc64 will be supported, we need changes to support:
+ *
+ * when ppc64 will be supported, we need changes to support
  * strong_data_alias (used by asm hidden_data_def)
  * strong_data_alias (used by asm hidden_data_def)
- * b. libc_hidden_proto(foo) should be added after the header having foo's prototype
- * or after extern foo... to all source files that should use the internal version
- * of foo within libc, even to the file defining foo itself, libc_hidden_def does
- * not hide __GI_foo itself, although the name suggests it (hiding is done exclusively
- * by libc_hidden_proto). The reasoning to have it after the header w/ foo's prototype is
- * to get first the __REDIRECT from original header and then create the __GI_foo alias
- * c. no versioning support, hidden[_data]_ver are noop
- * d. hidden_def() in asm is _hidden_strong_alias (not strong_alias) */
-
-/* Arrange to hide uClibc internals */
-#if (defined __GNUC__ && \
-  (defined __GNUC_MINOR__ && ( __GNUC__ >= 3 && __GNUC_MINOR__ >= 3 ) \
-   || __GNUC__ >= 4)) || defined __ICC
+ *
+ * no versioning support, hidden[_data]_ver are noop
+ *
+ * hidden_def() in asm is _hidden_strong_alias (not strong_alias)
+ *
+ * libc_hidden_proto(foo) should be added after declaration
+ * in the header, or after extern foo... in all source files
+ * (this is discouraged).
+ * libc_hidden_def does not hide __GI_foo itself, although the name
+ * suggests it (hiding is done exclusively by libc_hidden_proto).
+
+FIXME! - ?
+ * The reasoning to have it after the header w/ foo's prototype is
+ * to get first the __REDIRECT from original header and then create
+ * the __GI_foo alias
+
+ * Hunt for references which still go through PLT (example for x86):
+ * build shared lib, then disassemble it and search for <xxx@plt>:
+ * $ objdump -drx libuClibc-*.so >disasm.txt
+ * $ grep -F '@plt>:' disasm.txt
+ *
+ * In uclibc, malloc/free and related functions should be called
+ * through PLT (making it possible to use alternative malloc),
+ * and possibly some __pthread_xxx functions can be called through PLT
+ * (why?). The rest should not use PLT.
+ */
+
+#if (defined __GNUC__ && defined __GNUC_MINOR__ \
+	&& (( __GNUC__ >= 3 && __GNUC_MINOR__ >= 3) || __GNUC__ >= 4) \
+    ) || defined __ICC
 # define attribute_hidden __attribute__ ((visibility ("hidden")))
 # define attribute_hidden __attribute__ ((visibility ("hidden")))
 # define __hidden_proto_hiddenattr(attrs...) __attribute__ ((visibility ("hidden"), ##attrs))
 # define __hidden_proto_hiddenattr(attrs...) __attribute__ ((visibility ("hidden"), ##attrs))
 #else
 #else
@@ -435,67 +452,69 @@
 #endif
 #endif
 
 
 #if /*!defined STATIC &&*/ !defined __BCC__
 #if /*!defined STATIC &&*/ !defined __BCC__
+
 # ifndef __ASSEMBLER__
 # ifndef __ASSEMBLER__
 #  define hidden_proto(name, attrs...) __hidden_proto (name, __GI_##name, ##attrs)
 #  define hidden_proto(name, attrs...) __hidden_proto (name, __GI_##name, ##attrs)
 #  define __hidden_proto(name, internal, attrs...) \
 #  define __hidden_proto(name, internal, attrs...) \
-   extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
-   __hidden_proto_hiddenattr (attrs);
+	extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
+	__hidden_proto_hiddenattr (attrs);
 #  define __hidden_asmname(name) __hidden_asmname1 (__USER_LABEL_PREFIX__, name)
 #  define __hidden_asmname(name) __hidden_asmname1 (__USER_LABEL_PREFIX__, name)
 #  define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
 #  define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
 #  define __hidden_asmname2(prefix, name) #prefix name
 #  define __hidden_asmname2(prefix, name) #prefix name
 #  define __hidden_ver1(local, internal, name) \
 #  define __hidden_ver1(local, internal, name) \
-   extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
-   extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#local))))
+	extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
+	extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#local))))
 #  define hidden_ver(local, name)	__hidden_ver1(local, __GI_##name, name);
 #  define hidden_ver(local, name)	__hidden_ver1(local, __GI_##name, name);
 #  define hidden_data_ver(local, name)	hidden_ver(local, name)
 #  define hidden_data_ver(local, name)	hidden_ver(local, name)
 #  define hidden_def(name)		__hidden_ver1(__GI_##name, name, name);
 #  define hidden_def(name)		__hidden_ver1(__GI_##name, name, name);
 #  define hidden_data_def(name)		hidden_def(name)
 #  define hidden_data_def(name)		hidden_def(name)
-#  define hidden_weak(name)	\
+#  define hidden_weak(name) \
 	__hidden_ver1(__GI_##name, name, name) __attribute__((weak));
 	__hidden_ver1(__GI_##name, name, name) __attribute__((weak));
 #  define hidden_data_weak(name)	hidden_weak(name)
 #  define hidden_data_weak(name)	hidden_weak(name)
 
 
 # else /* __ASSEMBLER__ */
 # else /* __ASSEMBLER__ */
-# ifdef HAVE_ASM_SET_DIRECTIVE
-#  ifdef HAVE_ASM_GLOBAL_DOT_NAME
-#   define _hidden_strong_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  .hidden C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-  .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original) ASM_LINE_SEP	\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP		\
-  .hidden C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP			\
-  .set C_SYMBOL_DOT_NAME (alias),C_SYMBOL_DOT_NAME (original)
-#  else
-#   define _hidden_strong_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  .hidden C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-  .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
-#  endif
-# else
-#  ifdef HAVE_ASM_GLOBAL_DOT_NAME
-#   define _hidden_strong_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  .hidden C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP		\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP		\
-  .hidden C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP			\
-  C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
-#  else
-#   define _hidden_strong_alias(original, alias)				\
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
-  .hidden C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+
+#  ifdef HAVE_ASM_SET_DIRECTIVE
+#   ifdef HAVE_ASM_GLOBAL_DOT_NAME
+#    define _hidden_strong_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias) 		ASM_LINE_SEP \
+	.hidden	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	.set	C_SYMBOL_NAME(alias),C_SYMBOL_NAME(original)	ASM_LINE_SEP \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME(alias)		ASM_LINE_SEP \
+	.hidden	C_SYMBOL_DOT_NAME(alias)			ASM_LINE_SEP \
+	.set	C_SYMBOL_DOT_NAME(alias),C_SYMBOL_DOT_NAME(original)
+#   else
+#    define _hidden_strong_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias)		ASM_LINE_SEP \
+	.hidden	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	.set	C_SYMBOL_NAME(alias),C_SYMBOL_NAME(original)
+#   endif
+#  else /* dont have .set directive */
+#   ifdef HAVE_ASM_GLOBAL_DOT_NAME
+#    define _hidden_strong_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias)		ASM_LINE_SEP \
+	.hidden	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	C_SYMBOL_NAME(alias) = C_SYMBOL_NAME(original)		ASM_LINE_SEP \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME(alias)		ASM_LINE_SEP \
+	.hidden	C_SYMBOL_DOT_NAME(alias)			ASM_LINE_SEP \
+	C_SYMBOL_DOT_NAME(alias) = C_SYMBOL_DOT_NAME(original)
+#   else
+#    define _hidden_strong_alias(original, alias) \
+	ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(alias)		ASM_LINE_SEP \
+	.hidden	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	C_SYMBOL_NAME(alias) = C_SYMBOL_NAME(original)
+#   endif
 #  endif
 #  endif
-# endif
 
 
 #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
 #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
-#   define _hidden_weak_alias(original, alias)				\
-     .hidden C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-     .hidden C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP			\
-     weak_alias(original, alias)
+#   define _hidden_weak_alias(original, alias) \
+	.hidden	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	.hidden	C_SYMBOL_DOT_NAME(alias)			ASM_LINE_SEP \
+	weak_alias(original, alias)
 #  else
 #  else
-#   define _hidden_weak_alias(original, alias)				\
-     .hidden C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
-     weak_alias(original, alias)
+#   define _hidden_weak_alias(original, alias) \
+	.hidden	C_SYMBOL_NAME(alias)				ASM_LINE_SEP \
+	weak_alias(original, alias)
 #  endif
 #  endif
 
 
 /* For assembly, we need to do the opposite of what we do in C:
 /* For assembly, we need to do the opposite of what we do in C:
@@ -519,19 +538,23 @@
 #   define HIDDEN_JUMPTARGET(name) __GI_##name
 #   define HIDDEN_JUMPTARGET(name) __GI_##name
 #  endif
 #  endif
 # endif /* __ASSEMBLER__ */
 # endif /* __ASSEMBLER__ */
-#else /* SHARED */
+
+#else /* not SHARED */
+
 # ifndef __ASSEMBLER__
 # ifndef __ASSEMBLER__
 #  define hidden_proto(name, attrs...)
 #  define hidden_proto(name, attrs...)
 # else
 # else
 #  define HIDDEN_JUMPTARGET(name) name
 #  define HIDDEN_JUMPTARGET(name) name
-# endif /* Not  __ASSEMBLER__ */
+# endif /* not __ASSEMBLER__ */
 # define hidden_weak(name)
 # define hidden_weak(name)
 # define hidden_def(name)
 # define hidden_def(name)
 # define hidden_ver(local, name)
 # define hidden_ver(local, name)
 # define hidden_data_weak(name)
 # define hidden_data_weak(name)
 # define hidden_data_def(name)
 # define hidden_data_def(name)
 # define hidden_data_ver(local, name)
 # define hidden_data_ver(local, name)
-#endif /* SHARED */
+
+#endif /* SHARED / not SHARED */
+
 
 
 /* uClibc does not support versioning yet. */
 /* uClibc does not support versioning yet. */
 #define versioned_symbol(lib, local, symbol, version) /* weak_alias(local, symbol) */
 #define versioned_symbol(lib, local, symbol, version) /* weak_alias(local, symbol) */