ARM64位平台如何跑32位可执行程序

1、配置linux kernel

使kernel支持在EL0上运行32位可执行程序:(arch/arm64/Kconfig中)

config COMPAT
    bool "Kernel support for 32-bit EL0"
    depends on ARM64_4K_PAGES || EXPERT
    select COMPAT_BINFMT_ELF if BINFMT_ELF
    select HAVE_UID16
    select OLD_SIGSUSPEND3
    select COMPAT_OLD_SIGACTION
    help
      This option enables support for a 32-bit EL0 running under a 64-bit
      kernel at EL1. AArch32-specific components such as system calls,
      the user helper functions, VFP support and the ptrace interface are
      handled appropriately by the kernel.

      If you use a page size other than 4KB (i.e, 16KB or 64KB), please be aware
      that you will only be able to execute AArch32 binaries that were compiled
      with page size aligned segments.

      If you want to execute 32-bit userspace applications, say Y.

具体是在:Userspace binary formats --> Kernel support for 32-bit EL0,如下图

ARM64位平台如何跑32位可执行程序_第1张图片

 然后重新编译内核烧写进开发板(不过这些配置一般缺省配置就已经配好了,一般不用我们make menuconfig去配置)

2、配置根文件系统

这一步需要视情况而定,如果32位的可执行程序采用的是静态链接的,那么此时应该就可以直接运行。如果采用的是动态链接,那么就需要专门的设置了。

1)最简单粗暴的方法,现在当面rootfs的根目录的/lib目录下创建一个目录arm-linux-gnueabihf(名称可以自定义),然后找一台32位的arm平台例如一个i.mx6u的开发板,把它的根目录下的lib目录下的全部文件复制粘贴到当前平台的新建的arm-linux-gnueabihf目录下,注意所有软链接也要复制过去。

2)再查看要运行的可执行程序到底是属于什么平台什么类型的文件:fiel  文件名称如下图所示,特别注意画线的/lib/ld-linux-armhf.so.3。 

ARM64位平台如何跑32位可执行程序_第2张图片

进入/lib目录,在其中创建一个指向/lib/arm-linux-gnueabihf/ld-linux-armhf.so.3的软连接:ld-linux-armhf.so.3 ,如果用file 查询的结果是/lib/ld-linux.so.3.0,那你就创建一个指向/lib/arm-linux-gnueabihf/ld-linux-so.3.0的软链接:ld-linux.so.3 (创建软连接的命令 ln -s 源目录  软连接)。

此外,还要注意修改/etc/ld.so.conf配置文件,把新加的动态库的路径添加进去,最后特别注意一点是修改好配置文件后要运训一下:sudo ldconfig命令,将动态库路径更新到系统的缓冲文件下,这样以后系统启动就可以直接使用所添加的动态库了。

如果你的开发板上跑的是ubuntu你也可以直接使用sudo apt-get install ia32-libs命令,让系统自动为你安装相应的包,创建软链接,不过基本也是把上面的那些步骤。

3)如果可执行程序test需要依赖一个第三方动态库(.so文件),设置LD_LIBRARY_PATH环境变量,将第三方.so的路径添加到其中:export LD_LIBRARY_PATH=第三方动态库路径。

4)运行可执行程序test进行测试。

你可能感兴趣的:(linux,嵌入式硬件,ubuntu)