Readelf报表程序是共享库,而不是可执行文件 [英] Readelf reports program is a shared library instead of executable

查看:73
本文介绍了Readelf报表程序是共享库,而不是可执行文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用独立的Android NDK r10e工具链(使用--toolchain = x86-clang3.6开关构建),得到了这种奇怪的行为.在运行makefile之前,已设置交叉编译的环境变量 ,SYSROOT指向Android工具链位置,CXX等于i686-linux-android-clang ++.基本上,我有一堆要编译为Android可执行文件的cpp文件.可悲的是,clang ++一直在生成.so共享库(已通过readelf检查-它确实是共享库).我忘记了对编译器/链接器的特殊切换吗?

got this strange behaviour with standalone Android NDK r10e Toolchain (built with --toolchain=x86-clang3.6 switch). Environment variables for cross compilation have been set before running makefile, SYSROOT points to Android toolchain location, CXX equals i686-linux-android-clang++. Basically, I have a bunch of cpp files that I would like to compile to Android executable. Sadly, 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?

Makefile:(main.cpp包含main函数)

Makefile: (main.cpp contains main function)

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检查-它确实是共享库).我忘记了对编译器/链接器的特殊切换吗?

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),您将其解释为共享对象:)

My guess: readelf is outputting Elf file type is DYN (shared object file), and you are interpreting that to mean a shared object :)

您可能做过类似的事情:

You probably did something like:

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

实际上,这是位置独立可执行(PIE)和readelf报告的产物.

In reality, that's an artifact of Position Independent Executable (PIE) and readelf reporting.

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

The important part is readelf is reporting DYN, and not reporting EXE. EXE means it lacks PIE, and that usually triggers a security related defect.

PIE是在Android 4.1上添加的,但它是可选的. Android 5.0及更高版本需要PIE.来自 Android 5.0中的安全性增强功能:

PIE was added at Android 4.1, but it was optional. PIE is required for Android 5.0 and above. From Security Enhancements in Android 5.0:

非PIE链接器支持已删除. Android现在需要所有动态链接的可执行文件来支持PIE(与位置无关) 可执行文件).这可以改善Android的地址空间布局 随机化(ASLR)实现.

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.


另请参见与堆栈无关的位置独立可执行文件.它讨论了PIE和Android.


Also see Position Independent Executables on Stack Overflow. It discusses PIE and Android.

这篇关于Readelf报表程序是共享库,而不是可执行文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