android ndk:-fPIC 和 -pie 是互斥的吗?

2024-03-08

我正在使用 Android r10e NDK 为 Android 构建 Unison(文件同步可执行文件),但这并不是真正的 Android 问题。

Android > 5.0 (SDK 21) 要求可执行文件与位置无关。所以我 编译时将 -pie 传递给arm-linux-androideabi-gcc,其工作原理:

% hardening-check ./unison
./unison:
Position Independent Executable: yes
...

这在 Android 5.0 设备上运行良好。

Android > 6.0 (SDK 21) 仍然要求可执行文件与位置无关, 但also要求在不进行文本重定位的情况下构建可执行文件。所以我 编译时将 -fPIC 传递给arm-linux-androideabi-gcc,它似乎构建 没有文本重定位的二进制文件:

% arm-linux-androideabi-readelf -a ./unison |& grep TEXTREL
(no output is shown)

问题是,我一次只能满足一个要求。如果我使用 -pie 和 -fPIC 在一起,生成的可执行文件是位置无关的(耶!),但是 还有文本重定位(嘘!):

% hardening-check ./unison
./unison:
Position Independent Executable: yes
...

% arm-linux-androideabi-readelf -a ./unison |& grep TEXTREL
0x00000016 (TEXTREL)                    0x0
0x0000001e (FLAGS)                      TEXTREL BIND_NOW

...Android 6.0 设备拒绝运行它:

% adb push unison /data/local/tmp 
% adb shell '/data/local/tmp/unison -version'
WARNING: linker: /data/local/tmp/unison has text relocations. This is wasting memory and prevents security hardening. Please fix.
CANNOT LINK EXECUTABLE: can't protect segments for "/data/local/tmp/unison": Permission denied

让这些标志协同工作需要什么特殊的调味料?或者, 或者,我错过了什么? PIC 和 PIE 是否互斥?

Thanks!

Edit:

我正在手动完成 OPAM 存储库为 Android 构建 Unison 所经历的相同过程。即:

  1. 构建 ocaml 交叉编译器。

  2. 拉下 Unison 源。

  3. 应用补丁:

    --- pty.c~  2010-04-15 19:29:31.000000000 +0200
    +++ pty.c   2013-01-16 19:28:56.258812188 +0100
    @@ -10,7 +10,7 @@
    extern void uerror (char * cmdname, value arg) Noreturn;
    
    // openpty
    -#if defined(__linux)
    +#if defined(__linux) && !defined(__ANDROID__)
    #include <pty.h>
    #define HAS_OPENPTY 1
    #endif
    --- Makefile.OCaml~ 2013-01-16 19:27:10.686807807 +0100
    +++ Makefile.OCaml  2013-01-16 19:29:46.814814286 +0100
    @@ -136,7 +136,9 @@
        # openpty is in the libutil library
        ifneq ($(OSARCH),solaris)
        ifneq ($(OSARCH),osx)
    -        CLIBS+=-cclib -lutil
    +        ifneq ($(OSCOMP),android)
    +          CLIBS+=-cclib -lutil
    +        endif
        endif
        endif
        buildexecutable::
    
  4. 构建:

    % make \
        UISTYLE=text \
        OCAMLOPT="arm-linux-androideabi-ocamlopt -verbose -ccopt '-fPIC -pie'" \
        OSCOMP=android
    

上述过程构建了一个 PIE 可执行文件,该可执行文件在 Android 5 上运行良好,但在 Android 6 上失败,因为它具有文本重定位。删除上面的“-pie”会构建一个没有文本重定位的二进制文件,但不是 PIE 可执行文件,因此它无法在 Android 5 或 6 上运行。


只是补充一点,对于有些人看到这个问题,认为它完全符合他们的问题,

尽管 -fPIC 还是文本重定位? https://stackoverflow.com/questions/39957435/text-relocations-despite-fpic

将是正确的答案。简而言之,在仔细检查所有“C”代码设置后,不要忘记汇编代码问题。

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

android ndk:-fPIC 和 -pie 是互斥的吗? 的相关文章

