プロが教えるわが家の防犯対策術!

リンカの必要性ってなんですか?
例えば、自作したCPUでアセンブリプログラムでプログラムを組む上で、アセンブリプログラムの為のアセンブルを作るとします。
その際にリンカをつくる必要はあるのでしょうか?
単純にアセンブリ命令を機械語に変換するだけのアセンブラにリンカは必要なのかと思いました。
また、pcのCPUのアセンブリ言語もCPUに対してだいたいが一対一で対応しているため
以上と同じ単純な原理に思えてリンカの必要性がわかりません。
というかどこでリンカが働いているのやら。
なんか、リンカスクリプトとかもありますが、リンカ同様にどこで働いているんだろうという感じです。

A 回答 (3件)

結論は「理論的にリンカが絶対必要な理由はない。

ただし、作業効率を考えると無しは難しい。」です。

リンカが行っている作業の内容は思いに以下の通りです。
1.コンパイラが生成したオブジェクト同士の結合
2.OS機能やDLL呼び出しの為のスタブ結合
3.プログラミング言語ライブラリの結合
4.コンパイラが生成したオブジェクトを超えた呼び出し(メソッド呼び出しやほかのクラス等のPublicフィールドや外部変数へのアクセス)を行っている個所のアドレスを仮値から真値への書き換え

より大きな視点で見ればコンパイラの出力を実行可能なEXEファイルに加工する作業です。

このうち1と2と3はほとんどファイル結合するだけですので手作業だけでもそれほど難しくなく行えます。
4が問題になるところで、コンパイラによって差はあれWindowsでプロセスをただ立ち上げて終了するだけ(C言語で言うMain関数の処理なし)のプログラムを作っただけで数十カ所の書き換えが必要になります。
結合対象のオブジェクトのサイズ、OS機能やDLL呼び出しの為のスタブのサイズ、呼び出し元と呼び出し先の間に入るオブジェクトのサイズ、呼び出し元と呼び出し先の間に入るスタブのサイズ等の多くの条件を考慮しながら真値を計算し、すべての個所を間違いなく置き換える作業を何百万、何千万と人が行う事は不可能に近いです。
バイナリファイルを直接編集できるからコンパイラやアセンブラは絶対必要なわけではないけれど、無いと大変困るという事例に大変似ています。

独自CPUとの事ですのでi386のCALL命令やRET命令に相当する命令を実装せずJMP相当の命令で代用し、かつ、コンテキストスイッチを実装せず、OS、アプリケーションを問わずシングルプロセスしか許容しないという設計にすればリンカが存在しない・できないCPUは作れるかもしれません。
    • good
    • 0

>ちなみに、リンカの複数のプログラムを一つにするという作業をリンカにお願いせずに自分で手作業?で一つにする事は出来ないのでしょうか?


できますよ。

ソースリストの段階でプログラムを一つにすればできますが、普通、作業効率が悪いのでやらないと思いますけど・・
    • good
    • 0
この回答へのお礼

MSDOSを使うのでしょうか?

お礼日時:2018/03/14 19:11

>また、pcのCPUのアセンブリ言語もCPUに対してだいたいが一対一で対応しているため


>以上と同じ単純な原理に思えてリンカの必要性がわかりません。

複数のソースリストで1つのプログラムを作成
する場合を考えてみてください。

ソースリストAの10番地目にあるサブルーチン
をソースリストBから呼び出したい場合
どうしたらよいでしょう?

アセンブラではとりあえずソースリストBを機械語に変換しますが、
 CALL命令のアドレス部
はソースリストAがメモリ上のどこに配置される決まってからでないと決まりませんよね。
これを決めてソースリストAB全体で一つのプログラムにするのがリンカの役目です。

また、メモリ空間が小さくて、プログラム全体がメモリ全体に入りきらない場合、
ソースリストAのサブルーチンが使いたくなった場合、リンカにお願いして、
 空いているメモリに当該する機械語になったプログラムを配置して、
 呼び出したいサブルーチンのアドレスを計算して、
 そのアドレスをソースリストBのCALL命令のアドレス部に書き込んでもらってから
ソースリストBの機械語を実行する
 ソースリストCのサブルーチンが使いたくなった場合、やはりリンカにお願いして、
 ソースリストAが使っていたメモリ空間にソースリストCの機械語になったプログラムを配置して、以降同じようにアドレス部を完成させて実行する
といった荒業も可能になります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ちなみに、リンカの複数のプログラムを一つにするという作業をリンカにお願いせずに自分で手作業?で一つにする事は出来ないのでしょうか?

お礼日時:2018/03/14 18:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!