×
单片机 > 单片机程序设计 > 详情

交叉编译Python-2.7.13到ARM(aarch32)平台

发布时间:2020-08-31 发布时间:
|

环境

主机: ubuntu14.04 64bit


开发板: qemu + vexpress-a9 


工具链: arm-none-linux-gnueabi-gcc  (gcc version 4.8.3 20140320)


Python版本: Python-2.7.13


回到顶部(go to top)

参考



回到顶部(go to top)

正文

1、下载解压python源码

到https://www.python.org/downloads/下载最新的python2系列的软件,这里我用的是Python-2.7.13


1 #解压

2 tar -xf Python-2.7.13.tar.xz

4 #创建python2_7_13_for_x86_64

5 mkdir python2_7_13_for_x86_64

7 #创建python2_7_13_for_arm

8 mkdir python2_7_13_for_arm


2、编译x86_64版本的python软件

我把编译过程写成了脚本, 进入python2_7_13_for_x86_64/目录,然后执行如下脚本:


配置 mk1_conf.sh


1 #!/bin/bash

3 ../Python-2.7.13/configure --prefix=`pwd`

编译mk2_make.sh


1 #!/bin/bash

3 make -j4

安装 mk3_install.sh


1 #!/bin/bash

3 make install

3、交叉编译

交叉编译的第一步是为python源码打上交叉编译用的patch:Python-2.7.13-compile.patch.tar.gz


1 cd Python-2.7.13/

2 patch -p1 < ../python2_7_13_for_arm/Python-2.7.13-xcompile.patch

我也把编译过程放到脚本,也分为三个:


配置 mk1_conf.sh


1 #!/bin/bash

2 export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH

3 ../Python-2.7.13/configure --prefix=`pwd`

4     --host=arm-none-linux-gnueabi

5     --build=x86_64-linux-gnu

6     --enable-ipv6

7     --enable-shared

8     ac_cv_file__dev_ptmx="yes"

9     ac_cv_file__dev_ptc="no"


编译 mk2_make.sh


 1 #!/bin/bash

 2 export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH

 3 make HOSTPYTHON=../python2_7_13_for_x86_64/python

 4     HOSTPGEN=../python2_7_13_for_x86_64/Parser/pgen

 5     BLDSHARED="arm-none-linux-gnueabi-gcc -shared"

 6     CROSS_COMPILE=arm-none-linux-gnueabi-

 7     CROSS_COMPILE_TARGET=yes

 8     HOSTARCH=arm-none-linux-gnueabi

 9     BUILDARCH=x86_64-linux-gnu

10     -j4


安装 mk3_install.sh


1 #!/bin/bash

2 export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH

3 make install HOSTPYTHON=../python2_7_13_for_x86_64/python

4     BLDSHARED="arm-none-linux-gnueabi-gcc -shared"

5     CROSS_COMPILE=arm-none-linux-gnueabi-

6     CROSS_COMPILE_TARGET=yes

7     prefix=`pwd`

4、重新制作ramdisk镜像

参考博文:用Qemu搭建aarch32学习环境


