历史上的今天
返回首页

历史上的今天

今天是:2025年02月09日(星期日)

正在发生

2020年02月09日 | 交叉编译Python-2.7.13到ARM(aarch32)平台

2020-02-09 来源:eefocus

环境

主机: ubuntu14.04 64bit


开发板: qemu + vexpress-a9 (参考: http://www.cnblogs.com/pengdonglin137/p/6442583.html)


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


Python版本: Python-2.7.13


回到顶部(go to top)

参考

http://www.41443.com/HTML/Python/20151105/414154.html


http://www.cnblogs.com/tolimit/p/4519838.html?utm_source=tuicool&utm_medium=referral


回到顶部(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 - 0xbfe00000   (  14 MB)

 45 [    0.000000]       .text : 0xc0008000 - 0xc0700000   (7136 kB)

 46 [    0.000000]       .init : 0xc0900000 - 0xc0a00000   (1024 kB)

 47 [    0.000000]       .data : 0xc0a00000 - 0xc0a71784   ( 454 kB)

 48 [    0.000000]        .bss : 0xc0a73000 - 0xc0aa2c4c   ( 192 kB)

 49 [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1

 50 [    0.000000] Hierarchical RCU implementation.

 51 [    0.000000]     Build-time adjustment of leaf fanout to 32.

推荐阅读

史海拾趣

Eutech公司的发展小趣事

在全球化的浪潮下,EUtech公司积极寻求国际合作。他们与德国的氢探新能源公司建立了长期稳定的合作关系,共同研发燃料电池系统控制技术。通过共享资源、互补优势,双方不仅提高了产品的竞争力,还推动了整个行业的技术进步。

EPIC公司的发展小趣事

1998年,Epic Games发布了一款名为“虚幻”的3D第一人称射击游戏。这款游戏不仅游戏内容新颖,更引人注目的是它背后完全自主开发的3D游戏引擎。这个引擎后来被称为“虚幻引擎”,并成为了Epic Games的核心技术之一。随着游戏的成功,虚幻引擎也逐渐受到了业界的关注。许多其他游戏开发商开始采用这款引擎来开发自己的游戏,从而使得Epic Games在游戏引擎领域取得了显著的商业成功。

CITIZEN公司的发展小趣事

随着技术的不断进步和产品的不断创新,西铁城公司开始积极拓展全球市场。公司的产品以其高品质、精确度和创新技术而闻名,逐渐赢得了全球消费者的青睐。同时,公司也积极参与国际性的钟表展会和活动,通过展示最新产品和技术成果,进一步提升品牌知名度和影响力。这一系列的举措使得西铁城在全球市场上的地位日益稳固。

Green Solution Technology Co Ltd公司的发展小趣事

在20世纪中叶,西铁城公司迎来了一次重要的技术突破。1956年,公司成功研制出防震手表,并通过了空中坠表实验,这一创新轰动了整个行业。防震手表的推出不仅提升了西铁城产品的品质,也进一步巩固了其在全球腕表市场中的地位。这一技术的成功应用,也显示了西铁城在精密加工和测量技术方面的实力。

General Transistor Corp公司的发展小趣事

为了进一步巩固市场地位和提升竞争力,GTC开始实施并购整合战略。公司通过收购具有技术优势和市场潜力的企业,实现了技术、产品和市场的快速扩张。同时,GTC还积极寻求战略转型,从单一的电子元器件分销商和生产商向综合性电子解决方案提供商转变。这一战略转型为公司带来了新的增长点和发展机遇。

Custom Components Inc公司的发展小趣事

随着全球环保意识的不断提高,电子行业对绿色环保和可持续发展的要求也日益严格。CCI积极响应这一趋势,将绿色环保理念融入公司的战略规划和日常运营中。

公司不仅采用了环保材料和绿色生产工艺来降低产品对环境的影响,还通过优化生产流程和资源利用等方式降低能耗和排放。此外,CCI还积极参与行业环保组织和公益活动,推动整个行业向更加绿色、环保的方向发展。

问答坊 | AI 解惑

智能功率开关:在汽车环境中应用

智能功率开关(IPS)在汽车应用环境中特别受欢迎,在这类环境里这些开关必须处理一些最恶劣的电器故障---包括地线丢失或偏移,电压尖峰,反接或电池开路以及负载突变。IPS 驱动从功率继电器和电磁阀到电机和灯的这些负载的同时,针对所有这些故障提 ...…

查看全部问答>

美大学研发脑波控制机械臂

美国南佛罗里达大学的研究人员已经开发出了一种可安装在轮椅上的机械臂,这种机械臂通过捕获用户的脑电波进行操作,从而可以帮助残疾人更好的完成日常生活。  这种机械臂的产生将会改变因脊椎受伤而全身瘫痪病人的生活。计算机接口由USF心理学教 ...…

查看全部问答>

debuge相关问题

小弟吐血跪求各位大侠指点迷津 debuge e:\\ASM\\FIRST.EXE -R AX=0000        BX=0000        CX=0113        DX=0000        SP=0000      ...…

查看全部问答>

很简单的问题,构造一个加法器和定时器的问题

突然有个想法,想给自己的汽车作个附件,估计还能开多久 主要是这样想的,一个传感器测量当前油量(夜面高度或者直接读油表) 隔5分钟测量一下,看下去了好多,然后用当前油量除一下,得出时间 但是上学时学得东西忘得差不多了,只记得好像有现 ...…

查看全部问答>

中九又快加密了吧?

反反复复不知何时了结…

查看全部问答>

百分加急freescale M13213 STOP3低功耗问题!

小弟最近在用freescale的M13213芯片做无线控制设备,设备有低功耗要求,为了满足要求,我使用了STOP3工作模式,用户手册给出的功耗是2UA,但是实际测试的时候发现有好几百UA,差别实在是太大了,查了多方的原因都没有找出根源。我测试STOP1,STOP2模 ...…

查看全部问答>

Import BSPs的问题,参与者有分!!!

如题: BSPs包为ep931x文件 我把BSPs的压缩包放在F:\\WINCE420\\PLATFORM的目录下,注(F:\\WINCE420是不是就是%WINCEROOT% ???) 然后在Manage   Catalog   Features  Import F:\\WINCE420\\PLATFORM\\ep931x 下 ...…

查看全部问答>

关于430IO口接收中断问题

我做了一块板子,不过当时没注意把需要产生中断的管脚接到430的P5口上了,可是P5口好像没有接收中断,板子太小不好飞线,我该怎么补救啊…

查看全部问答>

我的串行口联在电脑上怎么不显示呢?

我这怎么办呢  急求  谢谢这位了 就是显示说我的驱动软件没有安装好   卸了从装还是这样的…

查看全部问答>