随机推荐

  • 如何将按钮对齐到屏幕中间?

    我正在尝试在屏幕中间放置 2 个按钮 然而 这些按钮与我现在拥有的代码重叠 实际上我并没有使用那么多 CSS 所以这可能是一个新手问题 这是我的html wrapper text align center button position a
  • 使用 AVMutableComposition 缝合(合并)视频时修复方向

    TLDR 查看编辑 我正在 Swift 中创建一个测试应用程序 我想使用以下命令将应用程序文档目录中的多个视频拼接在一起AVMutableComposition 我在某种程度上成功地做到了这一点 我的所有视频都拼 接在一起 并且所有内容都显
  • HTTP 请求损坏

    在接收大量流量的网站上 一小部分请求是这样的 http cheezburger com ScriptResource axd d zaVpgH63ePt90pn br br p a src ScriptResource axd d zaVp
  • TFS 与 JIRA/Bamboo/SVN [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 us-central1 以外的网络区域使用 httpsCallable

    我部署了一个云函数 如下所示 export const publishVersion functions region europe west2 https onCall async data context gt 然后在我的网络客户端中
  • Golang - ToUpper() 在单个字节上?

    我有一个 byte b 我想选择一个字节 b pos 并将其更改为大写 然后小写 bytestype 有一个方法叫做ToUpper 我如何将其用于单个字节 Calling ToUpper在单字节上 OneOfOne 给出了最有效的 调用数千
  • 柯里化有什么好处?

    我认为我不太理解柯里化 因为我看不到它可以提供任何巨大的好处 也许有人可以用一个例子来启发我 证明它为什么如此有用 它真的有好处和应用吗 还是只是一个被过度重视的概念 两者之间有细微差别currying and 部分应用 尽管它们密切相关
  • BigQuery 分区表在 _PARTITIONTIME 上联接

    有两个分区表 都带有伪列 PARTITIONTIME 我想在 PARTITIONTIME 上加入它们 然后我想使用 PARTITIONTIME 过滤器查询结果表 但我注意到该过滤器仅传播到 JOIN 语句的第一个表 下面是一个例子 WITH
  • 如何在 Sublime Text 2 中解析来自 TypeScript 的错误消息?

    我正在尝试为 TypeScript 设置 Sublime Text 2 构建系统 我已按照我找到的指示进行操作here https stackoverflow com questions 12779631 how to configure
  • 问题 如何使 C# 的 VS IDE 设计器失效/刷新?

    I have 定制表格继承自Form它实现了一个名为的布尔属性Prop 我将使用的表单将继承自定制表格 此属性将对表单进行一些绘制和更改 如果已启用 但是 这并没有按预期工作 设计的 VS IDE 没有刷新以显示更改 但是 如果我按 Ctr
  • 使用 boost::asio::ip::tcp::iostream 的低带宽性能

    我写了一个小测试程序 使用boost asio ip tcp iostream传输约 38 MiB 的数据 include
  • C++ 标准是否强制要求对 wchar_t 进行编码?

    以下是我的 2014 年标准草案 N4140 副本的一些摘录 22 5 标准代码转换方面 locale stdcvt 3 对于三个代码转换方面中的每一个codecvt utf8 codecvt utf16 and codecvt utf8
  • NestedScrollView 下方的 TextView 高度为 wrap_content 不可见

    下面是底页的布局文件 我有一个TextView在嵌套滚动视图下方 当内容较大时 TextView以下NestedScrollView不可见 如果 NestedScrollView 的内容很小 它是可见的 我不明白是什么原因造成的 这是我的布
  • 套接字编程中的客户端到客户端消息传递

    我正在开发一个项目 该项目是基于 C 中的 WinSock 的服务器客户端应用程序 我已经完成了服务器和客户端之间通信所需的任何操作 我能够在它们之间发送和接收消息 现在我需要知道如何完成客户端到客户端消息传递部分以及必须如何完成工作 我只
  • 如何获取图片资源名称

    如何获取动态设置的imageview资源名称 这是图像适配器代码 public class ImageAdapter extends BaseAdapter private Context mContext public ImageAdap
  • 当构造函数采用字符串数组作为参数时,使用反射创建对象实例

    我正在尝试创建一个仅具有以下构造函数的类的实例 覆盖默认构造函数 public HelloWorld String args 我正在做以下事情 Class reflect HelloWorld obj null some logic to
  • Nodejs 错误: module.js:340 抛出错误;

    我尝试运行示例服务器 但在 Windows 上收到错误消息 然后我尝试在我朋友的机器上运行它 但运行得很顺利 windows系统也是如此 我不知道发生了什么事 让我展示一下源代码和错误消息 源代码 var http require http
  • 在 catch 上下文之外重新抛出异常时如何保留堆栈跟踪?

    TL DR 稍后如何引发先前捕获的异常 同时保留原始异常的堆栈跟踪 因为我认为这对Resultmonad 或计算表达式 尤其是 由于该模式通常用于包装异常而不抛出异常 因此下面是一个已解决的示例 type Result lt TResult
  • Yii2 REST 查询

    嘿 我有一个 ProductController 它扩展了 yii rest ActiveController 问题是我如何通过 HTTP GET 请求进行查询 Like http api test loc v1 products sear
  • android ndk:-fPIC 和 -pie 是互斥的吗?

    我正在使用 Android r10e NDK 为 Android 构建 Unison 文件同步可执行文件 但这并不是真正的 Android 问题 Android gt 5 0 SDK 21 要求可执行文件与位置无关 所以我 编译时将 pie