修改mk_ramdisk.sh如下:


 1 #!/bin/bash

 2 sudo rm -rf rootfs

 3 sudo rm -rf tmpfs

 4 sudo rm -rf ramdisk*

 5 sudo mkdir rootfs

 6 sudo cp ../busybox-1.24.2/_install/*  rootfs/ -raf

 7 sudo mkdir -p rootfs/proc/

 8 sudo mkdir -p rootfs/sys/

 9 sudo mkdir -p rootfs/tmp/

10 sudo mkdir -p rootfs/root/

11 sudo mkdir -p rootfs/var/

12 sudo mkdir -p rootfs/mnt/

13 sudo cp etc rootfs/ -arf

14 sudo cp -arf ../arm-2014.05/arm-none-linux-gnueabi/libc/lib rootfs/

15 sudo rm -rf rootfs/lib/*.a

16 sudo /home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin/arm-none-linux-gnueabi-strip rootfs/lib/*

17 # 拷贝python相关的文件到根文件系统中

18 sudo mkdir -p rootfs/usr

19 pushd rootfs/usr

20 sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/python2_7_13_for_arm/lib .

21 sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/python2_7_13_for_arm/include .

22 sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/python2_7_13_for_arm/bin .

23 sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/python2_7_13_for_arm/share .

24 sudo /home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin/arm-none-linux-gnueabi-strip lib/python*

25 popd

26 sudo mkdir -p rootfs/dev/

27 sudo mknod rootfs/dev/tty1 c 4 1

28 sudo mknod rootfs/dev/tty2 c 4 2

29 sudo mknod rootfs/dev/tty3 c 4 3

30 sudo mknod rootfs/dev/tty4 c 4 4

31 sudo mknod rootfs/dev/console c 5 1

32 sudo mknod rootfs/dev/null c 1 3

33 sudo mkdir -p rootfs/lib/modules/4.10.0+

34 sudo mkdir -p rootfs/tools

35 sudo cp ./other_tools/* rootfs/tools

36 # 将ramdisk的大小扩展为100MB

37 sudo dd if=/dev/zero of=ramdisk bs=1M count=100

38 sudo mkfs.ext4 -F ramdisk

39 sudo mkdir -p tmpfs

40 sudo mount -t ext4 ramdisk ./tmpfs/  -o loop

41 sudo cp -raf rootfs/*  tmpfs/

42 sudo umount tmpfs

43 sudo gzip --best -c ramdisk > ramdisk.gz

44 sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img


这里需要注意:


1、将刚才交叉编译python所得的文件拷贝到rootfs/usr下面: bin、lib、include和share


2、由于Python的lib目录占用了很大空间,有70MB左右,所以这里我们把ramdisk的大小设置为100MB


3、此外,qemu-system-arm运行的,可以给-m设置较大的物理内存,这里我设置的是1GB


5、修改kernel配置

修改ramdisk的大小设置, 这里我设置的是100MB:


1 Device Drivers  ---> 

3         [*] Block devices  --->

5                 (102400) Default RAM disk size (kbytes) 

6、测试

制作好ramdisk以及编译出新的kernel后,运行系统:


 1 sudo qemu-system-arm

 2     -M vexpress-a9

 3     -m 1024M

 4     -smp 2

 5     -kernel ./linux-4.10/out_aarch32/arch/arm/boot/zImage

 6     -nographic

 7     -append "root=/dev/ram0 rw rootfstype=ext4 console=ttyAMA0 init=/linuxrc ignore_loglevel"

 8     -initrd ./rootfs/ramdisk.img

 9     -net nic,vlan=0 -net tap,vlan=0,ifname=tap0

10     -dtb ./linux-4.10/out_aarch32/arch/arm/boot/dts/vexpress-v2p-ca9.dtb


下面是启动log:


  1 $./run.sh 

  2 sudo tunctl -u root -t tap0

  3 TUNSETIFF: Device or resource busy

  4 sudo ifconfig tap0 0.0.0.0 promisc up

  5 sudo brctl addif br0 tap0

  6 brctl show

  7 bridge name    bridge id        STP enabled    interfaces

  8 br0        8000.480fcf3ace87    no        eth0

  9                             tap0

 10 docker0        8000.02423772cc85    no        

 11 [    0.000000] Booting Linux on physical CPU 0x0

 12 [    0.000000] Linux version 4.10.0+ (pengdonglin@pengdonglin-HP) (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29) ) #10 SMP Mon Mar 20 11:31:00 CST 2017

 13 [    0.000000] CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d

 14 [    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache

 15 [    0.000000] OF: fdt:Machine model: V2P-CA9

 16 [    0.000000] debug: ignoring loglevel setting.

 17 [    0.000000] Memory policy: Data cache writealloc

 18 [    0.000000] On node 0 totalpages: 262144

 19 [    0.000000] free_area_init_node: node 0, pgdat c0a637c0, node_mem_map ef7fa000

 20 [    0.000000]   Normal zone: 1536 pages used for memmap

 21 [    0.000000]   Normal zone: 0 pages reserved

 22 [    0.000000]   Normal zone: 196608 pages, LIFO batch:31

 23 [    0.000000]   HighMem zone: 65536 pages, LIFO batch:15

 24 [    0.000000] percpu: Embedded 14 pages/cpu @ef7b5000 s27648 r8192 d21504 u57344

 25 [    0.000000] pcpu-alloc: s27648 r8192 d21504 u57344 alloc=14*4096

 26 [    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 

 27 [    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 260608

 28 [    0.000000] Kernel command line: root=/dev/ram0 rw rootfstype=ext4 console=ttyAMA0 init=/linuxrc ignore_loglevel

 29 [    0.000000] log_buf_len individual max cpu contribution: 4096 bytes

 30 [    0.000000] log_buf_len total cpu_extra contributions: 12288 bytes

 31 [    0.000000] log_buf_len min size: 16384 bytes

 32 [    0.000000] log_buf_len: 32768 bytes

 33 [    0.000000] early log buf free: 14860(90%)

 34 [    0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)

 35 [    0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)

 36 [    0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)

 37 [    0.000000] Memory: 1007212K/1048576K available (6144K kernel code, 453K rwdata, 1440K rodata, 1024K init, 191K bss, 41364K reserved, 0K cma-reserved, 262144K highmem)

 38 [    0.000000] Virtual kernel memory layout:

 39 [    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)

 40 [    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)

 41 [    0.000000]     vmalloc : 0xf0800000 - 0xff800000   ( 240 MB)

 42 [    0.000000]     lowmem  : 0xc0000000 - 0xf0000000   ( 768 MB)

 43 [    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)

44 [ 0.000000] modules : 0xbf000000 -


关键字:交叉编译  Python-2  7  13  ARM  aarch32

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向