Vine 3.1(11)glibc の作り直し


浦島さんに「glibcのパッケージに変更を加えてみてはいかがでしょうか?」 と助言いただいたので、助言に従って glibc に変更を加えてみる。
浦島さんのところにはバイナリも置いていただいているのだが、 追試の意味も含めて自分で rebuild することにする。

ソースパッケージの取得、インストール

[root@hackkit root]# apt-get update
取得:1 http://updates.vinelinux.org 3.1/ppc release [2516B]
2516B を 1s 秒で取得しました (1355B/s)
ヒット http://updates.vinelinux.org 3.1/ppc/main pkglist
ヒット http://updates.vinelinux.org 3.1/ppc/main release
ヒット http://updates.vinelinux.org 3.1/ppc/devel pkglist
ヒット http://updates.vinelinux.org 3.1/ppc/devel release
ヒット http://updates.vinelinux.org 3.1/ppc/plus pkglist
ヒット http://updates.vinelinux.org 3.1/ppc/plus release
ヒット http://updates.vinelinux.org 3.1/ppc/updates pkglist
ヒット http://updates.vinelinux.org 3.1/ppc/updates release
ヒット http://updates.vinelinux.org 3.1/ppc/main srclist
ヒット http://updates.vinelinux.org 3.1/ppc/devel srclist
取得:1 http://updates.vinelinux.org 3.1/ppc/plus srclist [172kB]
ヒット http://updates.vinelinux.org 3.1/ppc/updates srclist
172kB を 5s 秒で取得しました (32.8kB/s)
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
[root@hackkit root]# exit
-bash-2.05b$ mkrpmdir ~
mkrpmdir: created rpm tree in /home/yamasita/yasunari/rpm and /home/yamasita/yasunari/.rpmmacros.
-bash-2.05b$ apt-get source glibc
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
13.6MB のソースアーカイブを取得します。
取得:1 http://updates.vinelinux.org 3.1/ppc/main glibc 2.3.3-3vl1 (srpm) [13.6MB]
13.6MB を 27s 秒で取得しました (497kB/s)
   1:glibc                  ########################################### [100%]
-bash-2.05b$ rpm -ivh glibc-2.3.3-3vl1.src.rpm
   1:glibc                  ########################################### [100%]
-bash-2.05b$

パッチ

浦島さんの助言によると、 patch3 をあてる箇所を修正するのだそうだが、、、

patch3 とは?
glibc-vl.spec を見ると、

Patch3: %{name}-execstack-disable.patch
うーん。そのまんま。
でパッチをあてているところは、
case "`gcc --version | head -1`" in
gcc*\ 3.3*)
%ifarch %{nptlarches}
%patch1 -p1
%endif
  ;;
gcc*\ 3.2.3*)
%patch2 -p1
%patch3 -p1
  ;;
esac
と gcc 3.2.3 なら patch3 をあてている。
Vine 3.1 の gcc のバージョンは、
-bash-2.05b$ gcc --version
gcc (GCC) 3.3.2 20031218 (Vine Linux 3.3.2-0vl8)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

なので、patch3 はあたらない。 浦島さんのパッチは、 この gcc のバージョンによる case 文の外で patch3 をあてる、 つまり gcc 3.3.2 であっても patch3 をあてるとのこと。

cpp を元に戻す

早速やってみようと思ったが、 cpp を 2.95.3 に入れ換えていたのを思い出した。
元に戻しておく
[root@hackkit root]# /sbin/update-alternatives --list cpp
/usr/bin/cpp-3.3.2
/usr/bin/cpp-2.95.3
[root@hackkit root]# /sbin/update-alternatives --auto cpp
[root@hackkit root]# ls -l /etc/alternatives/cpp
lrwxrwxrwx    1 root     root           18 Dec 19 03:34 /etc/alternatives/cpp -> /usr/bin/cpp-3.3.2*

SPEC ファイルの修正

浦島さんのパッチの通りに修正する
-bash-2.05b$ mv glibc-vl.spec{,.orig}
-bash-2.05b$ cp glibc-vl.spec{.orig,}
-bash-2.05b$ vi glibc-vl.spec
-bash-2.05b$ diff -c glibc-vl.spec{.orig,}
*** glibc-vl.spec.orig  2004-01-18 18:45:24.000000000 +0900
--- glibc-vl.spec       2004-12-19 03:37:37.000000000 +0900
***************
*** 14,20 ****
  Summary(ja): GNU libc ライブラリ
  Name: glibc
  Version: 2.3.3
! Release: %{glibcrelease}vl1
  License: LGPL
  Group: System Environment/Libraries
  Source0: %{name}-%{version}-%{glibcdate}.tar.bz2
