实战 WSL2.0 arm 交叉工具链 — 踩坑交叉编译不兼容问题

本文详细记录了在WSL2.0环境下进行ARM交叉编译遇到的不兼容问题,包括目标终端异常、CPU卡顿和用户权限问题。通过问题定位和解决,最终发现使用VMware Linux平台编译可以避免这些问题,推测可能与WSL2.0的Linux兼容性有关。

实战 WSL2.0 arm 交叉工具链 — 踩坑交叉编译不兼容问题

环境

  • 交叉编译器: 在 VMware UBUNTU 18.04 x64WSL 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 x64WSL 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     0 FUNC    GLOBAL DEFAULT  UND _ZN6Daemon25GetAndCaching
        
### 在WSL中下载和安装适用于Windows与ARM架构的交叉编译工具 #### 1. 安装WSL及基础环境 在开始配置交叉编译环境之前,需要确保已经正确安装了WSL(Windows Subsystem for Linux)。可以通过以下命令更新系统并安装必要的软件包: ```bash sudo apt-get update sudo apt-get install g++ libfftw3-dev libfftw3-single3 libopenblas-dev ``` 此操作将为交叉编译环境准备必要的开发工具和库[^5]。 #### 2. 下载交叉编译工具链 可以从ARM官方网站下载适合的交叉编译工具链。例如,使用GNU Arm Embedded Toolchain: ```bash wget https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads ``` 下载完成后解压工具链到指定目录: ```bash tar -xvf gcc-arm-none-eabi-<version>-<platform>.tar.bz2 -C /opt/ ``` 确保将工具链路径添加到系统的`PATH`环境变量中: ```bash export PATH=$PATH:/opt/gcc-arm-none-eabi-<version>/bin/ ``` 这样可以方便地调用交叉编译工具[^4]。 #### 3. 配置交叉编译环境 在进行交叉编译时,通常需要指定目标架构和交叉编译前缀。例如,对于ARM架构的目标设备,可以使用以下命令进行配置: ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- ``` 如果使用的是Buildroot生成的工具链,则需要调整路径和前缀: ```bash export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- ``` 上述命令会根据指定的架构和工具链完成编译过程[^3]。 #### 4. 测试交叉编译环境 为了验证交叉编译环境是否配置成功,可以尝试编译一个简单的测试程序。创建一个名为`test.c`的文件: ```c #include <stdio.h> int main() { printf("Hello, ARM World!\n"); return 0; } ``` 然后使用交叉编译器进行编译: ```bash arm-linux-gnueabihf-gcc test.c -o test ``` 如果编译成功且生成的二进制文件可以在目标ARM设备上运行,则说明交叉编译环境配置正确[^3]。 ### 注意事项 - 确保WSL版本为WSL2以获得更好的性能和支持。 - 如果遇到权限问题,可能需要使用`sudo`提升权限。 - 工具链版本应与目标设备的内核和库版本兼容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值