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

2024-01-07

我正在为 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"

error:

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

我需要静态链接可执行文件。出了什么问题,我该如何解决?

附言。还尝试使用来自 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;
}

Running arm-linux-androideabi-gcc -o conftest -static -FPIE -pie te.c不会产生任何错误。然而file -k conftest outputs

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC:-static 和 -pie 与 x86 不兼容? 的相关文章

  • x86-64 Linux 中不再允许使用 32 位绝对地址?

    64 位 Linux 默认使用小内存模型 将所有代码和静态数据置于 2GB 地址限制以下 这确保您可以使用 32 位绝对地址 旧版本的 gcc 对静态数组使用 32 位绝对地址 以便节省相对地址计算的额外指令 然而 这不再有效 如果我尝试在
  • clrscr() 不工作,getch() 工作。为什么?

    我正在做一个小C请求密钥并执行 switch 语句中的某些代码的程序 include
  • “yield”不是“std::this_thread”的成员

    我试图产生当前线程 std this thread yield 但不幸的是 海湾合作委员会更清楚 yield 不是 std this thread 的成员 我是否忘记了一些类似于 D GLIBCXX USE NANOSLEEP 的 hack
  • GNU 链接器 - 孤立部分和符号分配

    在阅读了足够多有关 GNU 链接器的文档后 我对结合有关实现自定义链接器文件的两个不同概念感到困惑 第一个概念是孤儿节 https sourceware org binutils docs ld Orphan Sections html O
  • 使用 gcc 在 C 中实现类型安全的可变参数

    很多时候 我希望函数接收可变数量的参数 例如以 NULL 结尾 define push stack t stack push VARARG NULL func push stack t stack char s va list args v
  • VS Code 不会构建具有多个 .cpp 源文件的 C++ 程序

    请注意 我在 Ubuntu 17 10 上使用 VS Code 并使用 GCC 编译器 我在构建一个使用附加 cpp 文件的简单程序时遇到问题 我可能在这里遗漏了一些明显的东西 因为我对编程相当陌生 但我会解释到目前为止我所做的事情 这阻止
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 另一个 MinGW“gcc:错误:CreateProcess:没有这样的文件或目录”

    我已经通过 GUI 安装程序在 Windows 8 64 位 中安装了 MinGW C 编译器 但是当我尝试编译 C 程序时 gcc 说 gcc CreateProcess 没有这样的文件或目录 这是一个常见的错误 我已经尝试了我找到的所有
  • gdb 通过指向错误的代码行显示不正确的回溯

    我们可以通过在源代码中包含多个中止调用 用非常简单的示例重现此问题 在下面的示例代码中 我们在不同条件下总共有四个中止调用 但是当我们使用优化标志 O3 进行编译时 我们只能看到一个中止调用的调试信息 因此 在这四个中止调用中发生崩溃时 g
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC
  • 关闭 MediaStyle 通知

    Lollipop 中的新 Android MediaStyle 通知没有关闭按钮 看起来 Google Code 上已经存在一个错误 在错误解决之前 有谁知道解决此问题的好方法是什么 我们应该推迟切换到 MediaStyle 吗 或者使用其
  • 警告:c 中指针和整数之间的比较[默认启用]

    我想检查用户输入是否仅包含数字 所以 我使用以下代码 for i 0 argv 1 i NULL i if isdigit argv 1 i printf Error return 1 它工作得很好 但我收到了这个警告 warning co
  • gcc 的 -Wbad-function-cast 的目的是什么?

    根据此处答案的建议 我打开了 Wbad function cast看看我的代码是否有 gcc 可以捕获的任何不良行为 结果出现了这个示例 unsigned long n int crossover int pow n 14 这里并不重要cr
  • 为什么要在项目中使用#include_next?

    引用iOS有关包装器标头的文档 http developer apple com library ios documentation DeveloperTools gcc 4 0 1 cpp Wrapper Headers html inc
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se
  • 如何BSWAP 64位寄存器的低32位?

    我一直在寻找如何将 BSWAP 用于 64 位寄存器的低 32 位子寄存器的答案 例如 0x0123456789abcdef位于 RAX 寄存器内 我想将其更改为0x01234567efcdab89用一条指令 因为性能 所以我尝试了以下内联
  • 软件预取手动指令合理的场景

    我读过有关 x86 和 x86 64 Intel 的内容gcc提供特殊的预取指令 include
  • 分析 ELF 部分和符号大小的工具

    我需要一种方法来分析 ARM 的 GCC 编译器的输出文件 我正在为裸机进行编译 并且我非常关心大小 我可以用arm none eabi objdump由交叉编译器提供 但如果存在用于此任务的工具 则解析输出并不是我渴望做的事情 您知道存在
  • 在 Linux 上将 libquadmath 与 C++ 链接

    我有一个示例代码 include