--- 14,20 ----
  Summary(ja): GNU libc ライブラリ
  Name: glibc
  Version: 2.3.3
! Release: %{glibcrelease}vl1hk1
  License: LGPL
  Group: System Environment/Libraries
  Source0: %{name}-%{version}-%{glibcdate}.tar.bz2
***************
*** 315,323 ****
    ;;
  gcc*\ 3.2.3*)
  %patch2 -p1
- %patch3 -p1
    ;;
  esac
  %patch10 -p1
  %patch11 -p1

--- 315,323 ----
    ;;
  gcc*\ 3.2.3*)
  %patch2 -p1
    ;;
  esac
+ %patch3 -p1
  %patch10 -p1
  %patch11 -p1

-bash-2.05b$
念のため、Release: も修正。

rebuild

-bash-2.05b$ rpm -ba glibc-vl.spec
エラー: ビルド依存性の欠如:
        gd-devel >= 2.0.15 は glibc-2.3.3-3vl1hk1 に必要とされています
        libpng-devel >= 1.2.5 は glibc-2.3.3-3vl1hk1 に必要とされています
がー
[root@hackkit root]# apt-get build-dep glibc
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下のパッケージが新たにインストールされます:
  XOrg-libs freetype2 gd gd-devel libexpat libjpeg libpng libpng-devel
アップグレード: 0 個, 新規インストール: 8 個, 削除: 0 個, 保留: 2 個
3303kB のアーカイブを取得する必要があります。
展開後に 8353kB のディスク容量が追加消費されます。
続行しますか? [Y/n]
なんで、こんないっぱい入れないといけないの?。
gd-devel もしくは libpng-devel が依存しているの?
まあいいか。
続行しますか? [Y/n]y
取得:1 http://updates.vinelinux.org 3.1/ppc/main libexpat 1.95.7-1vl1 [69.7kB]
取得:2 http://updates.vinelinux.org 3.1/ppc/main freetype2 2.1.7-0vl4 [291kB]
取得:3 http://updates.vinelinux.org 3.1/ppc/main XOrg-libs 6.7.0-0vl6 [2180kB]
取得:4 http://updates.vinelinux.org 3.1/ppc/main libjpeg 6b-21vl2 [145kB]
取得:5 http://updates.vinelinux.org 3.1/ppc/main libpng 2:1.2.7-0vl1 [234kB]
取得:6 http://updates.vinelinux.org 3.1/ppc/updates gd 2.0.27-0vl2 [101kB]
取得:7 http://updates.vinelinux.org 3.1/ppc/updates gd-devel 2.0.27-0vl2 [104kB]
取得:8 http://updates.vinelinux.org 3.1/ppc/devel libpng-devel 2:1.2.7-0vl1 [177kB]
3303kB を 8s 秒で取得しました (412kB/s)
変更を適用しています...
Preparing...                ########################################### [100%]
   1:libexpat               ########################################### [ 12%]
   2:freetype2              ########################################### [ 25%]
   3:XOrg-libs              ########################################### [ 37%]
   4:libjpeg                ########################################### [ 50%]
   5:libpng                 ########################################### [ 62%]
   6:gd                     ########################################### [ 75%]
   7:gd-devel               ########################################### [ 87%]
   8:libpng-devel           ########################################### [100%]
完了
[root@hackkit root]#

rebuild やりなおし

-bash-2.05b$ time rpm -ba glibc-vl.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.36679
+ umask 022
+ cd /home/yamasita/yasunari/rpm/BUILD
+ cd /home/yamasita/yasunari/rpm/BUILD
+ rm -rf glibc-2.3.3-200312301455
	:
	:
+ echo 'Patch #3 (glibc-execstack-disable.patch):'
Patch #3 (glibc-execstack-disable.patch):
+ patch -p1 -s
	:
	:
書き込み完了: /home/yamasita/yasunari/rpm/SRPMS/glibc-2.3.3-3vl1hk1.src.rpm
書き込み完了: /home/yamasita/yasunari/rpm/RPMS/ppc/glibc-2.3.3-3vl1hk1.ppc.rpm
書き込み完了: /home/yamasita/yasunari/rpm/RPMS/ppc/glibc-devel-2.3.3-3vl1hk1.ppc.rpm
書き込み完了: /home/yamasita/yasunari/rpm/RPMS/ppc/glibc-profile-2.3.3-3vl1hk1.ppc.rpm
書き込み完了: /home/yamasita/yasunari/rpm/RPMS/ppc/glibc-common-2.3.3-3vl1hk1.ppc.rpm
書き込み完了: /home/yamasita/yasunari/rpm/RPMS/ppc/nscd-2.3.3-3vl1hk1.ppc.rpm
書き込み完了: /home/yamasita/yasunari/rpm/RPMS/ppc/glibc-debug-2.3.3-3vl1hk1.ppc.rpm
書き込み完了: /home/yamasita/yasunari/rpm/RPMS/ppc/glibc-utils-2.3.3-3vl1hk1.ppc.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.64368
+ umask 022
+ cd /home/yamasita/yasunari/rpm/BUILD
+ cd glibc-2.3.3-200312301455
+ rm -rf /var/tmp/glibc-2.3.3-root
+ rm -f common.filelist devel.filelist nscd.filelist profile.filelist rpm.filelist rpm.filelist.full rpm.filelist.in utils.f
ilelist
+ exit 0

