Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

SonnySmart/Hikari_Xcode-NDK

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

15 Commits

Repository files navigation

Hikari_Xcode-NDK

Xcode OLLVM8.0 && Android NDK r16b OLLVM6.0

适用于Unity2018 && cocos2d-x-cocos2d-x-3.17.2测试通过。
测试环境MAC10.14.5 Xcode11.2.1 NDKr16b

Xcode直接用制作好的工具链OLLVM8.0
NDK编译Unity需要替换llvm文件夹
NDK编译COCOS需要修改toolchains

制作NDKr16b OLLVM工具链

修改Unity工具链:
$NDK_PATH 为NDK路径
下载OLLVM6.0解压
rm -rf $NDK_PATH/toolchains/llvm/prebuilt/darwin-x86_64/*
cp -r Hikari.xctoolchain/usr/* $NDK_PATH/toolchains/llvm/prebuilt/darwin-x86_64
完成

修改COCOS工具链:
cp -r $NDK_PATH/toolchains/llvm $NDK_PATH/toolchains/arm-linux-androideabi-llvm
cp -r $NDK_PATH/build/core/toolchains/arm-linux-androideabi-clang $NDK_PATH/build/core/toolchains/arm-linux-androideabi-llvm
修改:
$NDK_PATH/build/core/toolchains/arm-linux-androideabi-llvm/setup.mk
---------------------------------- 修改前
TOOLCHAIN_NAME := arm-linux-androideabi
BINUTILS_ROOT := $(call get-binutils-root,$(NDK_ROOT),$(TOOLCHAIN_NAME))
TOOLCHAIN_ROOT := $(call get-toolchain-root,$(TOOLCHAIN_NAME)-4.9)
TOOLCHAIN_PREFIX := $(TOOLCHAIN_ROOT)/bin/$(TOOLCHAIN_NAME)-
---------------------------------- 修改后
TOOLCHAIN_NAME := arm-linux-androideabi
BINUTILS_ROOT := $(call get-binutils-root,$(NDK_ROOT),$(TOOLCHAIN_NAME))
TOOLCHAIN_ROOT := $(call get-toolchain-root,$(TOOLCHAIN_NAME)-llvm)
TOOLCHAIN_PREFIX := $(TOOLCHAIN_ROOT)/bin/$(TOOLCHAIN_NAME)-
修改: $NDK_PATH/build/core/toolchains/setup-toolchain.mk
把2改为3
ifneq ($(words $(TARGET_TOOLCHAIN_LIST)),2)
ifneq ($(words $(TARGET_TOOLCHAIN_LIST)),3)
$(call _ndk_error,Expected two items in TARGET_TOOLCHAIN_LIST, \
found "$(TARGET_TOOLCHAIN_LIST)")
endif

自己的安卓项目里面添加
Application.mk
NDK_TOOLCHAIN_VERSION := llvm
需要处理的Android.mk
android默认编译是导出所有符号的需要隐藏起来

如何隐藏C/C++编译生成的函数符号

二进制文件中包含了代码中的字符串,在运行中这些字符串将被加载到内存中,被程序所采用。这些字符串如果不做特殊处理,那么通过一些反编译工具(如IDA Pro等)能全部看得到。

回到函数符号的隐藏,一般可以在gcc编译选项中加入如下编译选项:

-ffunction-sections, -fdata-sections会使compiler为每个function和data item分配独立的section。 --gc-sections会使ld删除没有被使用的section。 链接操作以section作为最小的处理单元,只要一个section中有某个符号被引用,该section就会被放入output中。 这些选项一起使用会从最终的输出文件中删除所有未被使用的function和data, 只包含用到的unction和data。

LOCAL_CFLAGS += -ffunction-sections -fdata-sections -fvisibility=hidden -mllvm -enable-strcry
LOCAL_LDFLAGS += -Wl,--gc-sections

在xcode中,需要修改如下编译选项(加粗部分):

Strip Stype -> Non-Global Symbols 
Use Separate Strip -> Yes
Other Linker Flags -> -Xlinker -x
Debug Information Level -> Line Tables only
Generate Debug Symbols -> No
Symbols Hidden by Default -> Yes

通过上述设置,库内部的函数符号就可以隐藏了。而我们需要一些导出函数给其他人用的话,可以在需要导出的函数前面加上:

__attribute__((visibility("default")))

ELF学习日记-Android SO库文件头分析

so .text段加密问题记录

UPX压缩壳

获取导出函数技巧

windows linux bash
c++filt _ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_
art::DexFile::OpenMemory(unsigned char const*, unsigned int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, art::MemMap*, art::OatDexFile const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)

About

Xcode OLLVM8.0 && Android NDK r16b OLLVM6.0

Resources

Stars

Watchers

Forks

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /