3: 2010-01-16 (土) 19:18:21 lina[6] [7] | 4: 2010-01-17 (日) 00:54:56 lina[6] [8] | ||
---|---|---|---|
Line 80: | Line 80: | ||
COLOR(red){もちろん単にここを小さくするのは問題のはずだ。なぜこの値を指定していたのかは、ちゃんと意味があるんだからね。・・・でも、とにもかくにも、ここで宣言されている''値''によってNASKの挙動が左右されるってことだけは確認できた。正式な対処はちょっと先送りで、進めまするw} | COLOR(red){もちろん単にここを小さくするのは問題のはずだ。なぜこの値を指定していたのかは、ちゃんと意味があるんだからね。・・・でも、とにもかくにも、ここで宣言されている''値''によってNASKの挙動が左右されるってことだけは確認できた。正式な対処はちょっと先送りで、進めまするw} | ||
+ | |||
+ | |||
+ | *ld.exe [#b58350ff] | ||
+ | さていよいよldの登場ですw~ | ||
+ | |||
+ | **なんなの?それは??? [#e83060e6] | ||
+ | 今、まだ積み残しの問題があるとしても、とにもかくにもnasuka(NASK)がアセンブル(コンパイル)を完了してosalink1.oを作ってくれました。これはもうバイナリです。(いままでと違ってエディタでは開けませんよw バイナリエディタでないと) | ||
+ | |||
+ | じゃあ、このバイナリは動かせるのでしょうか?~ | ||
+ | 答えは No! です。 | ||
+ | |||
+ | なぜかって? このosalink1.oには''プログラムが書かれていないから''ですw | ||
+ | |||
+ | たとえば。「xxxをディスクに書き込みする」という命令があるとします。仮に、その命令は、 | ||
+ | |||
+ | 51 01 89 C2 C1 FA 10 C1 F8 18 88 51 02 88 41 03 5D C3 55 89 E5 8B 55 08 5D 0F B6 02 0F B6 52 01 | ||
+ | |||
+ | こんなんだとしますよね? (もちろん機械語ですよw) この命令をはじめから実行してゆくと、ディスクが動いて磁気ヘッドに電流を流し、書き込みを行うとします。 | ||
+ | |||
+ | ・・・しかし、この段階では、この命令はosalink1.o内には書かれていないのです。~ | ||
+ | 同じように、他の命令も書かれていません。 | ||
+ | -画面に一文字書き出せ | ||
+ | -メモリをxxxバイト確保しろ | ||
+ | -書かれている文字を数値に変換して計算し、結果を再び文字に変換しろ | ||
+ | -etc・・・・ | ||
+ | |||
+ | osalink1.o内には様々な動作をする命令がちゃんと沢山書かれているのですが、上記のようなよく使われる大事な命令達は書かれていません。では、そういう命令はどうするのでしょう? これから自分で別に作るのでしょうか?? | ||
+ | |||
+ | もちろんそれも可能です。しかし、こういうよく使われる・いろいろなプログラムから共通で統一的に使われる命令達はライブラリ(図書館?)と呼ばれる別のファイルに、あらかじめ書かれ、すでに用意されているのです。 | ||
+ | |||
+ | ldは「リンカ」と呼ばれるプログラムで、こういったバラバラの部品として完成しているファイル(中間ファイル・オブジェクトファイルなどと呼ばれる)をお互いに合体させ、最後にキチンと本当に動くプログラムに組み立てるという働きをするのです。 | ||
+ | |||
+ | |||
+ | |||
+ | **さて! いざ、リンク! [#q664086e] | ||
+ | ..\z_tools\ld.exe --stack 0x2000000 -o osalink1.exe osalink1.o ..\z_tools\win32/libmingw.lib | ||
+ | |||
+ | ・・・ダメだった・・・・orz・・・(やっぱみようみまねじゃアカンなw) | ||
+ | |||
+ | ..\z_tools\ld.exe: warning: cannot find entry symbol _mainCRTStartup; defaulting to 00401000 | ||
+ | osalink1.o(.text+0x85):osalink1.ca: undefined reference to `__main' | ||
+ | osalink1.o(.text+0xba):osalink1.ca: undefined reference to `fopen' | ||
+ | osalink1.o(.text+0xdf):osalink1.ca: undefined reference to `fscanf' | ||
+ | osalink1.o(.text+0xf4):osalink1.ca: undefined reference to `fopen' | ||
+ | osalink1.o(.text+0x11d):osalink1.ca: undefined reference to `fread' | ||
+ | osalink1.o(.text+0x125):osalink1.ca: undefined reference to `fclose' | ||
+ | osalink1.o(.text+0x164):osalink1.ca: undefined reference to `tolower' | ||
+ | osalink1.o(.text+0x262):osalink1.ca: undefined reference to `fclose' | ||
+ | osalink1.o(.text+0x270):osalink1.ca: undefined reference to `__stderr' | ||
+ | osalink1.o(.text+0x275):osalink1.ca: undefined reference to `fprintf' | ||
+ | |||
+ | さて。このエラーはなんだろうか?~ | ||
+ | 上記の命令だと、osalink1.oとlibmingw.libを合体させてosalink1.exeを作り出せってしてるんだけど、ldはいざ合体させ始めると、 | ||
+ | |||
+ | 「おいおい! osalink1.o内で、fopenって命令を使ってるじゃないかよ! osalink1.o内にも、libmingw.lib内にも、その命令は書かれてないぞ? 命令が間違ってるんじゃね? もしくは、これらが書かれているライブラリを教えてよ!」 | ||
+ | |||
+ | と、こういう答えを出して来たと。こういうわけ。 | ||
+ | |||
+ | 他のライブラリを指定してあげれば、それらから命令を拾ってきて合体させてくれる。これでOKだ!!! | ||
+ | |||
+ | ..\z_tools\ld.exe -s -Bdynamic --stack 0x2000000 -o osalink1.exe osalink1.obj ..\z_tools\win32\w32clibc.lib ..\z_tools\win32 \golibc.lib ..\z_tools\win32\libmingw.lib | ||
+ | |||
+ | osalink1.obj(.text+0xda):osalink1.ca: undefined reference to `fscanf' | ||
+ | osalink1.obj(.text+0x15f):osalink1.ca: undefined reference to `tolower' | ||
+ | osalink1.obj(.text+0x41a):osalink1.ca: undefined reference to `tolower' | ||
+ | osalink1.obj(.text+0x45d):osalink1.ca: undefined reference to `tolower' | ||
+ | |||
+ | ・・・ダメですた・・・orz・・・ | ||
+ | |||
+ | あっれぇ?? 今、ざーっと調べてみたんだけど、そういえばz_tools\win32\stdio.h内にはfscanfって関数、ないような・・・ | ||
+ | |||
+ | COLOR(red){さらに発覚! tolower関数は、あの、''ctype.h''で定義されている命令なんだって!? ・・・うわぁ・・・まいったなぁ・・・} |
(This host) = http://osask.net