在ARM64位开发板上兼容ARM32位的可执行程序

摘要:
主体1。配置linuxkernel以使内核能够在EL0上运行32位可执行程序:configCOMPATpool“Kernelsupport for 32位EL0”dependent ARM64_ 4K_ PAGES | | EXPERTselectCOMPAT_BINFMT_ELFifBINFMT_ELFselectHAVE_ UID16selectOLD_SIGSUSPEND_SELD_SIGACTIONhelp此选项支持32位EL0runningundera64位kernelatEL1.AArch32-specificcomponentssystemcalls,用户帮助函数、VFP支持和跟踪接口由内核适当处理。如果您使用的是4KB以外的页面,请注意,您只能执行用页面大小对齐的段重新编译的AArch32二进制文件。如果您想执行32位用户空间应用程序,SayY。具体来说,在Userspacebinaryformats-˃Kernelsupport_32-bitEL0中,然后重新编译内核2,根据情况配置根文件系统。如果32位可执行程序是静态链接的,那么此时应该可以直接运行。

 

邮箱:pengdonglin137@163.com

参考:https://stackoverflow.com/questions/1706328/how-do-shared-libraries-work-in-a-mixed-64bit-32bit-system

概述

  在嵌入式开发时,经常会通过编译busybox来制作rootfs,然后在上面跑可执行程序。那么如何通过修改配置,让一个rootfs同时兼容32位和64位的可执行程序呢?

  我们知道,如果EL1运行在64位时,那么EL0既可以运行在64位,也可以运行在32位。具体到这里,我们让内核运行在64位(EL1),然后在EL0运行64位或者32位的可执行程序,在加载32位的可执行程序时,会先陷入Linux内核(EL1),然后通过解析elf文件发现EL0要运行在32位模式,那么在eret异常返回到EL0时会通过SPSR将当前cpu切到32位模式运行。

在ARM64位开发板上兼容ARM32位的可执行程序第1张

正文

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

然后重新编译内核

2、配置根文件系统

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

  • 在rootfs的根目录下创建/lib32目录,然后将要用到的32位的动态库拷贝到其中
  • 设置LD_LIBRARY_PATH环境变量,将刚才的路径添加到其中:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib32
  • 进入/lib目录,在其中创建一个指向/lib32/ld-linux-armhf.so.3的软连接:ld-linux-armhf.so.3

在ARM64位开发板上兼容ARM32位的可执行程序第2张

3、测试

  • 运行32位可执行程序

在64位系统里运行一个32位的测试程序:

在ARM64位开发板上兼容ARM32位的可执行程序第3张

然后可以查看其虚拟内存地址分配

在ARM64位开发板上兼容ARM32位的可执行程序第4张

  • 运行64位可执行程序

在ARM64位开发板上兼容ARM32位的可执行程序第5张

 查看其地址分配:

在ARM64位开发板上兼容ARM32位的可执行程序第6张

完。

免责声明:文章转载自《在ARM64位开发板上兼容ARM32位的可执行程序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇记一次真实的webpack优化经历mysql驱动与数据库及jdk各版本对应关系下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

ArcGIS地图打印设置

业务流程是首先框定要打印的地图范围,这是一个自定义大小。选择帧后,预览帧,然后选择打印输出。在打印输出界面中设置后,HP绘图仪将打印地图。因此,确定该问题与ArcGIS无关,属于打印地图设置问题。...

git 系列4(文件提交历史)

1查看文件提交历史记录。如果gitlog命令默认不使用任何参数,gitlog将提交时间中列出的所有更新,最新的更新位于顶部;每次更新都有一个SHA-1校验和、作者的姓名和电子邮件地址以及提交时间。提交说明通过在末尾缩进一段来显示——Stat显示每次更新的文件修改统计信息。您还可以给出几个搜索条件并列出符合条件的提交——提交者只显示与指定提交者相关的提交。...

JAVA 实现CLOB转String

CLOB定义了用于在数据库中保存文件的类型。SQLCLOB是一种内置类型,它将一个大型字符对象作为列值存储在数据库表的一行中。默认情况下,驱动程序使用SQLlocator实现Clob对象,这意味着Clob对象包含指向SQLCLOB数据的逻辑指针,而不是数据本身。Clob对象在其创建的事务期间有效。在一些数据库系统中,文本也用作CLOB的别名。例如,SQL S...

AirtestIDE基本功能(二)

文件菜单-相应工具栏上的前四个按钮:新建、打开、保存和另存为新。单击此按钮以选择是否使用创建脚本。air后缀或带有的脚本。py后缀。新脚本将初始化代码,以帮助您从API引入Airtest的各种接口,并自动初始化设备。你可以看到。air脚本文件实际上是一个公用文件夹,其中放置了通过IDE捕获的图像和运行日志。软件关闭时,布局信息将自动保存。(3) 选项-设置设...

Django如何安装指定版本

Django的最新版本默认安装为:pipinstalldjangoDjango,然后是版本号:pipinstalldjango==1.11.7如果使用pipinstall库的安装速度较慢,您可以使用豆瓣的图片:pipinstalldjango==1.11.7-ihttp://pypi.douban.com/simple--trusted-hostpypi.d...

VMware虚拟机几个常用文件夹介绍

将在虚拟机系统文件下自动生成三个锁文件。虚拟系统正常关闭后,VMware将解锁,“systemTyep.vmdk.lck”和“systemType.vmem”文件夹将消失。当RAM运行缓慢时,它会将数据从RAM移动到一个称为“分页文件”的空间。...