diff --git a/libc/arch-arm/include/machine/asm.h b/libc/arch-arm/include/machine/asm.h index 7b8f05330..047e54d17 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 7a23060a9..49d3ea8d1 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 1e5747010..0887fa57b 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)