【问题标题】:Readelf reports program is a shared library instead of executableReadelf 报告程序是一个共享库而不是可执行文件
【发布时间】:2015-05-31 08:13:02
【问题描述】:

使用独立的 Android NDK r10e 工具链(使用 --toolchain=x86-clang3.6 开关构建)得到了这种奇怪的行为。交叉编译的环境变量已在运行makefile之前设置,SYSROOT指向Android工具链位置,CXX等于i686-linux-android-clang++。基本上,我有一堆想要编译为 Android 可执行文件的 cpp 文件。可悲的是,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

【问题讨论】:

  • 你确定你已经正确地复制了你的makefile吗?在我看来,这个 makefile 很可能会给你 不知道如何构建 错误。先决条件之后/配方之前应该有一个换行符/TAB,否则它们应该用;分隔。
  • @MadScientist 没错,这里少了TAB,可能粘贴的时候剪掉了。
  • 缺少 TAB 在 StackOverflow 上很常见。缺少换行符不是很多... :)

标签: c++ makefile android-ndk clang


【解决方案1】:

clang++ 不断生成 .so 共享库(用 readelf 检查 - 它确实是共享对象)。是否有我忘记的编译器/链接器的特殊切换?

我的猜测readelf 正在输出 Elf file type is DYN (shared object file),而您将其解释为共享对象 :)

你可能做了类似的事情:

readelf -l test | grep -i "file type"

实际上,这是与位置无关的可执行文件 (PIE) 和 readelf 报告的产物。

重要的部分是readelf 报告DYN报告EXEEXE 表示它缺少 PIE,这通常会触发与安全相关的缺陷。


PIE 是在 Android 4.1 中添加的,但它是可选的。 Android 5.0 及更高版本需要 PIE。来自Security Enhancements in Android 5.0

已移除非 PIE 链接器支持。 Android 现在要求所有动态链接的可执行文件支持 PIE(位置无关 可执行文件)。这增强了 Android 的地址空间布局 随机化 (ASLR) 实现。


另请参阅 Stack Overflow 上的 Position Independent Executables。它讨论了 PIE 和 Android。

【讨论】:

  • 这正是我所做的。更重要的是,在复制编译文件并从 adb shell 运行它之后,它就像预期的那样工作。感谢您为我指明正确的方向:)
猜你喜欢
  • 1970-01-01
  • 2015-09-05
  • 2023-04-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 2013-06-17
相关资源
最近更新 更多