diff --git a/engine/platform/android/dlsym-weak.c b/engine/platform/android/dlsym-weak.cpp similarity index 93% rename from engine/platform/android/dlsym-weak.c rename to engine/platform/android/dlsym-weak.cpp index bb9de255..7263221a 100644 --- a/engine/platform/android/dlsym-weak.c +++ b/engine/platform/android/dlsym-weak.cpp @@ -35,8 +35,8 @@ static Elf_Sym *soinfo_elf_lookup( const soinfo *si, unsigned hash, const char *name ) { const Elf_Sym *symtab = si->symtab; - const char *strtab = si->strtab; - unsigned n; + const char *strtab = si->strtab; + unsigned n; if( si->nbucket == 0 ) return NULL; @@ -92,13 +92,13 @@ static Elf_Sym *dlsym_handle_lookup( const soinfo *si, const char *name ) return soinfo_elf_lookup( si, elfhash((const unsigned char *)name ), name ); } -void *dlsym_weak( void *handle, const char *symbol ) +extern "C" void *dlsym_weak( void *handle, const char *symbol ) { - soinfo *found = (soinfo *)handle; + soinfo *found = (soinfo *)handle; Elf_Sym *sym = dlsym_handle_lookup( found, symbol ); if( sym != NULL ) - return (void*)( sym->st_value + found->base/*load_bias*/ ); + return (void *)( sym->st_value + found->base /*load_bias*/ ); __android_log_print( ANDROID_LOG_ERROR, "dlsym-weak", "Failed when looking up %s\n", symbol ); return NULL; diff --git a/engine/platform/android/linker.h b/engine/platform/android/linker.h index 9b9c8b41..9b447050 100644 --- a/engine/platform/android/linker.h +++ b/engine/platform/android/linker.h @@ -28,7 +28,6 @@ #ifndef _LINKER_H_ #define _LINKER_H_ -#ifdef __ANDROID__ #include #include @@ -39,163 +38,153 @@ // a1ba: we don't really need custom linker on Android 64, because // it's only intended to workaround bug which persist on Android < 4.4 -#define Elf_Ehdr Elf32_Ehdr -#define Elf_Phdr Elf32_Phdr -#define Elf_Shdr Elf32_Shdr -#define Elf_Sym Elf32_Sym -#define Elf_Rel Elf32_Rel -#define Elf_RelA Elf32_Rela -#define Elf_Dyn Elf32_Dyn -#define Elf_Half Elf32_Half -#define Elf_Word Elf32_Word -#define Elf_Sword Elf32_Sword -#define Elf_Addr Elf32_Addr -#define Elf_Off Elf32_Off -#define Elf_Nhdr Elf32_Nhdr -#define Elf_Note Elf32_Note +#define Elf_Ehdr Elf32_Ehdr +#define Elf_Phdr Elf32_Phdr +#define Elf_Shdr Elf32_Shdr +#define Elf_Sym Elf32_Sym +#define Elf_Rel Elf32_Rel +#define Elf_RelA Elf32_Rela +#define Elf_Dyn Elf32_Dyn +#define Elf_Half Elf32_Half +#define Elf_Word Elf32_Word +#define Elf_Sword Elf32_Sword +#define Elf_Addr Elf32_Addr +#define Elf_Off Elf32_Off +#define Elf_Nhdr Elf32_Nhdr +#define Elf_Note Elf32_Note // Returns the address of the page containing address 'x'. -#define PAGE_START(x) ((x) & PAGE_MASK) +#define PAGE_START( x ) (( x )&PAGE_MASK ) // Returns the offset of address 'x' in its page. -#define PAGE_OFFSET(x) ((x) & ~PAGE_MASK) +#define PAGE_OFFSET( x ) (( x ) & ~PAGE_MASK ) // Returns the address of the next page after address 'x', unless 'x' is // itself at the start of a page. -#define PAGE_END(x) PAGE_START((x) + (PAGE_SIZE-1)) +#define PAGE_END( x ) PAGE_START(( x ) + ( PAGE_SIZE - 1 )) // Magic shared structures that GDB knows about. struct link_map_t { - uintptr_t l_addr; - char* l_name; - uintptr_t l_ld; - link_map_t* l_next; - link_map_t* l_prev; + uintptr_t l_addr; + char *l_name; + uintptr_t l_ld; + link_map_t *l_next; + link_map_t *l_prev; }; // Values for r_debug->state enum { - RT_CONSISTENT, - RT_ADD, - RT_DELETE + RT_CONSISTENT, + RT_ADD, + RT_DELETE }; -#if 0 -struct r_debug { - int32_t r_version; - link_map_t* r_map; - void (*r_brk)(void); - int32_t r_state; - uintptr_t r_ldbase; -}; -#endif -#define FLAG_LINKED 0x00000001 -#define FLAG_EXE 0x00000004 // The main executable -#define FLAG_LINKER 0x00000010 // The linker itself +#define FLAG_LINKED 0x00000001 +#define FLAG_EXE 0x00000004 // The main executable +#define FLAG_LINKER 0x00000010 // The linker itself #define SOINFO_NAME_LEN 128 typedef void (*linker_function_t)(); // Android uses REL for 32-bit but only uses RELA for 64-bit. -#if defined(__LP64__) +#if defined( __LP64__ ) #define USE_RELA 1 #endif struct soinfo { - public: - char name[SOINFO_NAME_LEN]; - const Elf_Phdr* phdr; - size_t phnum; - Elf_Addr entry; - Elf_Addr base; - unsigned size; +public: + char name[SOINFO_NAME_LEN]; + const Elf_Phdr *phdr; + size_t phnum; + Elf_Addr entry; + Elf_Addr base; + unsigned size; #ifndef __LP64__ - uint32_t unused1; // DO NOT USE, maintained for compatibility. + uint32_t unused1; // DO NOT USE, maintained for compatibility. #endif - Elf_Dyn* dynamic; + Elf_Dyn *dynamic; #ifndef __LP64__ - uint32_t unused2; // DO NOT USE, maintained for compatibility - uint32_t unused3; // DO NOT USE, maintained for compatibility + uint32_t unused2; // DO NOT USE, maintained for compatibility + uint32_t unused3; // DO NOT USE, maintained for compatibility #endif - soinfo* next; - unsigned flags; + soinfo *next; + unsigned flags; - const char* strtab; - Elf_Sym* symtab; + const char *strtab; + Elf_Sym *symtab; - size_t nbucket; - size_t nchain; - unsigned* bucket; - unsigned* chain; + size_t nbucket; + size_t nchain; + unsigned *bucket; + unsigned *chain; -#if !defined(__LP64__) - // This is only used by 32-bit MIPS, but needs to be here for - // all 32-bit architectures to preserve binary compatibility. - unsigned* plt_got; +#if !defined( __LP64__ ) + // This is only used by 32-bit MIPS, but needs to be here for + // all 32-bit architectures to preserve binary compatibility. + unsigned *plt_got; #endif -#if defined(USE_RELA) - Elf_RelA* plt_rela; - size_t plt_rela_count; +#if defined( USE_RELA ) + Elf_RelA *plt_rela; + size_t plt_rela_count; - Elf_RelA* rela; - size_t rela_count; + Elf_RelA *rela; + size_t rela_count; #else - Elf_Rel* plt_rel; - size_t plt_rel_count; + Elf_Rel *plt_rel; + size_t plt_rel_count; - Elf_Rel* rel; - size_t rel_count; + Elf_Rel *rel; + size_t rel_count; #endif - linker_function_t* preinit_array; - size_t preinit_array_count; + linker_function_t *preinit_array; + size_t preinit_array_count; - linker_function_t* init_array; - size_t init_array_count; - linker_function_t* fini_array; - size_t fini_array_count; + linker_function_t *init_array; + size_t init_array_count; + linker_function_t *fini_array; + size_t fini_array_count; - linker_function_t init_func; - linker_function_t fini_func; + linker_function_t init_func; + linker_function_t fini_func; -#if defined(__arm__) - // ARM EABI section used for stack unwinding. - unsigned* ARM_exidx; - size_t ARM_exidx_count; -#elif defined(__mips__) - unsigned mips_symtabno; - unsigned mips_local_gotno; - unsigned mips_gotsym; +#if defined( __arm__ ) + // ARM EABI section used for stack unwinding. + unsigned *ARM_exidx; + size_t ARM_exidx_count; +#elif defined( __mips__ ) + unsigned mips_symtabno; + unsigned mips_local_gotno; + unsigned mips_gotsym; #endif - size_t ref_count; - link_map_t link_map; + size_t ref_count; + link_map_t link_map; - bool constructors_called; + bool constructors_called; - // When you read a virtual address from the ELF file, add this - // value to get the corresponding address in the process' address space. - Elf_Addr load_bias; + // When you read a virtual address from the ELF file, add this + // value to get the corresponding address in the process' address space. + Elf_Addr load_bias; -#if !defined(__LP64__) - bool has_text_relocations; +#if !defined( __LP64__ ) + bool has_text_relocations; #endif - bool has_DT_SYMBOLIC; + bool has_DT_SYMBOLIC; - void CallConstructors(); - void CallDestructors(); - void CallPreInitConstructors(); + void CallConstructors(); + void CallDestructors(); + void CallPreInitConstructors(); - private: - void CallArray(const char* array_name, linker_function_t* functions, size_t count, bool reverse); - void CallFunction(const char* function_name, linker_function_t function); +private: + void CallArray( const char *array_name, linker_function_t *functions, size_t count, bool reverse ); + void CallFunction( const char *function_name, linker_function_t function ); }; #endif -#endif diff --git a/engine/wscript b/engine/wscript index 97b359e4..4e25a2d0 100644 --- a/engine/wscript +++ b/engine/wscript @@ -191,7 +191,7 @@ def build(bld): if bld.env.DEST_OS == 'android': libs += ['LOG'] - source += bld.path.ant_glob(['platform/android/*.c', 'platform/linux/*.c']) + source += bld.path.ant_glob(['platform/android/*.cpp', 'platform/android/*.c', 'platform/linux/*.c']) if bld.env.DEST_OS == 'nswitch': libs += [ 'SOLDER' ]