使用独立的 Android NDK r10e 工具链(使用 --toolchain=x86-clang3.6 开关构建)出现这种奇怪的行为。交叉编译的环境变量已设置在运行makefile之前,SYSROOT指向Android工具链位置,CXX等于i686-linux-android-clang++。基本上,我有一堆 cpp 文件,我想将它们编译为 Android 可执行文件。遗憾的是,clang++ 不断生成 .so 共享库(用 readelf 检查 - 它确实是共享对象)。是否有我忘记的编译器/链接器的特殊开关?
Makefile:(main.cpp包含main函数)
CFLAGS=-c -Wall -std=c++11 -Wextra --sysroot=${SYSROOT} -march=i686
LDFLAGS=-lc -lc++_shared -L${SYSROOT}/usr/lib
SOURCES=main.cpp File1.cpp File2.cpp File3.cpp File4.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=test
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS) ${CXX} $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o: ${CXX} $(CFLAGS) $< -o $@
clean: rm *.o test
clang++ 不断生成 .so 共享库(使用 readelf 检查 - 它确实是共享对象)。是否有我忘记的编译器/链接器的特殊开关?
My guess: readelf
正在输出Elf file type is DYN (shared object file)
,您将其解释为共享对象:)
你可能做了类似的事情:
readelf -l test | grep -i "file type"
实际上,这是位置无关可执行文件 (PIE) 的产物,并且readelf
报告。
重要的部分是readelf
正在报告DYN
, and not报告EXE
. EXE
意味着它缺少 PIE,这通常会触发与安全相关的缺陷。
PIE 是在 Android 4.1 中添加的,但它是可选的。 Android 5.0 及以上版本需要 PIE。从Android 5.0 的安全增强 https://source.android.com/devices/tech/security/enhancements/enhancements50.html:
删除了非 PIE 链接器支持。 Android 现在要求所有动态链接的可执行文件支持 PIE(位置无关)
可执行文件)。这增强了 Android 的地址空间布局
随机化(ASLR)实施。
另请参阅位置独立的可执行文件 https://stackoverflow.com/q/30498776/608639在堆栈溢出上。它讨论了 PIE 和 Android。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)