Belphegor の巣窟 - Linux Zaurus(略) - glibcの作成手順


glibc-2.2.5
glibc-linuxthreads-2.2.5

  1. まずは実機(Linux Zaurus)にて現時点のルートファイルシステムを読み出します。

    # sambaマウントで母艦のディスクを借りる; nfsやその他の共有があればそれでも良い
    smbmount //192.168.129.1/c$ /mnt -o username=belphegor
    
    # ddで /dev/mtdblock0 (起動ROM部分) を吸い出す
    # 母艦側では C:\TEMP\mtdblock0.binってファイル名になるわけですな。
    # ちょうど15,073,280バイトのサイズになればOK
    dd if=/dev/mtdblock0 of=/mnt/TEMP/mtdblock0.bin
    
    # ddで /dev/mtdblock1 (ファイルシステム部分) を吸い出す
    # こっちもちょうど29,360,128バイトのサイズになるはず
    dd if=/dev/mtdblock1 of=/mnt/TEMP/mtdblock1.bin
    							

  2. 次にクロスコンパイラ側(母艦)にて作業を行ないます。

    まずは cramfs 関係のツール(母艦用)を構築します。
    お使いの Linux ディストリビューションで既に用意されていれば、単にそれをインストールするだけで良いです。

    cd /anywhere_work_directory (どこでも良い)
    wget http://twtelecom.dl.sourceforge.net/sourceforge/cramfs/cramfs-1.1.tar.gz
    tar xvzf cramfs-1.1.tar.gz
    cd cramfs-1.1
    make
    cp cramfsck mkcramfs /sbin
    							

    ここからが実作業です。なお、実機で吸い出した mtdblock0.bin をあらかじめ母艦に移しておきましょう。

    # 念のためfsck
    cramfsck -v mtdblock0.bin
    # (ROM内の様々なファイルの一覧が現われ、最後に "mtdblock0.bin: OK" が出ればOK)
    
    # /mnt にループバックマウントして特定のディレクトリ(以下の例では $BUILD/rootfs)に展開
    rm -fR $BUILD/rootfs
    mkdir $BUILD/rootfs
    mount -t cramfs -o ro,loop mtdblock0.bin /mnt
    cd /mnt; tar -cvp . | tar -xpC $BUILD/rootfs
    cd $BUILD
    umount /mnt
    
    # やっとここから glibc 2.2.5 のコンパイル
    # ftp://ftp.iij.ad.jp/pub/GNU/glibc/glibc-2.2.5.tar.gz
    # ftp://ftp.iij.ad.jp/pub/GNU/glibc/glibc-linuxthreads-2.2.5.tar.gz
    cd $SOURCE
    tar zxvf $ARCHIVE/glibc-2.2.5.tar.gz
    cd glibc-2.2.5
    tar zxvf $ARCHIVE/glibc-linuxthreads-2.2.5.tar.gz
    
    # ftp://ftp.linux.org.uk/pub/armlinux/toolchain/src-3.2/build-toolchainに書かれているパッチ
    perl -pi -e 's/i386/arm*)\n\tlibc_cv_gcc_unwind_find_fde=yes\n\tarch_minimum_kernel=2.0.10\n\t;;\n   i386/' sysdeps/unix/sysv/linux/configure
    perl -pi -e 's/weak_alias \(__old_sys_nerr/\/\/ $&/' sysdeps/unix/sysv/linux/arm/errlist.c
    
    # ワークディレクトリの作成
    mkdir $BUILD/glibc
    cd $BUILD/glibc
    
    # configure
    CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib $SOURCE/glibc-2.2.5/configure --host=$TARGET --enable-add-ons --disable-profile --prefix=/usr --with-headers=$SOURCE/linux/include --disable-nls --libexecdir=/usr/bin
    
    # makeinfo時にエラーになる部分の修正
    mv $SOURCE/glibc-2.2.5/manual/stdio.texi $SOURCE/glibc-2.2.5/manual/stdio.texi.bak
    sed "s/@ref{,/@ref{Top,/" < $SOURCE/glibc-2.2.5/manual/stdio.texi.bak > $SOURCE/glibc-2.2.5/manual/stdio.texi
    
    # やっとここでmake
    make all
    
    # 面倒なので一気にstrip
    find . | xargs -P 1 arm-linux-strip -g > /dev/null 2> /dev/null
    
    # make install は使えないので、自前でinstall
    /usr/bin/install -c $BUILD/glibc/elf/ld.so $BUILD/rootfs/lib/ld-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/libc.so $BUILD/rootfs/lib/libc-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/locale/libBrokenLocale.so $BUILD/rootfs/lib/libBrokenLocale-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/math/libm.so $BUILD/rootfs/lib/libm-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/dlfcn/libdl.so $BUILD/rootfs/lib/libdl-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/malloc/libmemusage.so $BUILD/rootfs/lib/libmemusage.so
    /usr/bin/install -c $BUILD/glibc/crypt/libcrypt.so $BUILD/rootfs/lib/libcrypt-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/linuxthreads/libpthread.so $BUILD/rootfs/lib/libpthread-0.9.so
    /usr/bin/install -c $BUILD/glibc/resolv/libresolv.so $BUILD/rootfs/lib/libresolv-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/resolv/libnss_dns.so $BUILD/rootfs/lib/libnss_dns-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/resolv/libanl.so $BUILD/rootfs/lib/libanl-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/nss/libnss_files.so $BUILD/rootfs/lib/libnss_files-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/rt/librt.so $BUILD/rootfs/lib/librt-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/debug/libSegFault.so $BUILD/rootfs/lib/libSegFault.so
    /usr/bin/install -c $BUILD/glibc/debug/libpcprofile.so $BUILD/rootfs/lib/libpcprofile.so
    /usr/bin/install -c $BUILD/glibc/linuxthreads_db/libthread_db.so $BUILD/rootfs/lib/libthread_db-1.0.so
    /usr/bin/install -c $BUILD/glibc/hesiod/libnss_hesiod.so $BUILD/rootfs/lib/libnss_hesiod-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/nis/libnsl.so $BUILD/rootfs/lib/libnsl-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/nis/libnss_nis.so $BUILD/rootfs/lib/libnss_nis-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/nis/libnss_nisplus.so $BUILD/rootfs/lib/libnss_nisplus-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/nis/libnss_compat.so $BUILD/rootfs/lib/libnss_compat-2.2.5.so
    /usr/bin/install -c $BUILD/glibc/login/libutil.so $BUILD/rootfs/lib/libutil-2.2.5.so
    
    # シンボリックリンクの作成
    ln -sf ld-2.2.5.so $BUILD/rootfs/lib/ld-linux.so.2
    ln -sf libc-2.2.5.so $BUILD/rootfs/lib/libc.so.6
    ln -sf libBrokenLocale-2.2.5.so $BUILD/rootfs/lib/libBrokenLocale.so.1
    ln -sf libm-2.2.5.so $BUILD/rootfs/lib/libm.so.6
    ln -sf libdl-2.2.5.so $BUILD/rootfs/lib/libdl.so.2
    ln -sf libcrypt-2.2.5.so $BUILD/rootfs/lib/libcrypt.so.1
    ln -sf libpthread-0.9.so $BUILD/rootfs/lib/libpthread.so.0
    ln -sf libresolv-2.2.5.so $BUILD/rootfs/lib/libresolv.so.2
    ln -sf libnss_dns-2.2.5.so $BUILD/rootfs/lib/libnss_dns.so.2
    ln -sf libanl-2.2.5.so $BUILD/rootfs/lib/libanl.so.1
    ln -sf libnss_files-2.2.5.so $BUILD/rootfs/lib/libnss_files.so.2
    ln -sf librt-2.2.5.so $BUILD/rootfs/lib/librt.so.1
    ln -sf libthread_db-1.0.so $BUILD/rootfs/lib/libthread_db.so.1
    ln -sf libnss_hesiod-2.2.5.so $BUILD/rootfs/lib/libnss_hesiod.so.2
    ln -sf libnsl-2.2.5.so $BUILD/rootfs/lib/libnsl.so.1
    ln -sf libnss_nis-2.2.5.so $BUILD/rootfs/lib/libnss_nis.so.2
    ln -sf libnss_nisplus-2.2.5.so $BUILD/rootfs/lib/libnss_nisplus.so.2
    ln -sf libnss_compat-2.2.5.so $BUILD/rootfs/lib/libnss_compat.so.2
    ln -sf libutil-2.2.5.so $BUILD/rootfs/lib/libutil.so.1
    ln -sf ld-2.2.5.so $BUILD/rootfs/lib/ld-linux.so.2
    ln -sf ld-2.2.5.so $BUILD/rootfs/lib/ld.so.2
    
    # glibc 2.2.2の削除
    tar cvpzf $BUILD/glibc-2.2.2-old_files.tar.gz --remove-files -T /dev/stdin << EOF
    $BUILD/rootfs/lib/ld-2.2.2.so
    $BUILD/rootfs/lib/libc-2.2.2.so
    $BUILD/rootfs/lib/libcrypt-2.2.2.so
    $BUILD/rootfs/lib/libdl-2.2.2.so
    $BUILD/rootfs/lib/libm-2.2.2.so
    $BUILD/rootfs/lib/libnsl-2.2.2.so
    $BUILD/rootfs/lib/libnss_compat-2.2.2.so
    $BUILD/rootfs/lib/libnss_dns-2.2.2.so
    $BUILD/rootfs/lib/libnss_files-2.2.2.so
    $BUILD/rootfs/lib/libnss_nis-2.2.2.so
    $BUILD/rootfs/lib/libresolv-2.2.2.so
    $BUILD/rootfs/lib/libutil-2.2.2.so
    EOF
    
    # glibc 2.2.5 にしたお陰で容量が足りなくなったので、nmbd, smbdを削除してダミーを入れる
    rm $BUILD/rootfs/usr/sbin.rom/smbd $BUILD/rootfs/usr/sbin.rom/nmbd
    cat > $BUILD/rootfs/usr/sbin.rom/smbd << EOF
    #!/bin/sh
    
    # do nothing
    EOF
    chmod 755 $BUILD/rootfs/usr/sbin.rom/smbd
    cat > $BUILD/rootfs/usr/sbin.rom/nmbd << EOF
    #!/bin/sh
    
    # do nothing
    EOF
    chmod 755 $BUILD/rootfs/usr/sbin.rom/nmbd
    
    # 最後にcramfsファイルシステムの作成
    cd $BUILD
    mkcramfs rootfs initrd.bin
    							

  3. 最後に完成した initrd.bin を実機に書き込みます。
    SL-A300の場合は SDメモリカード(FATフォーマット済み) に下記の updater.pro とともに書き込んで HOME を押しながらリセットです。

    INITRD ,BIN,0x00160000,14464
    							

もちろん上記の作業はルート(ROM)ファイルシステムを書き換えたい場合に応用できます。
2. の部分のみ必要に応じて他のアプリケーション等に置き換えてください。

Linux Zaurus(略)へ戻る


最終更新日: 2003/06/18 12:01:02