リンカの必要性ってなんですか?
例えば、自作したCPUでアセンブリプログラムでプログラムを組む上で、アセンブリプログラムの為のアセンブルを作るとします。
その際にリンカをつくる必要はあるのでしょうか?
単純にアセンブリ命令を機械語に変換するだけのアセンブラにリンカは必要なのかと思いました。
また、pcのCPUのアセンブリ言語もCPUに対してだいたいが一対一で対応しているため
以上と同じ単純な原理に思えてリンカの必要性がわかりません。
というかどこでリンカが働いているのやら。
なんか、リンカスクリプトとかもありますが、リンカ同様にどこで働いているんだろうという感じです。
No.1
- 回答日時:
>また、pcのCPUのアセンブリ言語もCPUに対してだいたいが一対一で対応しているため
>以上と同じ単純な原理に思えてリンカの必要性がわかりません。
複数のソースリストで1つのプログラムを作成
する場合を考えてみてください。
ソースリストAの10番地目にあるサブルーチン
をソースリストBから呼び出したい場合
どうしたらよいでしょう?
アセンブラではとりあえずソースリストBを機械語に変換しますが、
CALL命令のアドレス部
はソースリストAがメモリ上のどこに配置される決まってからでないと決まりませんよね。
これを決めてソースリストAB全体で一つのプログラムにするのがリンカの役目です。
また、メモリ空間が小さくて、プログラム全体がメモリ全体に入りきらない場合、
ソースリストAのサブルーチンが使いたくなった場合、リンカにお願いして、
空いているメモリに当該する機械語になったプログラムを配置して、
呼び出したいサブルーチンのアドレスを計算して、
そのアドレスをソースリストBのCALL命令のアドレス部に書き込んでもらってから
ソースリストBの機械語を実行する
ソースリストCのサブルーチンが使いたくなった場合、やはりリンカにお願いして、
ソースリストAが使っていたメモリ空間にソースリストCの機械語になったプログラムを配置して、以降同じようにアドレス部を完成させて実行する
といった荒業も可能になります。
ありがとうございます。
ちなみに、リンカの複数のプログラムを一つにするという作業をリンカにお願いせずに自分で手作業?で一つにする事は出来ないのでしょうか?
No.2
- 回答日時:
>ちなみに、リンカの複数のプログラムを一つにするという作業をリンカにお願いせずに自分で手作業?で一つにする事は出来ないのでしょうか?
できますよ。
ソースリストの段階でプログラムを一つにすればできますが、普通、作業効率が悪いのでやらないと思いますけど・・
No.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は作れるかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# 1. 仮想CPU「exmini」を使用して,「$dataからn減算する」プログラムを作成してください 2 2022/07/04 17:49
- システム CPUの問題について 2 2022/07/09 12:04
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- その他(コンピューター・テクノロジー) Windows 11 Version 22H2 の (KB5023706)のアップデートに失敗する 2 2023/03/25 21:06
- 仮想通貨(暗号通貨) ディープラーニングなど AI が投資でも人間を抜くだろうと言われています 仮想通貨 AI を使用して 4 2023/02/25 22:05
- Windows 10 Windows11のパソコンについての質問2。 5 2022/12/03 14:16
- その他(ゲーム) Windowsアスカ見参プレイするのに下の通りのが必要みたいですがメモリー、ビデオメモリーHDD別々 3 2022/09/19 23:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
volatile修飾について
-
C++ で、「)」が必要 というエ...
-
Linux/Unix系C言語...
-
【エラー】Cpadで初めてコンパイル
-
0除算して、落ちるプログラムと...
-
IntelのMKLをC++で使用したいの...
-
無償ボーランドC++5.5の...
-
PICマイコンでGIEビットが1に出...
-
関数の返す値で直接Bitをセット...
-
COBOLのEVALUATE文について
-
インクリメント演算子のみを用...
-
Vba 実数および実数タイプの変...
-
Notepad++の関数リスト表示でC...
-
Stuck
-
自動クエリとはどういうもので...
-
プログラミング
-
ruby
-
正しい五十音順について
-
PICマイコンのコピー(クローン...
-
これはDos攻撃になりますか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
変数(関数)名の頭に_
-
Visual C++とVisual C++.NETの違い
-
Eclipseの環境設定について
-
volatile修飾について
-
コンパイラについて
-
linuxのセキュリティ対策と致し...
-
__extension__
-
io.hをincludeするとそのような...
-
コンパイラフラグ(compiler fla...
-
PICマイコンによる乱数の表示に...
-
conio.h? curses.h?
-
【エラー】Cpadで初めてコンパイル
-
ABAQUS ユーザーサブルーチン...
-
関数の戻り値による変数の初期化
-
Delphiの逆コンパイル
-
プリコンパイラとは?
おすすめ情報