real    706m47.565s
user    590m30.780s
sys     46m4.850s
-bash-2.05b$
おわったぁ。
朝四時前にはじめて、終わったのが午後3時半。
12時間弱。

glibc の入れ換え

全部入れ換える必要もないと思うのだが、 不整合がおきても困るので作られた rpm を全部インストールする。
[root@hackkit root]# cd ~yasunari/rpm/RPMS/ppc/
[root@hackkit ppc]# ls
glibc-2.3.3-3vl1hk1.ppc.rpm         glibc-devel-2.3.3-3vl1hk1.ppc.rpm    nscd-2.3.3-3vl1hk1.ppc.rpm
glibc-common-2.3.3-3vl1hk1.ppc.rpm  glibc-profile-2.3.3-3vl1hk1.ppc.rpm
glibc-debug-2.3.3-3vl1hk1.ppc.rpm   glibc-utils-2.3.3-3vl1hk1.ppc.rpm
[root@hackkit ppc]# rpm -Uvh *.rpm
準備中...                   ########################################### [100%]
   1:glibc-common           ########################################### [ 14%]
   2:glibc                  ########################################### [ 28%]
   3:glibc-devel            ########################################### [ 42%]
   4:glibc-debug            ########################################### [ 57%]
   5:glibc-profile          ########################################### [ 71%]
   6:glibc-utils            ########################################### [ 85%]
   7:nscd                   ########################################### [100%]
[root@hackkit ppc]#

リブート

kernel 2.4.20@玄箱

まずは、kernel 2.4.20 から起動する。
Vine Linux 3.1 (Pichon Lalande)
Kernel 2.4.20_kuro-box on a ppc
login: yasunari
Password:
Last login: Sun Dec 19 05:05:29 from ns.yamasita.jp
-bash-2.05b$ rpm -q glibc
glibc-2.3.3-3vl1hk1
-bash-2.05b$

kernel 2.4.17@玄箱

続いて、kernel 2.4.17 で起動
Vine Linux 3.1 (Pichon Lalande)
Kernel 2.4.17_kuro-box on a ppc
login: yasunari
Password:
Last login: Sun Dec 19 15:48:58 from ns.yamasita.jp
-bash-2.05b$
-bash-2.05b$ rpm
RPM バージョン 4.0.5
著作権 (C) 1998-2000 - Red Hat, Inc.
翻訳者 Project Vine 
(神田 充  さんの po に基づく)
誤訳等は Project Vine まで
GNU一般公有使用許諾書の下で自由に配布できます

使用法: rpm {--help}
       rpm {--version}
-bash-2.05b$
無事、起動してきた。
標準の glibc では、
-bash-2.05b$ rpm
rpm: error while loading shared libraries: librpmio-4.0.4.so: cannot enable executable stack as shared object requires: Error 14
となっていた rpm も動いた。

kernel 2.4.17@玄箱/HG

HDD を玄箱/HG に接続して起動してみる
Vine Linux 3.1 (Pichon Lalande)
Kernel 2.4.17_mvl21 on a ppc
login: yasunari
Password:
Last login: Sun Dec 19 15:55:25 from ns.yamasita.jp
-bash-2.05b$ cat /proc/meminfo
        total:    used:    free:  shared: buffers:  cached:
Mem:  130138112 19025920 111112192        0  3211264 10555392
Swap: 134692864        0 134692864
MemTotal:       127088 kB
MemFree:        108508 kB
MemShared:           0 kB
Buffers:          3136 kB
Cached:          10308 kB
SwapCached:          0 kB
Active:           5384 kB
Inactive:         9840 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       127088 kB
LowFree:        108508 kB
SwapTotal:      131536 kB
SwapFree:       131536 kB
-bash-2.05b$
無事起動。

浦島さん、情報ありがとうございます。
私の力では絶対この方法は見つからなかったでしょう。



ハックの記録 → Vine 3.1(12)glibc を入れ換えてインストール
LinkStation/玄箱 をハックしよう

Copyright (C) 2004 Yasunari Yamashita. All Rights Reserved.
yasunari @ yamasita.jp 山下康成@京都府向日市