从源代码构建Android:不支持的重定位43

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

而且制作过程最终失败了:

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,否则make无法启动。

可能出了什么问题?

5个回答

24

对我有用:
在文件/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

1
Makefile的更改非常重要!太棒了发现。 - Royston Pinto
就我个人而言,在构建libcxx和libcxxabi时,我遇到了相同的错误。复制对我来说不起作用(我有“.../ld未找到(可能未安装ld)”,但软链接可以(不知道为什么)。 - autra
cp命令对我来说可行,而无需进行任何其他操作。谢谢! - Chef Pharaoh
对我来说可以。这应该是选定的答案。 - PC.

24

为了让这些东西正常工作,应该应用此补丁https://android-review.googlesource.com/#/c/223100/

在 Android 源代码目录下使用编辑器打开 build/core/clang/HOST_x86_common.mk 文件,并添加这些行,如此链接所述link

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

但是,在 Marshmallow 版本中已删除-no-integrated-as


感谢提供补丁的链接,我使用了git cherry-pick,看起来它可以正常工作(构建仍在进行中,这只是我需要修复的错误之一...等待下一个错误的出现...) - Mixaz
2
请参考@Rémi Cohen-Scali的回答:他提到要清除ccachemake clean构建。 - Christian Rädel

4
问题源于binutils的不兼容更改:添加了一些部分。一些构建平台具有新的binutils,而Android构建树具有旧版本。该错误来自clang调用变量定义。这些变量没有告诉clang使用提供的构建链。然后,clang使用本地构建平台的binutils(这里是/usr/bin/as,而不是预构建的as)。因此,修复需要应用mysticTot指向的补丁,然后删除由工具链生成的所有二进制文件(根据错误出现的位置可能会发生变化,但在out目录中删除所有STATIC_LIBRARIES/SHARED_LIBRARIES/EXECUTABLES等目录应该可以解决问题)。还要删除ccache缓存(因为它存储.o),然后重新构建。 Ov3r1oad提供的修复方法是用本地ld替换预构建的工具链ld,这不是一个解决方案,只是一个解决方法,可能很危险(混合节号不好)。 希望这能帮到您。

3

可以用,谢谢!(我正在Arch Linux上构建cm12.1,Lollipop) - Alexandre Dumont
1
无法在我的Ubuntu 16.04上编译Android 5.1.1_r6。 - Ezio

2
你是否正在使用Arch Linux进行构建?我今天也遇到了同样的问题。我的上一次构建是在3天前,一切都很好。但今天所有的构建都失败了。
我看到管理员在2天前升级了一些软件包,特别是这些:
[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也遇到了同样的问题。 - Ov3r1oad
我也遇到了这个Debian的bug报告:这会发生在gcc-5和gcc-4.9上。降级libc6可以解决问题。经过一些折腾,我意识到升级到binutils =2.25.90.20151209-1(目前sid中最新的)可以解决问题。也就是说,使用最新的libc6和最新的binutils软件包可以解决问题。我的构建系统是在arch linux主机上的ubuntu 16.10容器中,并且没有使用受影响的版本之一。但是Android构建系统正在从其自己的预构建目录中选择链接器(gcc 4.6,glibc 2.11)。那么:我们如何在Android中使用系统范围内的构建工具? - Christian Rädel
据我理解,使用Docker可以帮助设置构建时环境:https://github.com/justfortherec/fairphone2-build-env。虽然我自己没有使用过,但由于从源代码构建FP2 Android存在无数故障,这本来应该是一个无缝的过程,所以我可能会尝试一下。但我并不感到惊讶,因为我之前在Arch Linux上构建CM时就遇到了类似的问题,然后我明白了下次我会在推荐的环境(Ubuntu)中构建,但这似乎还不够。那么,Docker是我们的未来吗? ;) - Mixaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接