newlibの導入

newlibというのは軽量なライブラリです。
libc,libmなどをユーザプロセスが使うために導入します。

newlibを作成する環境はi686なんですが、自作OSはi486なので、合わせないといけない(多分。実際は分からないだけ//)
なのでconfigure --target=i386-elfしてmakeしてmake installするわけだけれども、とにかく失敗が続いて全然進まなかった
gccbinutilsのクロス環境を作らなくちゃいけないので、それぞれ依存関係を解決しつつコンパイルしたが、gccコンパイルは最後までできなかった
だけどなぜかnewlibのコンパイルは通ってしまった。(本来はelf-i386-ccが必要になるはず?)
まぁよくわからんままに成功してしまった

newlib/lib とnewlib/includeをそれぞれコピーして自作OSに持ってきて試しにコンパイル&リンク

//コンパイルしたファイル
#include<stdio.h>

int main(void){
  printf("test \n");//libc
}


すると解決できないシンボルが出てきた

/usr/newlib-i386/lib/libc.a(vfprintf.o): In function `.L705':
vfprintf.c:(.text+0x1e18): undefined reference to `__udivdi3'
vfprintf.c:(.text+0x1e49): undefined reference to `__umoddi3'
/usr/newlib-i386/lib/libc.a(svfiprintf.o): In function `.L149':
vfprintf.c:(.text+0x1f90): undefined reference to `__udivdi3'
vfprintf.c:(.text+0x1fbd): undefined reference to `__umoddi3'
/usr/newlib-i386/lib/libc.a(vfiprintf.o): In function `.L150':
vfprintf.c:(.text+0x2078): undefined reference to `__udivdi3'
vfprintf.c:(.text+0x20a5): undefined reference to `__umoddi3'
/usr/newlib-i386/lib/libc.a(svfprintf.o): In function `.L697':
vfprintf.c:(.text+0x2318): undefined reference to `__udivdi3'
vfprintf.c:(.text+0x2349): undefined reference to `__umoddi3'
make: *** [user.elf] Error 1

検索すると、どうやらlibgccに存在するシンボルらしい。クロス用のgccがいるのか?と思ったが一応libgccを探してみる。
見つかったlibgccをobjdumpで見てやると、なんとi386用があるじゃないか。なぜだ。よくわからん。

とりあえず未解決エラーも解決された・・・

OBJS = user.elf
all: $(OBJS)

clean: 
	rm $(OBJS)
#サフィックスルール
.nas.o:
	$(NASM) $(NASM_OPTIONS) -f elf -o $@ $<
.c.o:
	$(CPP) -c -o $*.o $(CC_OPTIONS)  $<
.cpp.o:
	$(CPP) -c -o $*.o $(CPP_OPTIONS) $(CC_EXTRA_OPTIONS) $<
.cpp.elf:
	$(CPP) -c -o $*.o $(CPP_OPTIONS) $(CC_EXTRA_OPTIONS) $*.cpp
	ld -melf_i386 -T executable.ld -o $*.elf $*.o /usr/newlib-i386/lib/libc.a \
	/usr/newlib-i386/lib/libm.a \
        /usr/newlib-i386/lib/libpthread.a \
	/usr/lib/gcc/i486-linux-gnu/4.4/libgcc.a 

ライブラリを静的にコンパイルした結果どれだけ大きくなったかをobjdumpで調べてみる
ファイルの大きさが180kbあった
メモリに読み込まれるコードとデータの大きさは0x24a00バイトあった
これはでかい!printfだけでこの有様だよ!

さてあとはこれがちゃんと動くようにシステムコールを整備しないといけない
ちゃんと動くのかもまだ未確認
頑張ろう