Linux

db79d2e4 anonymous 2009-09-18 19:25
Linux、UNIXに関するあれこれ。
1a026ee0 anonymous 2009-09-18 20:06
[[書き込みテスト]]の続き。

Linux from FreeBSDが何とかやれそうだ。簡単かと思いきやCygwin以上に手こずったのは意外。
いきなりglibcはクロスコンパイルできないのでまずはuClibcをクロスコンパイルする必要があるみたい。
古いglibcでもいいのかもしれないけれど探すの面倒だし。
busyboxはuClibcでクロスコンパイルするとmountコマンドが正しく動かないっぽい。glibcでクロスコンパイルしたものは正常。
busyboxはクロスコンパイルでもパッチを当てる必要がある。パッチ内容はportsのbusyboxを参照すればいけた。

とりあえずここまで。現在は再試中。glibcのコンパイルがうまく行かないなー。
(syntax errorとか。ううむ)。
30bcbf4b anonymous 2009-09-20 13:27
>>1a026ee0
再試というか追試というか、飽きて途中で投げた。
i386-hogehoge-linuxのi386がより後のCPUをターゲットとしたbinutils&gccなら問題なくglibをクロスコンパイルできるみたい(i486-pc-linuxとかi586-glibc-linuxとか)。

ファイルサイズ最小Linux開発環境(圧縮時1Mバイト以内) とか
ファイル数最小Linux開発環境(バイナリ7ファイル(busybox込みシンボリックリンク除く)) とかできた。
ファイル数最小は[[書き込みテスト/e9413834]]のやつだけどlibgcc.aの事前準備がいらなくなった、と思う。
その状態でbinutilsとgccの再コンパイルまでしかやってないからなにか勘違いがあるかも。別の場所にlibgcc.aがあってそっちを読んだとか。

先週までの成果
・ファイル数最小Linux開発環境(busybox, ar, as, ld, cc1, gcc, make, collect2, libgcc.a)

・ファイル数最小Linux開発環境(busybox, ar, as, ld, cc1, gcc, make)
になった。
・でもファイルサイズは圧縮時でも2Mバイト以上……。とほほ。

cc1がずば抜けて大きいんだよな。あとasとldもそれなりに。collect2とlibgcc.aはファイルサイズとしては大して大きくないから、これ2つ抜いてもファイルサイズ減少にはあまり貢献しないな。
1Mバイト少々なら新月ネットワークに流せるのに。そりゃ分割すりゃいいんだけなんだけどもね。
aa4e932a anonymous 2009-09-20 17:48
>>30bcbf4b
7zに頑張ってもらったら意外に小さくなったんで書いとく。
・tar+bzip2     最大圧縮で        2264467 バイト
・tar+lzma      最大圧縮で        1754092 バイト
・tar+xz       最大圧縮で        1752828 バイト
・7za        ノーマルで        1615627 バイト
・7za        最大圧縮で        1528328 バイト
・7za 非ディレクトリ最大圧縮で        1528306 バイト
・7za 非ディレクトリファイル名1文字最大圧縮で 1526357 バイト
新月のファイルサイズ制限がオリジナルのファイルサイズを見るものなら分割せずに流せるサイズだ。
ただ、新月の制限はbase64エンコード後のサイズ(オリジナルのおよそ1.5倍)を見てる気がするから、アウトだろうなー。

それにしてもdietlibcはすごいなー。
uClibcダイナミックリンクライブラリバージョンのbinutild+gccを作ってみたけど、dietlibcスタティックリンクライブラリバージョンよりもファイルサイズがデカくなってわらった。

そうそう、tccも相変わらずすごい。libtcc1.aがlibgcc.aの代わりになるんだから(要検証)。
tccでlibtcc1.aの代わりにlibgccを使うオプションがあるからそれなりに互換性があるんだろうとは思っていたけど、まさかここまで(binutilsやgccのコンパイルができる)とは。
a479b60a anonymous 2009-09-22 20:39
>>aa4e932a
busyboxのtelnetdに入れない〜。/dev/ptsをdevptsファイルシステム(?)でマウントしなきゃいけなかったらしい。
devfsとかprocとかsysfsとかtmpfsとかいっぱいあってよーわからん。devtmpfsなんてのも新しく入る(入った?)らしいし。
procとsysfsなんか分けなくてもいーんじゃねとか思ってたり。
busyboxのudhcpcも動かなくて散々悩んだけど、example/udhcpにあるスクリプトを所定の場所に実行権限をつけて置けばいいみたい。
(ifconfigコマンドならまだしもrouteコマンドなんて使い方覚えちゃいないから助かった)。
ad8b1621 anonymous 2009-09-26 14:35
>>aa4e932a
>>a479b60a
クリーンな環境(libgcc.aなし)でdietlibcがコンパイルできたのでlibtcc1.aでlibgcc.aの代わりになることは確認できた。
arはbinutilsにあるのでなく、tccのtiny_libmakerを使ってたんだけど、これファイル数が多いと正しいアーカイブを吐かないような感じ。
binutilsをコンパイルするのには使えるんだけど、dietlibcをコンパイルするのには使えないみたい。
dietlibc.aはオブジェクトファイル700ファイル以上アーカイブしないといけないからなぁ。
5ad40523 anonymous 2009-09-26 23:27
>>ad8b1621
今まで dietlibc → uClibc → glibc の順でコンパイルしてたけど、uClibcは要らないようだ。
そのためにglibcのconfigureをいじる必要があるけど(コンパイルのチェックとnptl/sysdeps/pthreadのunwind support。exit 1をtrue 1とかテキトーに変更)。
真っ当にconfigureを通すにはuClibc(uClibcでいけるんだから古いglibcでもいいはず)のlibc.aとcrt?.oがあればいいみたい。

