实战 WSL2.0 arm 交叉工具链 — 踩坑交叉编译不兼容问题
环境
- 交叉编译器: 在
VMware UBUNTU 18.04 x64
及WSL 2.0 UBUNTU 20.04 x64
(非 docker 环境) 中安装的都是arm-linux-gnueabihf-4.9.4-2017.01-linaro
这款编译器,从官网下载的安装包gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
- 目标终端: 内核及文件系统,是平台组 VMware UBUNTU 18.04 x64 平台下
gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf.tar.xz
交叉编译的
问题描述
- 绝大多数情况下,目标终端看起来正常,然而,总有少量的机器表现莫名其妙地异常
- 在偶尔出现问题的终端中,起初没有发现有什么异常,仔细分析之后发现有低概率“CPU貌似卡顿”的现象
- 模拟测试时,发现 WSL 2.0 (非 docker 环境) 中发布的安装包,以 root 用户远程升级之后的用户名和组居然不是 root 帐户
- 加入进程内存、CPU运行状态跟踪监控代码,某些出现问题的终端每运行1小时会耗尽内存
问题解决
- 从代码分析上找不到原因的情况下,试着从 root 帐户的问题入手,试着看看是不是平台的问题。从
VMware UBUNTU 18.04 x64
平台编译打包,居然发现 root 帐户问题神奇消失 - 从
VMware UBUNTU 18.04 x64
交叉编译和打包发布,疑似的“CPU卡顿”问题消失
问题溯源
-
删除临时文件,纯净交叉编译项目中的守护进程,然后
arm-linux-gnueabihf-readelf
导出VMware UBUNTU 18.04 x64
及WSL 2.0 UBUNTU 20.04 x64
编译的目标文件信息,发现些微差别VMware UBUNTU 18.04 x64
平台Unwind table index '.ARM.exidx' at offset 0x12fc contains 8 entries: 0x10e68: 0x1 [cantunwind] 0x10f48: @0x112cc // 仅 VMware UBUNTU 18.04 x64 Compact model index: 1 0x97 vsp = r7 0x0d vsp = vsp + 56 0x84 0x08 pop { r7, r14} 0xb0 finish 0xb0 finish 0x10fb4: 0x80978008 // 仅 VMware UBUNTU 18.04 x64 Compact model index: 0 0x97 vsp = r7 0x80 0x08 pop { r7} 0x10fcc: @0x112d8 Compact model index: 1 0x97 vsp = r7 0x03 vsp = vsp + 16 0x84 0x08 pop { r7, r14} 0xb0 finish 0xb0 finish 0x10ff8: @0x112e4 Compact model index: 1 0x97 vsp = r7 0x0a vsp = vsp + 44 0x84 0x09 pop { r4, r7, r14} 0xb0 finish 0xb0 finish 0x1116c: @0x112f0 // 仅 VMware UBUNTU 18.04 x64 Compact model index: 1 0x97 vsp = r7 0x01 vsp = vsp + 8 0x84 0x08 pop { r7, r14} 0xb0 finish 0xb0 finish 0x111b4: 0x80978408 // 仅 VMware UBUNTU 18.04 x64 Compact model index: 0 0x97 vsp = r7 0x84 0x08 pop { r7, r14} 0x111c4: 0x1 [cantunwind] Symbol table '.dynsym' contains 54 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 0001133c 0 NOTYPE LOCAL DEFAULT 17 __exidx_end 2: 000112fc 0 NOTYPE LOCAL DEFAULT 16 __exidx_start 3: 00021528 4 OBJECT GLOBAL DEFAULT 25 g_sys_res_ctor 4: 00000000 0 FUNC GLOBAL DEFAULT UND sync@GLIBC_2.4 (2) 5: 00000000 0 FUNC GLOBAL DEFAULT UND __aeabi_atexit@CXXABI_ARM_1.3.3 (3) 6: 00000000<