Readelf 报告程序是一个共享库而不是可执行文件
Readelf reports program is a shared library instead of executable
使用独立的 Android NDK r10e 工具链(使用 --toolchain=x86-clang3.6 开关构建)得到了这种奇怪的行为。交叉编译的环境变量已在运行makefile之前设置,SYSROOT指向Android工具链位置,CXX等于i686-linux-android-clang++。基本上,我有一堆 cpp 文件,我想编译成 Android 可执行文件。可悲的是,clang++ 一直在生成 .so 共享库(使用 readelf 检查 - 它确实是共享对象)。是否有一个我忘记的编译器/链接器的特殊开关?
Makefile:(main.cpp 包含主要功能)
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++ keeps producing .so shared library (checked with readelf - it is indeed shared object). Is there a special switch to compiler / linker that I have forgotten?
我的猜测:readelf
正在输出Elf file type is DYN (shared object file)
,而您将其解释为共享对象 :)
你可能做了类似的事情:
readelf -l test | grep -i "file type"
实际上,这是位置独立可执行文件 (PIE) 和 readelf
报告的产物。
重要的部分是 readelf
正在报告 DYN
,而 不是 报告 EXE
。 EXE
表示它缺少 PIE,这通常会触发与安全相关的缺陷。
PIE 是在 Android 4.1 中添加的,但它是可选的。 Android 5.0 及更高版本需要 PIE。来自 Security Enhancements in Android 5.0:
non-PIE linker support removed. Android now requires all dynamically linked executables to support PIE (position-independent
executables). This enhances Android’s address space layout
randomization (ASLR) implementation.
另请参阅 Stack Overflow 上的 。它讨论了 PIE 和 Android.
使用独立的 Android NDK r10e 工具链(使用 --toolchain=x86-clang3.6 开关构建)得到了这种奇怪的行为。交叉编译的环境变量已在运行makefile之前设置,SYSROOT指向Android工具链位置,CXX等于i686-linux-android-clang++。基本上,我有一堆 cpp 文件,我想编译成 Android 可执行文件。可悲的是,clang++ 一直在生成 .so 共享库(使用 readelf 检查 - 它确实是共享对象)。是否有一个我忘记的编译器/链接器的特殊开关?
Makefile:(main.cpp 包含主要功能)
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++ keeps producing .so shared library (checked with readelf - it is indeed shared object). Is there a special switch to compiler / linker that I have forgotten?
我的猜测:readelf
正在输出Elf file type is DYN (shared object file)
,而您将其解释为共享对象 :)
你可能做了类似的事情:
readelf -l test | grep -i "file type"
实际上,这是位置独立可执行文件 (PIE) 和 readelf
报告的产物。
重要的部分是 readelf
正在报告 DYN
,而 不是 报告 EXE
。 EXE
表示它缺少 PIE,这通常会触发与安全相关的缺陷。
PIE 是在 Android 4.1 中添加的,但它是可选的。 Android 5.0 及更高版本需要 PIE。来自 Security Enhancements in Android 5.0:
non-PIE linker support removed. Android now requires all dynamically linked executables to support PIE (position-independent executables). This enhances Android’s address space layout randomization (ASLR) implementation.
另请参阅 Stack Overflow 上的