glibcまでの手順。
ar as ld gcc cc1 make busybox(coreutils+find+sed+grep+awk)はstaticなもの、あるいは動作に必要なライブラリとともにあるものとする。
strip ranlibは何もしないシェルスクリプトで対応(ranlibはbinutilsに入っているスクリプトの方がいいかも)。

linux-2.6.30.5: make include/linux/version.h
              : cp -r include/asm-generic /usr/include
              : cp -r include/linux /usr/include
              : cp -r arch/x86/include/asm /usr/include
tcc-0.9.25: make libtcc1.a; cp -i libtcc1.a /usr/lib/libgcc.a
dietlibc-0.32: make && make install
binutils-2.19.1: (dietlibc用のパッチ当て、/opt/diet/include/strings.hの void bcopy 関数をコメントアウト)
               : mkdir bfd/sys; cp ../glibc-2.10.1/sysdeps/unix/sysv/linux/i386/sys/user.h bfd/sys
               : CC="/opt/diet/bin/diet gcc -nostdinc" ./configure --disable-nls && make && make install
(cd /usr/include; ln -s ../../opt/diet/include/* .) #一旦ヘッダーを/usr/includeへ。gccコンパイル後削除
gcc-3.4.6: (/opt/diet/include/strings.hのコメントアウトを戻す)
         : CC="/opt/diet/bin/diet gcc" ./configure --disale-nls --disable-shared && make && make install
(cd /usr/include; for i in *; do test -L $i && rm $i; done) #dietlibcなヘッダーはもう/usr/includeには要らない、削除
(rm /usr/lib/libgcc.a) #本物をコンパイルしたのでもう要らない
再びdietlibc-0.32: make dyn && make install
gawk-3.1.6: CC="/opt/diet/bin/diet-dyn gcc" ./configure && make && make install
(cd $(dirname `gcc -print-libgcc-file-name`; ln -s libgcc.a libgcc_eh.a) #Linux from Scratchによればlibgcc.aのシンボリックリンクでいいそうだ。glibcのコンパイル時に要求されるので
glibc-2.10.1: ../glibc-2.10.1/configure --prefix=/usr --enable-add-ons && make && make install

gawkがdiet-dynでコンパイルできたのが大きいな。
いままではuClibcでコンパイルしてたから、ライブラリまわりがごっちゃになったけどこれならすっきり。

tcc+uClibcな環境では不要なarとmakeのバイナリが必須なのがアレでナニだけど、ままいい感じ。
c881d1aa しげみち 2009-09-28 16:19
MIKO GNYO/Linuxは確認取れば再配布してもいいのかな?
なかなかBitTorrentでの配布が始まらないからやってみたいんだが。
e280d505 anonymous 2009-10-03 21:53
>>30bcbf4b
>>5ad40523
Linux from FreeBSD 完。
Linuxカーネルコンパイル時にはelf.hをFreeBSDのヘッダと置き換えるとか、ある種黒魔術っぽいことが必要だけど、それ以外は概ね簡単。
それとは別に、busyboxのnslookupでアドレスが引けないよーと半日くらい悩んでた。
分かってしまえば簡単なことで、このbusyboxはFreeBSD上でglibcを用いてスタティックにクロスコンパイルしたものだけど、libnss*はスタティックにしてなっかたという。
glibcには--enable-static-nssというコンパイルオプションがあるんだけど、ものの見事にエラー多数(Ver 2.10.1)。
テストしてないんかなー。そりゃしてないだろうなー、FreeBSD上でのクロスコンパイルで--enable-static-nssなんて。
あらためてuClibcでクロスコンパイルしたらうまくいきました。前にuClibcでクロスコンパイルしたときはmountが正しくできなかったんだけど、今回はそんなことはなかった。
クロスコンパイラの作り方が分かってきたからか、FreeBSDのバージョンが違うからか(前回8.0RC2くらい、今回7.2)。
cbf46b5c anonymous 2009-10-03 21:55
今北産業
90fb00a8 anonymous 2009-10-03 23:53
>>cbf46b5c
Linux使わずに
Linuxデキタヨ
たのしいな

Top of this page. | <<last <<new 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

limit: 1536KB

(Linux/2761/6.9MB)

Powered by shinGETsu.