gpt4 book ai didi

GCC:-static 和 -pie 与 x86 不兼容?

转载 作者:行者123 更新时间:2023-12-01 22:29:38 25 4
gpt4 key购买 nike

我正在为 Android 5.0 重新编译一些可执行文件,因为它要求可执行文件为 PIE。我只需在配置时添加一些参数(使用独立工具链)即可为 ARM 重新编译它:

export CFLAGS="-I/softdev/arm-libs/include -fPIE"
export CPPLAGS="$CPPFLAGS -fPIE"
export CXXLAGS="$CXXFLAGS -fPIE"
export LDFLAGS="-L/softdev/arm-libs/lib -static -fPIE -pie"

ARM 没有错误:

configure:3406: arm-linux-androideabi-gcc -o conftest -I/softdev/arm-libs/include -fPIE  -L/softdev/arm-libs/lib -static -fPIE -pie conftest.c  >&5
configure:3410: $? = 0

但是我无法对 x86 执行相同的操作,因为我收到错误:

export CFLAGS="-I/softdev/x86-libs/include -fPIE"
export CPPLAGS="$CPPFLAGS -fPIE"
export CXXLAGS="$CXXFLAGS -fPIE"
export LDFLAGS="-L/softdev/x86-libs/lib -static -fPIE -pie"

错误:

configure:3336: i686-linux-android-gcc -I/softdev/x86-libs/include -fPIE  -L/softdev/x86-libs/lib -static -fPIE -pie conftest.c  >&5
/softdev/x86-toolchain-gcc4.8/bin/../lib/gcc/i686-linux-android/4.8/../../../../i686-linux-android/bin/ld: fatal error: -pie and -static are incompatible
collect2: error: ld returned 1 exit status
configure:3340: $? = 1

我需要静态链接可执行文件。出了什么问题以及如何修复它?

PS。还尝试使用来自 android ndk r9d 和 r10c 的 x86 独立工具链:

./make-standalone-toolchain.sh --toolchain=x86-4.8 --arch=x86 --install-dir=/softdev/x86-toolchain-gcc4.8-r9d --ndk-dir=/softdev/android-ndk-r9d/ --system=darwin-x86_64

最佳答案

正如下面的 n4sm 所提到的,gcc-8 或更高版本支持 -static-pie,它使用 PIE 生成静态二进制文件。请注意,这是一种选择,而不是两种。如果您尝试使用-static -pie,它不会按照您的想法进行。

我刚刚用 te.c 中的以下内容进行了快速测试:

int main( int argc, const char* argv[] )
{
return 0;
}

运行 arm-linux-androideabi-gcc -o conftest -static -FPIE -pie te.c 不会产生错误。但是 file -k conftest 输出

conftest: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), not stripped

readelf -l conftest 输出Elf 文件类型为 DYN(共享对象文件)入口点0x500有7个程序头,从偏移52开始

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x00000034 0x00000034 0x000e0 0x000e0 R 0x4
INTERP 0x000114 0x00000114 0x00000114 0x00013 0x00013 R 0x1
[Requesting program interpreter: /system/bin/linker]
...

PHDR 和 INTERP header 的存在表明 -pie 在 Arm 编译器中默默地覆盖 -static。为什么这是我不知道的,但我认为这是一个错误,当 -static 和 -pie 一起使用时不会发出警告。相反,像您这样的程序员会留下这样的错误印象:这两个选项可以在arm上一起使用。

只是为了澄清这里唯一的行为差异是 x86 编译器在看到 --static 和 --pie 时出错,而arm版本如果给出 --pie 则默默地忽略 --static 。如果只给出其中一个,则两个编译器的行为是相同的。

关于GCC:-static 和 -pie 与 x86 不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27082959/

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