【问题标题】:Building Android from sources: unsupported reloc 43从源代码构建 Android:不支持的 reloc 43
【发布时间】:2016-03-16 22:42:28
【问题描述】:

当我在编译 Android 5.1.1 时,我遇到了很多这样的错误:

...
...
...
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43
libnativehelper/JniInvocation.cpp:165: error: unsupported reloc 43

make 过程最终失败:

clang: error: linker command failed with exit code 1 (use -v to see invocation)
build/core/host_shared_library_internal.mk:44: recipe for target 'out/host/linux-x86/obj32/lib/libnativehelper.so' failed
make: *** [out/host/linux-x86/obj32/lib/libnativehelper.so] Error 1

我尝试过使用和不使用 clang 以及不同版本的 clang 来构建源代码。但在较新的分支上,clang 是必需的,没有它就无法启动。

可能出了什么问题?

【问题讨论】:

    标签: android makefile android-source


    【解决方案1】:

    应该应用此补丁以使事情正常运行https://android-review.googlesource.com/#/c/223100/

    使用一些编辑器在你的android源代码目录中打开build/core/clang/HOST_x86_common.mk文件添加这些行,如link中所述

    对于 Android Lollipop 或任何早期版本,请确保在应用此补丁时保留-no-integrated-as。确保行继续正确(\ 在除最后一行之外的每一行的末尾)。

    但是,-no-integrated-as 在 Marshmallow 中被删除了。

    【讨论】:

    • 感谢补丁的链接,我使用了 git cherry-pick 并且似乎工作正常(构建仍在进行中,这只是我必须修复的错误之一......等待下一个...)
    • 请看@Rémi Cohen-Scali 的回答:他提到要清除ccache 和make clean build。
    【解决方案2】:

    对我有用:
    在文件 /art/build/Android.common_build.mk 中,找出:

    # Host.
    ART_HOST_CLANG := false
    ifneq ($(WITHOUT_HOST_CLANG),true)
      # By default, host builds use clang for better warnings.
      ART_HOST_CLANG := true
    endif
    

    改为:

    # Host.
    ART_HOST_CLANG := false
    ifeq ($(WITHOUT_HOST_CLANG),false)
      # By default, host builds use clang for better warnings.
      ART_HOST_CLANG := true
    endif
    

    如果仍然无法正常工作,请在您的 android 根路径中尝试此操作: cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld

    【讨论】:

    • Makefile 更改是黄金!很棒的发现
    • FWIW,我在构建 libcxx 和 libcxxabi 时遇到了同样的错误。复制对我不起作用(我没有找到“.../ld(可能未安装 ld),但软链接可以(不知道为什么)。
    • cp 命令可以正常工作,而无需为我做任何其他事情。谢谢!
    • 为我工作。这应该是选择的答案
    【解决方案3】:

    问题来自 binutils 中的不兼容更改:添加了某些部分。一些构建平台有新的 binutils,而 android 构建树有旧的。该错误来自 clang 调用变量定义。这些并没有告诉 clang 使用提供的构建链。然后 clang 使用本机构建平台 binutils(这里 /usr/bin/as 代替提供的预构建)。然后修复意味着应用 mysticTot 指向的补丁,然后删除工具链生成的所有二进制文件(根据错误出现的位置,这可能会改变,但删除 out 树中的所有 STATIC_LIBRARIES/SHARED_LIBRARIES/EXECUTABLES 等目录应该这样做)。还要删除 ccache 缓存(因为它存储 .o)然后重建。 Ov3r1oad 提供的修复包括用本机 ld 替换预构建的工具链 ld 不是解决方案,只是一种解决方法并且可能很危险(混合部分编号不好)。 希望它会有所帮助。

    【讨论】:

      【解决方案4】:

      作为一个艰难的解决方法,我刚刚用 /usr/bin/ld.gold 上的软链接替换了预建链接器。 它在这里描述:https://bbs.archlinux.org/viewtopic.php?id=209698。

      【讨论】:

      • 为我工作,谢谢! (我正在 Arch Linux 上构建 cm12.1,Lollipop)
      • 对我不起作用:ubuntu 16.04,编译 android 5.1.1_r6。
      【解决方案5】:

      您是在 Arch Linux 上构建的吗?从今天开始我也有同样的问题。我之前的构建是 3 天前,一切都很好。今天都失败了。

      我看到管理员两天前升级了一些包,尤其是这些

      [2016-03-16 15:29] [ALPM] upgraded glibc (2.22-3 -> 2.23-1)
      [2016-03-16 15:29] [ALPM] upgraded lib32-glibc (2.22-3.1 -> 2.23-1)
      [2016-03-16 15:29] [ALPM] upgraded lib32-gcc-libs (5.3.0-3 -> 5.3.0-5)
      [2016-03-16 15:29] [ALPM] upgraded gcc-libs-multilib (5.3.0-3 -> 5.3.0-5)
      [2016-03-16 15:29] [ALPM] upgraded libcap (2.24-2 -> 2.25-1)
      [2016-03-16 15:29] [ALPM] upgraded binutils (2.25.1-3 -> 2.26-3)
      [2016-03-16 15:29] [ALPM] upgraded gcc-multilib (5.3.0-3 -> 5.3.0-5)
      [2016-03-16 15:29] [ALPM] upgraded libcups (2.1.2-3 -> 2.1.3-1)
      

      binutils 可能是罪魁祸首? (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=808206)

      另见https://groups.google.com/d/msg/android-x86/U1XpL0tUpqw/y4W3wRCdJgAJ ...

      【讨论】:

      • 那么您是否以某种方式修复了它?我最近对 ​​Arch 上的 Lollipop 也有同样的问题。
      • 我也偶然发现了这个 debian 错误报告:gcc-5 和 gcc-4.9 都会发生这种情况。降级 libc6 将修复它。经过一番摆弄后,我意识到升级到 binutils =2.25.90.20151209-1 (目前是 sid 中​​的最新版本)可以修复它。 IE。使用最新的 libc6 和最新的 binutils 软件包,一切正常。 我的构建系统是 arch linux 主机上的 ubuntu 16.10 容器,它没有使用受影响的版本之一。但是 Android 构建系统正在从它自己的预构建目录(gcc 4.6、glibc 2.11)中选择他的链接器。 那么:我们如何在 Android 中使用系统范围的构建工具?
      • 据我了解,使用 docker 可以帮助设置构建时间环境:github.com/justfortherec/fairphone2-build-env 虽然我自己没有使用过,但可能我会尝试一下,因为数量无穷无尽从源代码构建 FP2 Android 的错误,这应该是一个完美的过程。但我并不感到惊讶,因为我已经遇到了在 Arch Linux 上构建 CM 之类的问题,然后我明白下次我会在推荐的环境(Ubuntu)中构建,但这似乎还不够。那么 docker 是我们的未来吗? ;)
      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多