【问题标题】:Cross Compile perl for ARM为 ARM 交叉编译 perl
【发布时间】:2011-07-24 18:52:32
【问题描述】:

我正在尝试交叉编译 ARM 架构的 perl 解释器 (FriendlyARM Micro2440)。我正在使用制造商提供的ARM-Linux GCC 4.4.3 交叉编译器。开发板运行 Linux 2.6。

我能够成功交叉编译一个基本的“Hello World”应用程序,并且它在目标机器上运行。

我已经下载了 perl v5.12.3 源代码。我能够为 Ubuntu 进行正常的 perl 编译。我现在正在尝试对 ARM 板进行交叉编译。我正在处理源下载中的 perl-5.12.3/Cross 文件夹。

make patch 成功了,但是当我运行 make perl 时它失败了

LD_LIBRARY_PATH=/home/reed022/.local/share/Trash/files/perl-5.2.12.3 arm-linux-gcc  -o miniperl \
        gv.o toke.o perly.o pad.o regcomp.o dump.o util.o mg.o reentr.o mro.o hv.o av.o run.o pp_hot.o sv.o pp.o scope.o pp_ctl.o pp_sys.o doop.o doio.o regexec.o utf8.o taint.o deb.o universal.o globals.o perlio.o perlapi.o numeric.o mathoms.o locale.o pp_pack.o pp_sort.o   \
        miniperlmain.o opmini.o perlmini.o -lnsl -ldl -lm -lcrypt -lutil -lc 
LD_LIBRARY_PATH=/home/reed022/.local/share/Trash/files/perl-5.2.12.3  ./miniperl -w -Ilib -MExporter -e '<?>' || make minitest
./miniperl: 1: Syntax error: word unexpected (expecting ")")

我认为输出的相关部分是./miniperl -w -Ilib -MExporter -e '&lt;?&gt;' || make minitest 部分。虽然我不确定。交叉编译环境会尝试运行测试,这让我感到困惑,因为它的目标系统与构建它的系统不同。

我完全不知道从这里去哪里。与我交谈过的人在交叉编译程序方面没有太多经验。

更新
我决定删除 perl 源文件夹并重新提取它,认为之前为 Ubuntu 主机编译的 perl 可能与当前的交叉编译有冲突。我现在遇到了一个不同但类似的错误。

`sh  cflags "optimize='-O2'" generate_uudmap.o` -fexpensive-optimizations -fomit-frame-pointer -O2 -march=armv4 -mtune=strongarm1100 generate_uudmap.c
      CCCMD =  arm-linux-gcc -DPERL_CORE -c  -fexpensive-optimizations -fomit-frame-pointer -O2 -march=armv4 -mtune=strongarm1100  -O2 -Wall 
arm-linux-gcc -o generate_uudmap  generate_uudmap.o -lnsl -ldl -lm -lcrypt -lutil -lc 
./generate_uudmap uudmap.h bitcount.h
./generate_uudmap: 1: Syntax error: word unexpected (expecting ")")
make[1]: *** [bitcount.h] Error 2
make[1]: Leaving directory `/home/reed022/Downloads/perl-5.12.3'
make[1]: Entering directory `/home/reed022/Downloads/perl-5.12.3'
make[1]: *** No rule to make target `more'.  Stop.
make[1]: Leaving directory `/home/reed022/Downloads/perl-5.12.3'
make: *** [perl] Error 2

【问题讨论】:

  • 从未成功过,但您可能想查看 OpenEmbedded 项目。它们提供了用于创建嵌入式 Linux 发行版的构建框架。 wiki.openembedded.net/index.php/Main_Page
  • makefile 显然试图在您的(英特尔?)构建机器上运行您的 ARM 二进制文件。 (我猜这个幻数与任何已知的可执行文件类型都不匹配,所以 shell 尝试将它作为 shell 脚本运行并给出你看到的奇怪错误)。您的交叉编译设置一定有问题。

标签: perl cross-compiling


【解决方案1】:

为 arm 交叉编译 perl 最简单的方法是使用 perl-cross

Alex Suykov 为 perl 开发了一组补丁,可以解决目标机器可用的要求。部分解决方案是避免 make test,因为主机无论如何都无法运行交叉编译的代码。

我使用 arm-unknown-linux-uclibcgnueabi 作为我的目标(以匹配我的 buildroot 工具链),但 perl 5.18.0 的说明工作正常。

Alex 上次更新 github 仓库是在 2014 年 4 月 23 日,所以这个项目还是比较活跃的。

【讨论】:

【解决方案2】:

显然交叉编译perl的方法是不要在Cross目录下进行。我需要将标志传递给 Configure 以进行设置。我还需要使用 SSH 服务器设置 ARM 计算机(我使用了dropbear)。我使用的标志是

sh ./Configure 
    -Dusecrosscompile 
    -Dtargethost=<IP of ARM computer> 
    -Dtargetuser=<user name>
    -Dtargetarch=arm-linux 
    -Dcc=arm-linux-gcc 
    -Dusrinc=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/include/ 
    -Dincpth=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/include/ 
    -Dlibpth=/opt/FriendlyARM/toolschain/4.4.3/lib 
    -Dtargetdir=/sdcard/perl 

【讨论】:

  • 如果需要设置另一台主机/计算机,我们还能谈交叉编译吗?
  • 这是因为 Perl 开发人员有一个很棒的想法,使用 perl 来编译 perl 解释器。这种引导与 gcc 一起工作得很好(在那里交叉编译从来没有任何问题)。而且我认为在另一台计算机上运行的只是测试,但我不记得了。