summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@android.com>2012-01-23 15:15:30 +0100
committerDavid 'Digit' Turner <digit@android.com>2012-01-31 22:19:09 +0100
commit5fbf2e09921723cfdea75e83c1fac2080f0ad564 (patch)
treee14922f0147869514be03fc3154c4576c68ef154
parent5b892aa7e581c0b247262a95d70db20991121afe (diff)
downloadbionic-5fbf2e09921723cfdea75e83c1fac2080f0ad564.zip
bionic-5fbf2e09921723cfdea75e83c1fac2080f0ad564.tar.gz
bionic-5fbf2e09921723cfdea75e83c1fac2080f0ad564.tar.bz2
libc: Define new symbol visibility macros
This patch defines a few new macros that can be used to control the visibility of symbols exported by the C library: - ENTRY_PRIVATE() can be used in assembly sources to indicate that an assembler function should have "hidden" visibility, i.e. will never be exported by the C library's shared library. This is the equivalent of using __LIBC_HIDDEN__ for a C function, but ENTRY_PRIVATE() works like ENTRY(), and must be used with END() to tag the end of the function. - __LIBC_ABI_PUBLIC__ can be used to tag a C functions as being part of the C library's public ABI. This is important for a few functions that must be exposed by the NDK to maintain binary compatibility. Once a symbol has been tagged with this macro, it shall *never* be removed from the library, even if it becomes directly unused due to implementation changes (e.g. __is_threaded). - __LIBC_ABI_PRIVATE__ can be used for C functions that should always be exported by the C library because they are used by other libraries in the platform, but should not be exposed by the NDK. It is possible to remove such symbols from the implementation if all callers are also modified. + Add missing END() assembly macro for x86 Change-Id: Ia96236ea0dbec41d57bea634b39d246b30e5e234
-rw-r--r--libc/arch-arm/include/machine/asm.h6
-rw-r--r--libc/arch-x86/include/machine/asm.h10
-rw-r--r--libc/include/sys/cdefs_elf.h15
3 files changed, 31 insertions, 0 deletions
diff --git a/libc/arch-arm/include/machine/asm.h b/libc/arch-arm/include/machine/asm.h
index 7b8f053..047e54d 100644
--- a/libc/arch-arm/include/machine/asm.h
+++ b/libc/arch-arm/include/machine/asm.h
@@ -97,6 +97,12 @@
#define ASENTRY_NP(y) _ENTRY(_ASM_LABEL(y))
#define ASEND(y) _END(_ASM_LABEL(y))
+#ifdef __ELF__
+#define ENTRY_PRIVATE(y) ENTRY(y); .hidden _C_LABEL(y)
+#else
+#define ENTRY_PRIVATE(y) ENTRY(y)
+#endif
+
#define ASMSTR .asciz
#if defined(__ELF__) && defined(PIC)
diff --git a/libc/arch-x86/include/machine/asm.h b/libc/arch-x86/include/machine/asm.h
index 7a23060..49d3ea8 100644
--- a/libc/arch-x86/include/machine/asm.h
+++ b/libc/arch-x86/include/machine/asm.h
@@ -103,6 +103,12 @@
#define _ENTRY(x) \
.text; _ALIGN_TEXT; .globl x; .type x,@function; x:
+#define _ASM_SIZE(x) .size x, .-x;
+
+#define _END(x) \
+ .fnend; \
+ _ASM_SIZE(x)
+
#ifdef GPROF
# define _PROF_PROLOGUE \
pushl %ebp; movl %esp,%ebp; call PIC_PLT(mcount); popl %ebp
@@ -112,8 +118,12 @@
#define ENTRY(y) _ENTRY(_C_LABEL(y)); _PROF_PROLOGUE
#define NENTRY(y) _ENTRY(_C_LABEL(y))
+#define END(y) _END(_C_LABEL(y))
#define ASENTRY(y) _ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE
+#define ENTRY_PRIVATE(y) ENTRY(y); .hidden _C_LABEL(y)
+
+
#define ALTENTRY(name) .globl _C_LABEL(name); _C_LABEL(name):
#define ASMSTR .asciz
diff --git a/libc/include/sys/cdefs_elf.h b/libc/include/sys/cdefs_elf.h
index 1e57470..0887fa5 100644
--- a/libc/include/sys/cdefs_elf.h
+++ b/libc/include/sys/cdefs_elf.h
@@ -96,9 +96,24 @@
#endif
/* GCC visibility helper macro */
+/* This must be used to tag non-static functions that are private, i.e.
+ * never exposed by the shared library. */
#define __LIBC_HIDDEN__ \
__attribute__ ((visibility ("hidden")))
+/* This must be used to tag non-static functions that are public, i.e.
+ * exposed by the shared library, and part of the stable NDK ABI */
+#define __LIBC_ABI_PUBLIC__ \
+ __attribute__ ((visibility ("default")))
+
+/* This must be used to tag non-static functions that must be exported
+ * by the shared library, but whose implementation is private to the
+ * platform. For now this is equivalent to __LIBC_ABI_PUBLIC__, but we
+ * may want to change this later.
+ */
+#define __LIBC_ABI_PRIVATE__ \
+ __attribute__ ((visibility ("default")))
+
#define __IDSTRING(_n,_s) __SECTIONSTRING(.ident,_s)
#define __RCSID(_s) __IDSTRING(rcsid,_s)