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 :=
TOOLCHAIN_ROOT :=
TOOLCHAIN_PREFIX :=
---------------------------------- 修改后
TOOLCHAIN_NAME := arm-linux-androideabi
BINUTILS_ROOT :=
TOOLCHAIN_ROOT :=
TOOLCHAIN_PREFIX :=
修改:
$NDK_PATH/build/core/toolchains/setup-toolchain.mk
把2改为3
ifneq (
ifneq (
$(call _ndk_error,Expected two items in TARGET_TOOLCHAIN_LIST, \
found "$(TARGET_TOOLCHAIN_LIST)")
endif
自己的安卓项目里面添加
Application.mk
NDK_TOOLCHAIN_VERSION := llvm
需要处理的Android.mk
android默认编译是导出所有符号的需要隐藏起来
二进制文件中包含了代码中的字符串,在运行中这些字符串将被加载到内存中,被程序所采用。这些字符串如果不做特殊处理,那么通过一些反编译工具(如IDA Pro等)能全部看得到。
-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
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")))
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> >*)