精华内容
下载资源
问答
  • I want to learn it like developing some device driver etc and use QEMU for this because i have no hardware board for ARM like beagle board. What you guys suggest? Can i use Qemu simulator to learn Li....

    I want to learn it like developing some device driver etc and use QEMU for this because i have no hardware board for ARM like beagle board. What you guys suggest? Can i use Qemu simulator to learn Linux kernel on ARM targets? or any other option i should try ?

    解决方案

    It depends on what you want to learn: hardware or software. If you really want to experiment with the different GPIO output to implement things like servo motor control, LED light blinking and display, a cheap board (eg, Raspberry Pi, about USD25) is much preferred.

    But if you want to learn software in general, qemu is definitely much faster, and it lets you see the internal of what is happening. Experimenting with hardware will require oscilloscope etc. But experiment with software will depends on the error output of what others has implemented in their software.

    As for drivers development, first version should be rapidly developed on QEMU. But testing which naturally involved hardware, should be done on the hardware.

    Bottomline is: x86 is so much faster, that cross-crompilation is always done on x86 before it gets booted on the ARM board. Compiling on the board is too time consuming, and sometimes it may involved considerable amount of storage space for development libraries and source codes.

    展开全文
  • Reference: http://en.gentoo-wiki.com/wiki/QEmu http://www.linuxeden.com/html/develop/20100820/104409.html http://balau82.wordpress.com/2010/03/27/busybox-for-arm-on-qemu/I use qmeu-system-arm to em

    Reference:
    http://en.gentoo-wiki.com/wiki/QEmu
    http://www.linuxeden.com/html/develop/20100820/104409.html
    http://balau82.wordpress.com/2010/03/27/busybox-for-arm-on-qemu/

    I use qmeu-system-arm to emulate versatilepb , so I need crosscompile tool for
    arm.
    ========================================================
    1,down load cross compile tool :gnueabi.
    #wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6490/public/arm-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi.bin
    # chmod +x arm-2010q1-202-arm-none-linux-gnueabi.bin
    # ./arm-2010q1-202-arm-none-linux-gnueabi.bin
    then export your cross compile install path to PATH.such as adding the
    following lines into /etc/profile
    export PATH=/mnt/sdb1/eabi/code/bin:$PATH

    last do:
    source /etc/profile
    ========================================================

    2, compile kernel
    2.1 download kenenr org.
    2.1 compile it.
    #make ARCH=arm versatile_defconfig
    #make ARCH=arm menuconfig
    Select EABI support in Kernel Featurer
    #make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all


    =========================================================================================================================================

    3,use busybox to make filesystem.

    3.1 $ wget http://busybox.net/downloads/busybox-1.17.1.tar.bz2
    3.2 $ tar xjf busybox-1.17.1.tar.bz2
    3.3 $ cd busybox-1.17.1
    3.4 $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- defconfig
    3.5 $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- install

    Then there will be a minimal root filesytem in busybox/_install which does not
    include share library.

    Since command ps and mount need /proc and /sys, so you should make proc and
    sys work.
    $cd busybox/_install
    $mkdir proc sys dev etc etc/init.d
    $vim etc/init.d/rcS
    #!/bin/sh
    mount -t proc none /proc
    mount -t sysfs none /sys
    /sbin/mdev -s
    $ chmod +x _install/etc/init.d/rcS
    We can now create a root filesystem image using the cpio tool, and in order to
    compact the filesystem even more, we can run gzip on it to create a compressed
    image:
    $ cd busybox/_install
    $ find . | cpio -o --format=newc > ../rootfs.img
    $ cd ..
    $ gzip -c rootfs.img > rootfs.img.gz

    4, boot your virbutal machine.
    $qemu-system-arm -M versatilepb -m 128M -kernel zImage -initrd rootfs.img.gz -append "root=/dev/ram rdinit=/sbin/init"

    The cross compile tool and busybox I put them under tools.

    NOTE:you should first compile your program in host machine , then add them
    into the filesystem, redo the filesystem, then boot the machine,you can see
    you program on virtual machine.

    If you want use gdb to debug you program. see:
    http://www.linuxeden.com/html/develop/20100820/104409.html
    http://balau82.wordpress.com/2010/08/17/debugging-arm-programs-inside-qemu/#about

    上面是我刚开始做的时候写的一些笔记。

    我对文件系统做了细微的调整,主要是在dev下新建了几个节点。

    #ls -l

    crw-r--r-- 1 root root   5,  1  6月  8 09:53 console

    brw-r--r-- 1 root root  31,  0  6月  8 09:53 mtdblock0

    brw-r--r-- 1 root root  31,  1  6月  8 09:53 mtdblock1

    brw-r--r-- 1 root root  31,  2  6月  8 09:53 mtdblock2

    crw-r--r-- 1 root root   1,  3  6月  8 09:53 null

    drwxr-xr-x 2 root root    4096  6月  9 09:10 pts

    crw-r--r-- 1 root root 204, 64  6月  8 09:53 ttySAC0

     

    然后在rcs里面改成以下设置;

    #!/bin/sh

    mount -t proc none /proc

    mount -t sysfs none /sys

    mount -t devpts  none /dev/pts

    /sbin/mdev -s

    其他的都一样。这样就内核和文件系统都做好了。

    展开全文
  • 交叉编译qemu

    千次阅读 2011-12-06 23:54:14
    交叉编译qemu 前言:libX11的交叉编译确实非常繁琐,而对于系统调用accept4和preadv&pwritev则需要glibc-2.10以上才会支持,之前的glibc是2.9很悲催。。。。明天去龙芯机子上调试,但愿比较顺利。 作者:...
     
     
    

    交叉编译qemu

    前言:libX11的交叉编译确实非常繁琐,而对于系统调用accept4和preadv&pwritev则需要glibc-2.10以上才会支持,之前的glibc是2.9很悲催。。。。明天去龙芯机子上调试,但愿比较顺利。

    作者:口口口

    日期:2011/12/6

    目录

    准备工作... 1

    过程步骤... 2

    重新搭建交叉编译工具... 2

    建立zlib库... 4

    建立libpng库... 5

    安装xproto包... 6

    建立libXau库... 6

    安装xcb-proto. 6

    建立libgpg-error库... 7

    建立libgcrypt库... 7

    建立libxml库... 8

    建立libxslt库... 8

    建立libxcb库... 9

    安装Xtrans. 10

    安装kbproto. 10

    安装inputproto. 11

    建立libXdmcp库... 11

    建立libX11库... 11

    安装xextproto. 13

    建立libXext库... 13

    安装videoproto. 13

    建立libXv库... 14

    建立SDL库... 14

    交叉编译qemu. 15

    准备工作

    主机平台:

    i686-linux

    内核文件:

    wh.tar.gz

    二进制工具:

    binutils-2.19.1.tgz

    gcc及其相关:

    gcc-4.4.0-3a.tgz

    gmp-4.3.0.tar.gz

    mpfr-2.4.2.tar.gz

    glibc库及其相关:

    glibc-2.13.tar.gz

    glibc-ports-2.13.tar.gz

    zlib库:

    zlib-1.2.5.tar.gz

    libpng库:

    libpng-1.5.6.tar.gz

    libX11库及其相关:

    libX11-1.3.2.tar.bz2

    libgcrypt-1.4.6.tar.gz

    libgpg-error-1.10.tar.gz

    libxau_1.0.6.orig.tar.gz

    libxcb-1.4.tar.bz2

    libxdmcp_1.1.0.orig.tar.gz

    libxext_1.1.2.orig.tar.gz

    libxml2-2.7.4.tar.gz

    libxslt_1.1.26.orig.tar.gz

    libxv_1.0.5.orig.tar.gz

    x11proto-input_2.0.2.orig.tar.gz

    x11proto-kb_1.0.5.orig.tar.gz

    x11proto-video_2.3.0.orig.tar.gz

    x11proto-xext_7.1.1.orig.tar.gz

    xcb-proto-1.6.tar.gz

    xproto-7.0.20.tar.gz

    xtrans_1.2.6.orig.tar.gz

    SDL库:

    SDL-1.2.14.tar.gz

    qemu源文件:

    qemu-0.14.1

    目录结构:

    /crosstool 交叉编译工具根目录

    /crosstool/source 存放源文件

    /crosstool/mips64el-tools 存放编译出来的工具

    /crosstool/binutils /crosstool/gcc /crosstool/glibc 相关工具的编译目录,每个目录下都有build-mips64el-linux目录

    /crosstool/kernel 存放内核文件,里面的/headers为存放头文件目录

    /crosstool/zlib 交叉编译zlib的工作目录

    /crosstool/libpng 交叉编译libpng的工作目录

    /crosstool/x11 交叉编译libX11及其相关库和包的工作目录

    /crosstool/sdl 交叉编译SDL及其相关库和包的工作目录

    /crosstool/qemu 交叉编译qemu的工作目录

    /crosstool/qemu/ccp-qemu 存放交叉编译出来的qemu

    过程步骤

    1> 下载源文件和建立工作目录

    2> 重新搭建交叉编译工具

    3> 建立zlib库

    4> 建立libpng库

    5> 建立libX11库及其相关

    6> 建立SDL库

    7> 交叉编译qemu

    8> 调试

    重新搭建交叉编译工具

    由于glibc从2.10版本才开始支持系统调用accept4和preadv & pwritev,而之前所做交叉编译器的glibc版本很悲催的是2.9,所以在交叉编译qemu时会出现:

    osdep.o: In function `qemu_accept':

    /crosstool/qemu/qemu-0.14.1/osdep.c:158: undefined reference to `accept4'

    ……

    /crosstool/qemu/qemu-0.14.1/posix-aio-compat.c:156: undefined reference to `preadv'

    collect2: ld returned 1 exit status

    这样的错误,所以必须更换glibc。

    进入超级权限,删除/crosstool目录下mips64el-tools目录。

    su

    cd /crosstool

    rm -r mips64el-tools

    内核头文件,二进制工具和gcc辅助编译器

    比较简单,过程参考《mips64el交叉开发工具链搭建》,注意修改t-linux64。

    重新编译glibc库

    老规矩,工作前先导入环境变量:

    export PATH=$PATH:/crosstool/mips64el-tools/bin

    工作目录依然为/crosstool/glibc

    解压glibc-2.13和glibc-ports-2.13。

    tar zxvf ../source/glibc-2.13.tar.gz

    tar zxvf ../source/glibc-ports-2.13.tar.gz

    将glibc-ports-2.13重命名为ports并移到glibc-2.9-20090518中去。

    mv glibc-ports-2.13/ ports

    mv ports/ glibc-2.13/

    进入glibc-2.13目录

    sed -i "/default) machine=/s/n32/64/g" ports/sysdeps/mips/preconfigure

    创建libgcc_eh.a链接,避免后续因无该文件而出现编译错误

    cd /crosstool/mips64el-tools/lib/gcc/mips64el-linux/4.4.0/

    ln -s libgcc.a libgcc_eh.a

    进入/crosstool/glibc/build-mips64el-linux目录。

    echo "libc_cv_forced_unwind=yes" > config.cache

    echo "libc_cv_c_cleanup=yes" >> config.cache

    echo "libc_cv_gnu89_inline=yes" >> config.cache

    echo "libc_cv_mips_tls=yes" >> config.cache

    配置并编译。

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ../glibc-2.13/configure --prefix=/crosstool/mips64el-tools/mips64el-linux --host=mips64el-linux --build=i686-linux --disable-profile --enable-add-ons --with-tls --enable-kernel=2.6.36 --with-_thread --enable-shared --with-binutils=/crosstool/mips64el-tools/bin --with-headers=/crosstool/kernel/headers/include/ --cache-file=config.cache

    make

    遇到报错

    sed: couldn't open file ../glibc-2.13/ports/sysdeps/unix/sysv/linux/mips/mips64/ldd-rewrite.sed: No such file or directory

    修改glibc-2.13/elf/中的Makefile文件。将其中一行:

    LC_ALL=C sed $($(ldd-shell)-ldd-rewrite) < $< | LC_ALL=C sed -f $(ldd-rewrite-script) > $@.new

    改为:

    LC_ALL=C sed $($(ldd-shell)-ldd-rewrite) < $< | LC_ALL=C sed -f ../$(ldd-rewrite-script) > $@.new

    继续make,成功,进行安装。

    make install install_root="/crosstool/mips64el-tools/mips64el-linux" prefix=""

    glibc库编译成功。

    进入/crosstool/mips64el-tools/mips64el-linux/lib,修改libc.so:

    将GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld.so.1 ) )

    改为GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld.so.1 ) )

    修改libpthread.so:

    将GROUP ( /lib/libpthread.so.0 /lib/libpthread_nonshared.a )

    改为GROUP ( libpthread.so.0 libpthread_nonshared.a )

    重新编译完整的gcc

    清空build-mips64el-linux文件夹,还原t-linux64,将之前加上的两行删除。具体过程参考《mips64el交叉开发工具链搭建》。

    建立zlib库

    由于编译qemu需要zlib库,所以在编译qemu前需要交叉编译zlib。

    进入目录/crosstool/zlib,解压源码包

    tar zxvf ../source/zlib-1.2.5.tar.gz

    由于 zlib 库的configure 脚本不支持交叉编译选项,所以需要我们自己手动搞一下,临时把gcc修改成指向交叉编译的mips64el-linux-gcc

    cd /usr/bin

    mv gcc gcc_back

    mv ld ld_back

    ln -s /crosstool/mips64el-tools/bin/mips64el-linux-gcc ./gcc

    ln -s /crosstool/mips64el-tools/bin/mips64el-linux-ld ./ld

    然后检查一下是否已经换过来了

    gcc -v

    ld -v

    进入工作目录/crosstool/zlib/zlib-1.2.5,进行配置和编译:

    ./configure --prefix=/crosstool/mips64el-tools/mips64el-linux/ --shared

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/的include和lib目录下多了zlib库相关文件。然后将刚才修改的gcc改回去。

    cd /usr/bin

    rm gcc

    rm ld

    mv gcc_back gcc

    mv ld_back ld

    建立libpng库

    在编译qemu的时候报错:

    /usr/local/work/qemu-0.14.1/ui/vnc-enc-tight.c:79: error: 'PNG_NO_FILTERS' undeclared here (not in a function)

    ……

    make: *** [ui/vnc-enc-tight.o] Error 1

    即缺少libpng库。

    进入目录/crosstool/libpng,解压源码包

    tar zxvf ../source/libpng-1.5.6.tar.gz

    进入工作目录/crosstool/libpng/libpng-1.5.6,进行配置和编译

    cd libpng-1.5.6/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/的lib目录下多了libpng.a,libpng.so 等文件,在include下多了 png.h,pngconf.h 文件以及 libpng15文件夹等。

    安装xproto包

    交叉编译libX*所需依赖。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/xproto-7.0.20.tar.gz

    进入工作目录/crosstool/x11/xproto-7.0.20进行配置编译和安装

    cd xproto-7.0.20

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make intstall

    此时在/crosstool/mips64el-tools/mips64el-linux/ include下多了X11目录,内含xproto相关头文件。

    建立libXau库

    此库为libX11依赖库。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/libxau_1.0.6.orig.tar.gz

    进入工作目录/crosstool/x11/libXau-1.0.6,进行配置、编译和安装

    cd libXau-1.0.6/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/的lib目录下多了libXau.a,libXau.so 等文件,在include下也多了相关头文件。

    安装xcb-proto

    交叉编译libxcb所需要的部分文件在这里。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/xcb-proto-1.6.tar.gz

    进入工作目录/crosstool/x11/xcb-proto-1.6/进行配置编译和安装

    cd xcb-proto-1.6/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make intstall

    此时在/crosstool/mips64el-tools/mips64el-linux/lib下多了python2.7目录,内含xcb-proto相关文件,同时pkgconfig也多了xcb-proto相关文件等。

    建立libgpg-error库

    此库为libgcrypt依赖库。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/libgpg-error-1.10.tar.gz

    进入工作目录/crosstool/x11/libgpg-error-1.10/,进行配置、编译和安装

    cd libgpg-error-1.10/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/的lib目录下多了libgpg-error库相关文件,在bin下也多了gpg-error-config文件。

    建立libgcrypt库

    此库为libxslt依赖库。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/libgcrypt-1.4.6.tar.gz

    进入工作目录/crosstool/x11/libgcrypt-1.4.6,进行配置

    cd libgcrypt-1.4.6/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    报错,找不到libgpg-error,但此时已经安装。于是在configure中加上如下命令

    --with-gpg-error-prefix=/crosstool/mips64el-tools/mips64el-linux/

    重新配置并编译和安装

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/的lib目录下多了libgcypt库相关文件,在bin下也多了libgcypt-config文件。

    建立libxml库

    此库为libxslt依赖库。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/libxml2-2.7.4.tar.gz

    进入工作目录/crosstool/x11/libxml2-2.7.4/,进行配置、编译和安装

    cd libxml2-2.7.4/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了libxml2库相关文件。

    建立libxslt库

    此库为libxcb所依赖(后来发现,交叉编译中并非如此)

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/libxslt_1.1.26.orig.tar.gz

    进入工作目录/crosstool/x11/libxslt-1.1.26,进行配置

    cd libxslt-1.1.26/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    报错

    checking for libxml libraries >= 2.6.27... configure: error: Could not find libxml2 anywhere, check ftp://xmlsoft.org/.

    于是./configure --help,找到指定xml相关文件的命令,于是加上--with-libxml-prefix=/crosstool/mips64el-tools/mips64el-linux/

    重新配置,通过,然后进行编译和安装

    make

    make install

    这样就在/crosstool/mips64el-tools/mips64el-linux/目录下多了libxslt库相关文件。

    建立libxcb库

    此库为libX11依赖库。

    进入目录/crosstool/x11,解压源码包

    tar xvf ../source/libxcb-1.4.tar.bz2

    进入工作目录/crosstool/x11/libxcb-1.4,进行配置

    cd libxcb-1.4/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    报错

    configure: error: XCB requires xsltproc.

    由于经过交叉编译libxslt库生成的xsltproc为目标机可执行文件,本地主机无法使用,所以通过命令

    apt-get install xsltproc

    本地安装一个xsltproc在/usr/bin中,根据提示信息,configure时,会自动到该目录去寻找,故无需移动。

    重新配置,又报错

    checking for XCBPROTO... configure: error: Package requirements (xcb-proto >= 1.5) were not met:

    No package 'xcb-proto' found

    Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix.

    Alternatively, you may set the environment variables XCBPROTO_CFLAGS and XCBPROTO_LIBS to avoid the need to call pkg-config.

    See the pkg-config man page for more details.

    此时已手动安装了'xcb-proto',在/crosstool/mips64el-tools/mips64el-linux下,于是通过命令

    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/crosstool/mips64el-tools/mips64el-linux/lib/pkgconfig

    来设置PKG_CONFIG_PATH,用以查找库的存放和链接信息。

    重新配置,通过,然后编译并安装

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了libxcb库相关文件。

    安装Xtrans

    Xtrans是xfree86对传输层的封装,具体得说就是:封装tcp socket api之类的函数调用,还有其它许多传输层协议。

    交叉编译libX11所需要的部分文件在这里,缺少会报错

    imTrans.c:41:31: error: X11/Xtrans/Xtrans.h: No such file or directory

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/xtrans_1.2.6.orig.tar.gz

    进入工作目录/crosstool/x11/xtrans-1.2.6/,进行配置、编译和安装

    cd xtrans-1.2.6/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了Xtrans相关文件,如在/crosstool/mips64el-tools/mips64el-linux/include/X11目录下多了Xtrans目录。

    安装kbproto

    建立libX11库所依赖。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/x11proto-kb_1.0.5.orig.tar.gz

    进入工作目录,进行配置、编译和安装

    cd kbproto-1.0.5/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了kbproto相关文件。

    安装inputproto

    建立libX11库所依赖。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/x11proto-input_2.0.2.orig.tar.gz

    进入工作目录,进行配置、编译和安装

    cd inputproto-2.0.2/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了inputproto相关文件。

    建立libXdmcp库

    建立libX11库所依赖。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/libxdmcp_1.1.0.orig.tar.gz

    进入工作目录,进行配置、编译和安装

    cd libXdmcp-1.1.0/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了libXdmcp库相关文件。

    建立libX11库

    进入目录/crosstool/x11,解压源码包

    tar xvf ../source/libX11-1.3.2.tar.bz2

    进入工作目录/crosstool/x11/ libX11-1.3.2,进行配置

    cd libX11-1.3.2/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    报错

    checking whether malloc(0) returns NULL... configure: error: in `/crosstool/x11/libX11-1.3.2':

    configure: error: cannot run test program while cross compiling

    See `config.log' for more details.

    这是因为host为mis64el-linux,configure中的测试程序不可以在host上运行。在configure中查找malloc(0)相关定义,发现在配置时可以使用命令--enable-malloc0returnsnull来跳过这个测试。

    重新配置,通过,然后编译

    make

    报错

    /crosstool/mips64el-tools/mips64el-linux/include/bits/types.h:129:3: error: #error

    In file included from /crosstool/mips64el-tools/mips64el-linux/include/sys/types.h:31:0,

    from /crosstool/mips64el-tools/mips64el-linux/include/X11/Xos.h:42,

    from makekeys.c:35:

    /crosstool/mips64el-tools/mips64el-linux/include/bits/types.h:134:1: error: unknown type name ‘__STD_TYPE’

    查看源码/crosstool/mips64el-tools/mips64el-linux/include/bits/types.h发现是因为__WORDSIZE的原因使得__STD_TYPE没有定义。于是查看wordsize.h发现__WORDSIZE是如下定义

    #define __WORDSIZE _MIPS_SZPTR

    肯定是不认的,于是将之改为

    #ifdef _MIPS_SZPTR

    #define __WORDSIZE _MIPS_SZPTR

    #else

    #define __WORDSIZE 64

    #endif

    继续编译,通过,进行安装

    make install

    这样在/crosstool/mips64el-tools/mips64el-linux/目录下多了libX11库相关文件。

    安装xextproto

    建立libXext库所依赖。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/x11proto-xext_7.1.1.orig.tar.gz

    进入工作目录,进行配置、编译和安装

    cd xextproto-7.1.1/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了xextproto相关文件。

    建立libXext库

    建立SDL库和libXv库所依赖。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/libxext_1.1.2.orig.tar.gz

    进入工作目录,进行配置、编译和安装

    cd libXext-1.1.2/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了libXext库相关文件。

    安装videoproto

    建立libXv库所依赖。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/x11proto-video_2.3.0.orig.tar.gz

    进入工作目录,进行配置、编译和安装

    cd videoproto-2.3.0/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了videoproto相关文件。

    建立libXv库

    建立SDL库所依赖。

    进入目录/crosstool/x11,解压源码包

    tar zxvf ../source/libxv_1.0.5.orig.tar.gz

    进入工作目录,进行配置、编译和安装

    cd libXv-1.0.5/

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --target=mips64el-linux --host=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux --enable-malloc0returnsnull

    make

    make install

    此时在/crosstool/mips64el-tools/mips64el-linux/目录下多了libXv库相关文件。

    建立SDL库

    运行qemu需要SDL开发库的支持,所以要交叉编译SDL库。

    首先进入目录/crosstool/sdl,解压源码包

    tar zxvf ../source/libsdl1.2_1.2.14.orig.tar.gz

    进入工作目录/crosstool/sdl/SDL-1.2.14,进行配置和编译

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --disable-video-qtopia --disable-video-dummy --disable-video-fbcon --disable-video-dga --disable-arts --disable-esd --disable-alsa --disable-cdrom --disable-nasm --host=mips64el-linux --build=i686-linux --target=mips64el-linux --prefix=/crosstool/mips64el-tools/mips64el-linux --enable-video-fbcon

    make

    报错

    ./src/joystick/linux/SDL_sysjoystick.c:413: error: 'PATH_MAX' undeclared (first use in this function)

    未知宏定义PATH_MAX,于是在SDL_sysjoystick.c开头加上

    #ifndef PATH_MAX

    #define PATH_MAX 4095

    #endif

    继续make

    报错:

    ./src/audio/pulse/SDL_pulseaudio.c:32:30: error: pulse/pulseaudio.h: No such file or directory

    ……

    ./src/audio/pulse/SDL_pulseaudio.c:531: error: 'PA_STREAM_READY' undeclared (first use in this function)

    加上--disable-pulseaudio后重新配置编译

    make

    编译成功,安装

    make install

    此时会在/crosstool/mips64el-tools/mips64el-linux目录下的bin中多出sdl-config,include和lib中多出SDL相关头文件和库文件等等。

    交叉编译qemu

    这里qemu的源文件我已经解压好了在/usr/local/work/qemu-0.14.1下了,将之拷贝到工作目录中。

    注:如果另建目录开始编译的话,在make时将会出现:

    config-devices.mak: No such file or directory

    make[1]: *** No rule to make target `config-devices.mak'. Stop.

    经过查找发现在qemu-0.14.1中含有config-devices.mak,看来在configure时将该文件生成到了qemu源文件夹中了,真是太坏了。

    进入工作目录/crosstool/qemu/ qemu-0.14.1,进行配置和编译

    BUILD_CC="gcc" CC="mips64el-linux-gcc -mabi=64" AR=mips64el-linux-ar LD=mips64el-linux-ld RANLIB=mips64el-linux-ranlib ./configure --prefix=/crosstool/qemu/ccp-qemu --target-list=i386-softmmu

    make

    报错:

    block.c:542: error: 'PATH_MAX' undeclared (first use in this function)

    查看并修改源码,在block.c中加上:

    #ifndef PATH_MAX

    #define PATH_MAX 4095

    #endif

    重新make,又报错,block.c中缺少宏定义IOV_MAX。再次查看源码,但这个确实有定义,在qemu-common.h中定义了#define IOV_MAX 1024,不知道为什么这里不认。于是再次加上:

    #ifndef IOV_MAX

    #define IOV_MAX 1024

    #endif

    再次make,报错,在os-posix.c中还是缺少宏定义PATH_MAX,同样加上:

    #ifndef PATH_MAX

    #define PATH_MAX 4095

    #endif

    再编译,报错:

    /crosstool/mips64el-tools/lib/gcc/mips64el-linux/4.4.0/../../../../mips64el-linux/include/bits/stdlib.h:91:3: error: #error "Assumed value of MB_LEN_MAX wrong"

    在/crosstool/mips64el-tools/mips64el-linux/include/bits/stdlib.h中

    #define STDLIB_MB_LEN_MAX 16

    改为

    #define STDLIB_MB_LEN_MAX 1

    继续,终于make成功,安装:

    make install -i

    cd ../ccp-qemu

    将ccp-qemu中各目录里的可执行文件用交叉编译工具的strip处理一下:

    mips64el-linux-strip ./*

    注:make的 -i参数表示忽略安装过程中的错误,直接用make install安装会报这样的错误:

    strip "/crosstool/qemu/ccp-qemu/bin/qemu"

    strip: Unable to recognise the format of the input file `/crosstool/qemu/ccp-qemu/bin/qemu'

    make[1]: *** [install] Error 1

    因为通常我们编译好程序后执行make install时默认是调用host下的/usr/bin/install工具进行安装, 不是简单的cp所有文件到指定路径下。之所以调用install程序进行安装,是因为make好的程序默认是不进行strip的,运行install程序时其中-s参数会先调用默认的strip工具对其进行strip,然后拷贝到指定路径。这样看来,因为我们make时是用的交叉编译工具,编译好的程序是在mips平台上运行的,make install默认调用/usr/bin/strip对其进行strip怎么会成功呢?所以会报错。

    这样,qemu就交叉编译好了。

    展开全文
  • 前言本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码。下文中的”NDK”若无特殊说明均指”Android NDK”。下文中”$NDK”表示的是NDK的根目录。步骤1.下载并安装Android NDK...

    前言

    本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码。

    下文中的”NDK”若无特殊说明均指”Android NDK”。

    下文中”$NDK”表示的是NDK的根目录。

    步骤

    1.下载并安装Android NDK

    下载并安装Android NDK的过程在这里不做介绍。

    2.下载qemu

    3.设置NDK工具的环境变量

    4.编译依赖库

    glib

    编译可在Android上运行的glib库

    编译参考资料:编译可在Android上运行的glib库

    5.创建pkg-config的软链接

    bVzqnB

    ln命令中的源路径是pkg-config工具的源路径。

    如果不创建这个软链接,当执行configure脚本时会报下面的错误:

    bVzqnF

    6.修改configure

    添加arm的PIE支持

    找到下面的代码:

    bVzqnH

    将”i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD”更改为”i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD|arm-Linux”。

    如果不这么做的后果,使用”readelf -S qemu-arm”查看编译出来的qemu-arm可执行文件的段,可以发现所有在运行时可加载段的地址均以0x60000000为基址。

    在configure中有这么一段代码:

    bVzqnP

    如果bVzqqytextseg_addr”这个命令行选项,这个命令行选项指定text段的基址。在脚本的后面textseg_ldflags会被添加到ldflags中。

    如果qemu-arm可加载段的基址为0x60000000,当qemu-arm在Android设备上运行时将会发生”Segmentation fault”,详情请参考Android上可执行ELF文件中的段不能有基址。

    7.运行configure

    bVzqqH

    命令行解析

    configure脚本会在终端输出一些关键的信息,如:用什么编译器,flags等。

    PKG_CONFIG_PATH

    上面命令中的PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig"是必要的,如果不设置这个宏,configure脚本输出”CFLAGS”的内容见下:

    bVzqqL

    关注”-I”后的路径,首先说一下这个路径是怎么来的,configure脚本中有下面的代码:

    bVzqqR

    “glib_cflags=$pkg_config --cflags $i“语句会获得glib的包含目录,看这篇文章的人如果电脑上安装有glib2.0可以通过这个命令进行查看输出内容:pkg-config –cflags glib-2.0。然而这个路径并不是我想要的,因为我现在是交叉编译,目标是ARM,所以我在这里将一个新的pkgconfig目录路径设置到PKG_CONFIG_PATH宏,输入下面的命令查看输出内容:

    bVzqq2

    输出内容:

    bVzqq3

    会发现此时”-I”后的路径有了改变。

    注意:pkgconfig是一个目录,在这个目录中包含了步骤5中安装的依赖库的信息。

    –target-list –cpu

    –target-list arm-linux-user 意味着编译出来的qemu程序用于user mode,可以执行arm指令,并且这个arm指令的可执行程序的执行环境基于linux系统。

    –cpu=arm 意味着编译出的qemu程序只能在arm机器上执行。

    –disable-system –disable-bsd-user

    –disable-system:不编译system mode的代码。

    –disable-bsd-user:不编译bsd user mode的代码。

    –cross-prefix

    交叉编译工具的前缀,在当前命令行中它的值为”arm-linux-androideabi-“,那么configure脚本会去查找名为arm-linux-androideabi-gcc、arm-linux-androideabi-g++等工具。

    –disable-tools

    当命令行中有–disable-tools选项时,脚本中的禁用want_tools宏将被设置为”no”,这个宏默认为”yes”。当want_tools宏为”yes”时,会对tools宏进行设置,下面是与want_tools有关的设置tools宏的代码:

    bVzqq5

    configure脚本会将tools宏的内容写入config-host.mak文件。

    –disable-guest-agent

    当没有这个选项时,编译会报下面的错误:

    bVzqq9

    为PC编译qemu项目没有这个命令选项时不会报这个错误,然而lockf函数在Android上并不存在,所以为Android编译qemu项目时会报这个错误。

    编译错误排除

    ld: error: cannot find -lutil

    将根目录下的Makefile文件中下面的内容注释:

    bVzqra

    ifaddrs.h: No such file or directory

    错误信息

    bVzqrb

    修复办法:将这个链接中的源文件都下载下来:android-ifaddrs,将下载下来的文件拷贝到qga/目录下。然后找到qga/Makefile.objs文件,将”ifaddrs.o”插入”qga-obj-$(CONFIG_POSIX)”宏中。

    mqueue.h: No such file or directory

    错误信息

    bVzqrd

    修复办法:将”#include ”更改为”#include ”。

    char __unused[128 - sizeof(target_sigset_t)];

    错误信息

    bVzqrj

    修复办法:将__unused更改为_unused。

    syscall.c:4108:9: error: dereferencing pointer to incomplete type

    错误信息

    bVzqro

    修复办法

    bVzqrr

    改为

    bVzqrt

    disas/arm-a64.cc:67: error: undefined reference to ‘__cxa_end_cleanup’

    错误信息

    bVzqrx

    解决办法:在configure中找到下面的代码:

    bVzqrD

    将这些代码注释掉:

    bVzqrF

    原因分析:目前在Android NDK中没有64位版本的object。

    syscall.c中找不到符号

    错误信息

    bVzqrJ

    bVzqrL

    解决办法

    在syscall.c文件中写下面的内容:

    bVzqrN

    bVzqrR

    bVzqrS

    bVzqrU

    编译清理命令

    执行下面两个命令:

    make clean

    make distclean

    编译debug版

    调用configure脚本的命令行中添加”–enable-debug”命令选项。

    作者:寻禹@阿里聚安全,更多技术文章,请访问阿里聚安全博客

    展开全文
  • Kali Buildroot交叉编译工具链与qemu初探 环境描述 基本步骤 详细过程 下载Buildroot 通过Buildroot构建交叉编译工具链 用交叉编译工具链编译HelloWorld C程序 Kali Buildroot交叉编译工具链与qemu初探 ...
  • 本文介绍在没有国产主机情况下,进行软件开发的两种替代方法:交叉编译QEMU虚拟机。
  • CentOS7 使用qemu进行arm开发的交叉编译环境安装 1.安装qemu yum安装会自动解析依赖关系安装其他包 yum install qemu aarch64架构需要下载源码编译安装, 安装好后输入 qemu-system- 后用tab补全,应该能看到qemu-...
  • 交叉编译sudo sudo sudo源码可以在sudo网站上下载:https://www.sudo.ws/download.html。sudo可以说在linux系统上用户使用率还是比较高的命令,安装sudo之后我们可以在管理员用户上使用系统,仅在需要提权时使用...
  • 嵌入式开发中免不了交叉编译交叉编译就是使用的开发环境中运行编译器生成另一个平台的可执行程序,常见的pc开发平台就是x86的linux系统,而嵌入式平台一般是arm或者riscv的linux平台,一些低端嵌入式环境是rtos或...
  • 编译环境Fedora23 下载VSS SDK的setup.exe 下载地址 提取VSS SDK头文件 将下面的代码保存成extract-vsssdk-headers.sh脚本,然后放入setup.exe所在的/home/fedora/Downloads目录,然后执行./extract-vsssdk-headers....
  • 交叉编译linux内核5.3.7 交叉编译器 参考我的这篇文章:交叉编译openssl到aarch64 下载内核 官网:https://www.kernel.org/ 编译内核代码 编译内核前需要先安装一些必备工具软件: sudo apt-get install ...
  • 1.下载并编译QT4 ...QT的编译也需要交叉编译环境,但是我们之前编译内核的时候已经建立的交叉编译环境就可以用. 解压缩上面下载的原程序包,然后编译: tar xvfqt-everywhere-opensource-src-4.8.7...
  • 配置环境 安装必要的包: sudo apt-get install gcc gcc-arm-linux-gnueabi ...交叉编译 使用如下简单的小程序为例: #include<stdio.h> int main(){ int n; scanf("%d",&n); if(n>10){ pr...
  • 在自己写程序之前我们必须建立交叉编译环境,在HOST端,这个交叉编译环境已经建好了(请参见用QEMU搭建arm开发环境之二:QEMU启动内核这一章的内容).但是在qemu里面还需要加入对应的运行环境.这个运行系统所需的文件在...
  • 交叉编译screen、tree、cu screen screen源码可以在gnu网站上下载:https://ftp.gnu.org/gnu/screen/。screen是个人非常喜欢的终端管理工具,在没有图形界面的系统中,使用screen可以实现多终端窗口管理以及酷炫的...
  • 工具软件:docker-io、debootstrap、qemu-user-static、qemu-system 软件包:已打包好的根文件系统rootfs.tar.gz 1、安装工具软件: sudo apt-get install docker-io、debootstrap、qemu-user-static、qemu-...
  • 转载说明 这篇文章借鉴了来自Linux博客教程的相关内容,因此文章类型...使用相关交叉编译工具链如gcc-arm-linux-gnueabi编译系统源码 使用QEMU软件仿真出硬件平台,测试对象系统的系统行为 由于我是刚刚正式接触L...
  • 一、交叉编译简介 1、什么是交叉编译 1.1 本地编译  解释什么是交叉编译之前,先要明白一个概念:本地编译  我们之前常见的软件开发,都是属于本地编译:在当前的PC下,x86的CPU下,直接编译出来程序,可以运行的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,084
精华内容 833
热门标签
关键字:

qemu交叉编译