随机推荐

  • 隐藏空父项 - JFace 的 TreeViewer

    我正在 JFace 中创建一个树查看器 我想实现一些目标 我在里面使用过滤器 过滤器效果很好 但并不完美 当我使用filter expandAll 方法中 过滤器过滤了树中的所有项目 但有一些事情确实很烦人 尽管它过滤了树的所有项目 但它不
  • 在 IntelliJ Idea 中仅显示尾随空格

    因此 我最近从 Eclipse 迁移到 IntelliJ IDEA 终极版 并且我对空格感到挑剔 At the moment I ve set IntelliJ IDEA to show me whitespace and it looks
  • 将react-router和react-router-relay从v1.x更新到v2.x(位置“/”与任何路由不匹配)

    我正在尝试在我的应用程序中将react router更新到v2 6 并将react router relay更新到v0 7 但我正在努力遵循更改日志来解决所有重大更改 我想我已经解决了所有更改 但仍然无法使其发挥作用 警告 react ro
  • 如何在c中将时间转换为c字符串?

    我想在 c 文件中的 txt 文件中写入一些内容 但需要使用当前时间戳作为后缀来命名该文件 就像 filename 2010 08 19 20 30 一样 所以我得先定义文件名字符数组 然后自己处理文件名 一个一个分配字符 有什么简单的方法
  • 将旧 Unix 日期转换为 Perl 并进行比较

    要求 我的文件名为 Rajesh 1202242219 数字只不过是一个日期 date y m d H M 格式 现在我正在尝试编写一个 perl 脚本来从文件名中提取数字并与当前系统日期和时间进行比较 并根据此比较的输出 使用 perl
  • jQuery DataTable 在按钮单击上设置标题

    在我看来 我有 2 个输入字段 1 个按钮和 1 个我正在使用的表格jQuery 数据表 https datatables net 我正在使用打印功能 https datatables net extensions buttons exam
  • 当用户名包含斜杠时,PuTTY PSCP 错误“不支持本地到本地复制”

    我正在尝试使用 PSCP 将文件从本地 Windows 计算机移动到远程 Linux 服务器 我已连接到 VPN 以便可以使用我的用户名和密码访问远程 Linux 计算机 我的 PSCP 传输命令是 pscp C Users usernam
  • 如何使用 XmlSerializer 反序列化到现有实例?

    是否可以使用 XmlSerializer 将其数据反序列化为类的现有实例而不是新实例 这在两种情况下会很有帮助 轻松地将两个 XML 文件合并到一个对象实例中 让对象构造器本身成为从 XML 文件加载其数据的构造器 如果默认情况下不可能 则
  • servlet 过滤器是否可以确定哪个 servlet 将处理请求

    我正在编写一个执行日志记录的过滤器 如果请求最终到达某个 servlet 我需要禁用此日志记录 有没有办法让过滤器知道哪个 servlet 将处理请求 您可能希望设置 servlet 过滤器映射 以便在请求特定 servlet 时不触发它
  • 如何在 Mac OS X 上启动 mongodb 服务?

    我已经在我的 Mac 上安装了 Mongodb 但该进程当前未运行 如何启动 Mongodb 服务以便可以开始使用命令 如果您使用自制程序在 macOS 上安装 MongoDB 请在终端中键入以下内容 在大多数情况下应该可以解决问题 bre
  • ROWNUM 在分页查询中如何工作?

    所以我想选择 Oracle DB 中的一系列行 我需要这样做 因为我的表中有数百万行 并且我想将结果分页给用户 如果您知道在客户端执行此操作的另一种方法 我正在使用 JavaFX 如果它很重要 但我不这样做认为通过网络发送所有数据以在客户端
  • IOS UIWebView:如何向 DOM 事件添加监听器?

    如何在 UIWebView 中添加 DOM 事件监听器 例如对于以下 html
  • 使

    在 Word 中 您可以将图像放置在页面上 并使文本在其周围流畅地排列 我想知道使用 CSS 可以达到什么程度 并指出它必须在 IE6 中工作 我已经使用浮动进行了某种关闭 但浮动子元素仍然 阻止 其上方的文本 所以它部分包裹 是否可以将子
  • 如何返回变量?

    我正在编写一个程序 将字母翻译成摩尔斯电码 然后将它们传输到 LED 并闪烁 我无法返回值 include
  • 如何使用 jQuery 创建“请稍候,正在加载...”动画?

    我想在我的网站上放置一个 请稍候 加载 旋转圆圈动画 我应该如何使用 jQuery 来完成这个任务 您可以通过各种不同的方式来做到这一点 它可能是微妙的 如页面上显示 正在加载 的小状态 也可能是大声的 如在加载新数据时整个元素使页面变灰
  • JavaScript 中 JSON.stringify() 的替代方案

    在 JavaScript 中 有哪些替代方案JSON stringify 对于没有本机 JSON 支持的浏览器 谢谢 你应该使用图书馆json2 js https github com douglascrockford JSON js 它是
  • Mysql:将数据数组存储在单列中

    并提前感谢您的帮助 嗯 这就是我的情况 我有一个网络系统 可以根据超声波计创建的样本进行一些与噪声相关的计算 最初 数据库只存储这些计算的结果 但现在 我还被要求存储样本本身 每个样本只是 300 或 600 个数字的列表 每个数字有 1
  • ValueError:“对象对于所需数组来说太深”

    我在 Python 程序中遇到 ValueError object too deep fordesired array 我在使用 numpy digitize 时遇到此错误 我认为这就是我使用 Pandas DataFrames 的方式 为
  • LinkedIn 有测试其 API 的平台吗?

    我找不到 Playground 或 API Explorer 来测试 Linkedin API 我在过去两年左右的时间里尝试过 但每次都放弃了 有吗 简单的答案是否定的 没有 API 浏览器或游乐场 BUT然而 linkedin 有一个测试
  • GCC:-static 和 -pie 与 x86 不兼容?

    我正在为 Android 5 0 重新编译一些可执行文件 因为它需要可执行文件PIE 我能够重新编译它ARM只需在配置时添加一些参数 使用独立工具链 export CFLAGS I softdev arm libs include fPIE