gpt4 book ai didi

c++ - Readelf 报告程序是一个共享库而不是可执行文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:04 25 4
gpt4 key购买 nike

使用独立的 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++ 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 文件类型是 DYN(共享目标文件),而您正在将其解释为共享对象:)

你可能做了类似的事情:

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 :

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.


另见 Position Independent Executables在堆栈溢出上。它讨论了 PIE 和 Android。

关于c++ - Readelf 报告程序是一个共享库而不是可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30555248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com