Archive

Posts Tagged ‘ARM’

在ARM上移植openssl

November 21st, 2008 BianJiang No comments

移植过程如下:

wget http://www.openssl.org/source/openssl-0.9.8h.tar.gz
tar zxvf openssl-0.9.8h.tar.gz
cd openssl-0.9.8h/
./Configure --prefix=/opt/rootfs/arm/openssl/ os/compiler:arm-linux-gcc

修改Makefile:
把: AR=ar $(ARFLAGS) r 改为:
AR=arm-linux-ar $(ARFLAGS) r

make
make install
border@ubuntu:/opt/rootfs/arm/openssl/bin$ file openssl
openssl: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), not stripped

-Bian Jiang

参考:
  1. http://newinfo.sysu.edu.cn/Snowwaft/?p=70

– EOF –

Categories: Embedded Tags: , ,

Cross Compile SSH Server Dropbear For ARM

August 15th, 2008 BianJiang No comments

编译环境

  • ubuntu 8.04
  • gcc 4.2.3
  • arm_v5t_le-gcc 3.4.3

编译过程

编译zlib:

wget http://www.zlib.net/zlib-1.2.3.tar.gz
tar zxvf zlib-1.2.3.tar.gz
mkdir zlib
cd zlib-1.2.3/
CC=arm_v5t_le-gcc ./configure --prefix=/home/border/work/SMG/build-tools/zlib
make
make install

编译dropbear:

wget http://matt.ucc.asn.au/dropbear/releases/dropbear-0.51.tar.gz
tar zxvf dropbear-0.51.tar.gz
mkdir dropbear-build
cd dropbear-build/
mkdir build
../dropbear-0.51/configure --prefix=/home/border/work/SMG/build-tools/dropbear-build/build/ \
    --with-zlib=/home/border/work/SMG/build-tools/zlib/ CC=arm_v5t_le-gcc --host=arm
make
make scp
sudo make install
sudo cp scp build/bin/

其中的scp需要单独编译,然后用把编译好的scp复制到build/bin目录下。

在交叉编译好的程序要使用 file 之类的工具检查一下是否为目标机器的程序:

border@b0rder:~/work/SMG/build-tools/dropbear-build$ file scp
scp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17,
dynamically linked (uses shared libs), not stripped

编译好的文件目录结构为:

border@b0rder:~/work/SMG/build-tools/dropbear-build/build$ tree
.
|-- bin
|   |-- dbclient
|   |-- dropbearconvert
|   |-- dropbearkey
|   `-- scp
`-- sbin
    `-- dropbear

生成server key:

cd /etc
mkdir dropbear
cd dropbear
dropbearkey -t rsa -f dropbear_rsa_host_key
dropbearkey -t dss -f dropbear_dss_host_key

启动脚本

把build目录拷贝到ARM机器上, 在启动脚步/etc/init.d/rcS中增加:

dropbear

– EOF –

Categories: Embedded Tags: , , ,

Howto-Cross-Compile-Python2.5.2-For-ARM

August 1st, 2008 BianJiang No comments

Cross Compile Python 2.5.2 For ARM

本文排版有问题可以看排版后的: http://wiki.woodpecker.org.cn/moin/Cross_Compile_Python_2.5.2_For_ARM

编译环境:

ubuntu 8.04, gcc 4.2.3, arm_v5t_le-gcc 3.4.3

  1. 下载Python,http://www.python.org/download/ 下载Python源码,我下载的:

    http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar.bz2
  2. 解压:

    tar jxvf Python-2.5.2.tar.bz2
    cd Python-2.5.2
  3. 编译pc版本的语法解析器

由于在编译python的时候,需要先编译一个叫pgen的程序出来,用于生成语法解析器,所以我们要先生成一个pc版本的pgen:

border@b0rder:~/tools/Python-2.5.2$ mkdir build.pc
border@b0rder:~/tools/Python-2.5.2$ cd build.pc/
border@b0rder:~/tools/Python-2.5.2/build.pc$ ../configure
border@b0rder:~/tools/Python-2.5.2/build.pc$ make Parser/pgen

然后ls Parser一下,应该就能看到有pgen了。

  1. 修改../configure

configure在检测编译器的printf是否支持%zd的时候,如果发现是在cross compile,就直接不干活了。这还了得?

把这一部分的检测代码去掉。这段代码起始于:

echo "$as_me:$LINENO: checking for %zd printf() format support" >&5
echo $ECHO_N "checking for %zd printf() format support... $ECHO_C" >&6
if test "$cross_compiling" = yes; then

结束于:

cat >>confdefs.h <<\_ACEOF
#define PY_FORMAT_SIZE_T "z"
_ACEOF

else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

( exit $ac_status )
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi

把这两段以及中间的内容都删除掉就可以了, 我的是从 22496 - 22583 行,不同的版本可能不一样。

  1. 编译arm版本的python

有了语法解析器,就可以开始编译arm版本的python了:

border@b0rder:~/tools/Python-2.5.2/build.pc$ mkdir ../build.arm
border@b0rder:~/tools/Python-2.5.2/build.pc$ cd ../build.arm/
../configure --prefix=/opt/arm-test/rootfs --disable-ipv6 --host=arm_v5t_le --enable-shared

先创建一个用于编译的目录build.arm,再对python做一些配置,如安装目录,不要ipv6,使用arm-linux的编译器,生成动态链接库。

  1. 修改Makefile
  1. 去掉Debug:

    OPT=                -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes

一行中,去掉-g,我们不要debug python,-O3改为-O2,空间紧张O2就可以了。 我的是59行。

  1. 修改PGEN:

    PGEN=           Parser/pgen$(EXE)

一行的下面加上

PGEN_HOST= ../build.pc/Parser/pgen$(EXE)

表明我们在HOST上运行的pgen

c 在要使用PGEN的地方改为PGEN_HOST (494行):

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
                -@ mkdir Include
                -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

改为:

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
                -@ mkdir Include
                -$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

d 修改所有使用新生成的python的地方为本机的python绝对地址.
所有如 ./$(BUILDPYTHON) 的地方,都改为python (为本地的python地址,不要使用刚刚编译生成的./python),
在vim里面使用:

:%s/.\/$(BUILDPYTHON)/\/usr\/bin\/python/g

我的是替换了11处。
如:

platform: $(BUILDPYTHON)
        $(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

改为:

platform: $(BUILDPYTHON)
        $(RUNSHARED)  /usr/bin/python  -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

这种地方比较多,大家小心修改。

如果出这样的错, 说明替换的有问题:

case $MAKEFLAGS in \
        *-s*) LD_LIBRARY_PATH=/home/border/tools/Python-2.5.2/build.arm: CC='arm_v5t_le-gcc' LDSHARED='arm_v5t_le-gcc -shared' OPT='-DNDEBUG -fwrapv -O2 -Wall -Wstrict-prototypes' ./python -E ../setup.py -q build;; \
        *) LD_LIBRARY_PATH=/home/border/tools/Python-2.5.2/build.arm: CC='arm_v5t_le-gcc' LDSHARED='arm_v5t_le-gcc -shared' OPT='-DNDEBUG -fwrapv -O2 -Wall -Wstrict-prototypes' ./python -E ../setup.py build;; \
        esac
/bin/sh: line 2: ./python:无法执行二进制文件

7. 修改setup.py
setup.py负责编译python的各个扩展模块。但是,由于python完全没有考虑cross compile,所以要做一些修改。

PyBuildExt类:
  1. build_extension函数:

    这个函数在编译了所有的extension后,会去load这些刚编译好的extension, 但我们在i686的电脑上显然不能load,所以要跳过这些操作。 在 build_ext.build_extension(self, ext)下一行直接写一个return,不做load。

  1. detect_modules函数:
    • 函数的前两行是把/usr/local加到搜索目录中,我们的cross compiler一般不会直接安装在 /usr/local里面的,所以这两行去掉:

      add_dir_to_list(self.compiler.library_dirs, ‘/usr/local/lib’)
      add_dir_to_list(self.compiler.include_dirs, ‘/usr/local/include’)

      lib_dirs, inc_dirs的设定中,把中括号里的那些都去掉。 以下所有模块都不要:

      cmath, ctypes, _testcapi, pwd, grp, spwd, mmap, audioop, imageop, rgbimg, readline,
      ssl, openssl, bdb, dbm, termios, nsl, ncurses, bz2, linuxaudiodev, ossaudiodev, tkinter

8 main函数

setup函数调用的时候,把要安装的scripts那一部分去掉

之后就可以make && make install了.

  1. 最后在ARM机上执行时如果遇到:

    root@192.168.0.167:~# python2.5
    Could not find platform dependent libraries <exec_prefix>
    Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
    Python 2.5.2 (r252:60911, Jul 31 2008, 18:05:30)
    [GCC 3.4.3 (MontaVista 3.4.3-25.0.30.0501131 2005-07-23)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

就是没有配置PYTHONHOME,PYTHONPATH:

export PYTHONHOME=/usr/lib/python2.5
export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages
export PATH=$PATH:$PYTHONHOME:$PYTHONPATH

如果出现’import site’ failed错误,就是PYTHONPATH配置出错。

感谢 Len Jay 不厌其烦的指导。

参考:

– EOF –

Categories: Embedded Tags: , , ,