交叉编译docker_方舟编译器简明学习笔记13——编译及runtime流程出错情况笔记

a3d260031c8ef36dd10854bc147565b7.png
为了确保整体流程是准确可控稳定的,我从ubuntu16.04安装开始,重新跑了一遍,中途遇到的问题挨个整理一下,然后发出我的解决措施,有的没能解决,希望有的大佬能够不吝解惑。

一、Ark编译流程出错情况

1.核心jar包问题

通过迅雷链接下载下来的是git文件,无法直接使用,我们需要的是jar包,所以还是不能省事,直接在命令窗口git clone操作吧。

c38515102578ef5740a24b36859f434d.png

将下载的jar包按官方要求放到libjava-core文件夹里面。

2.jar核心包转mplt核心包

报错:bash: /local/Ark/src/bin/jbc2mpl: Permission denied

582741fa68d06d988f0666efcd053179.png

原因是没有相应的处理权限,因为该文件夹是手动创建的,不是 mkdir -p命令操作的,因而执行chmod 777给这个文件夹处理一下。

fc4d6b691d5cb105478c1a2c697d2ca8.png

操作是可以操作了,但是挺长一段时间运行后,仍旧没能生成核心包的mplt包,进程还被杀(kill)了。查了一下docker中ubuntu运行日志,进程不是因为内存原因被中断的。

168d98370255357f09e8819b1a036f3c.png

最后我将相应的路径和文件通过chmod 777授权,然后通过/sh模式运行了一下,就没问题了,发现生成文件了,但是文件在根目录下,不是在libjava-core中,这个生成路径对不对得看后续验证了。

626173291cce95a64109645e6b999d92.png

3.用编译完的执行程序编译生成helloworld产品

继续在根目录下,运行以下命令

 source build/envsetup.sh
 make
 cd samples/helloworld/
 make

将sample案例处理一下,生成如下文件和错误

080934538372933e26e073203e18ee9f.png

f7ff28219aef844f6cac0165e347f1a8.png

从史研究员的运行程序看出,java-core.jar和libjava-core.mplt都是在这个文件夹下的,我们都不是,所以将相关的文件拖进去。

a2796f7955e6cd352e33650035f0ac00.png

626173291cce95a64109645e6b999d92.png

运行后错误少了点,但还是有问题,可能是交叉编译器路径问题,我还在解决中。或者是依赖库可能有些版本不对,或者没安装好,我需要回去检查一下。具体问题如下:

root@63aacc7c2119:/local/Ark/samples/helloworld# make
/local/Ark/out/bin/jbc2mpl --mplt /local/Ark/libjava-core/libjava-core.mplt -injar HelloWorld.jar -out HelloWorld
Tid(1678): CHECK/CHECK_FATAL failure: elemType at [../../../jbc2mpl/src/fe_type_manager.cpp:179] Element type is null for Ljava_2Flang_2FString_3B
/local/Ark/build/core/jbc2mpl.mk:2: recipe for target 'HelloWorld.mpl' failed
make: *** [HelloWorld.mpl] Error 1

在知乎查到一个“年轻人不要熬夜”写的帖子,遇到了相同的问题。

9d62901f941ef1fd98f92570024fd891.png

只知道产生问题的原因,要修改却又无从下手。

二、toy-runtime运行出错情况

1.脚本程序中断,未能在install/bin中生成qemu-aarch64执行文件

50cd023babc323145c8dfad03b1e058d.png

阅读脚本文件,并手动模拟脚本运行情况,发现脚本中存在部分文件无法引用的情况,因为有的文件解压后是替身(也就是快捷方式),是有链接的,但是脚本中引用模式会断链。

为此,我只能将脚本中的-target(目的是实现所需部分的编译)删掉,完成全部编译,然后再从生成的编译文件中找到图示文件

cc284715c931be0f17e91df68cb3d45e.png

在里面找到了相关的可执行文件,我将其中文件全部拷贝到pacific下的install/bin文件夹下,解决qemu-arrch64执行文件的问题。

d67e180df8ab00070fdf361c59b31375.png

2.make sample遇到问题及解决

458c6c21ba110dd5eec047be7a1817fb.png

这次make sample也没有那么顺利,反馈出现了如下问题

8e84a261b205a7d17886334838b8eae2.png

问题是src下面明明有pacific.c文件,为何没法loading载入?

然后我去读了makefile的内容,同样进行手动逐项模拟操作,从上面的sample可以看出,在多了一个obj文件,是make出来的,这一步是走完了的。

其中关于sample的代码如下,也就是第一步是走了的,第二步qemu无法载入pacific文件

sample:
	$(Q)$(CROSS_AARCH64_GCC) -c $(top_dir)/sample/HelloWorld.VtableImpl.s -o $(top_dir)/sample/HelloWorld.VtableImpl.o
	$(Q)$(CROSS_AARCH64_QEMU) $(top_dir)/src/pacific $(top_dir)/sample/HelloWorld.VtableImpl.o $(ENTRY_ADDR) $(V)

再去找pacific部分的执行脚本,和src下面的文件情况:

pacific:
	$(CROSS_AARCH64_GCC) -O2 -std=gnu99 
	-Wl,-rpath=$(top_dir)/prebuilt/aarch64 
	-Wl,-dynamic-linker=$(top_dir)/prebuilt/aarch64/ld-linux-aarch64.so.1 
	$(top_dir)/src/pacific -o $(top_dir)/src/pacific

cddd1a6abcc446367207c3d0fa1ac281.png

说明其中-o部分脚本,并没有输出形成新的pacific.o文件,那么就说明这里的GCC引用地址对应的aarch64-linux-gnu有问题,用aarch64-linux-gnu -v查了一下版本,果然不是gcc-8-aarch64-linux-gnu这里的version8 版本,得要更新一下软件源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值