通常のターゲットファイルのシンボル解析と再定義処理ポリシー


一、一般的なターゲットファイルとは
静的リンクldは、再配置可能なターゲットファイルのセットを実行可能なターゲットファイルにリンクすることができる.再配置可能なターゲットファイルは、ターゲットファイル(.o)、静的リンクライブラリ(.a)、動的リンクライブラリ(.so)の3種類です.本明細書で指す一般的なターゲットファイル特殊「ターゲットファイル(.a)」
二、記号とは何か
1.シンボルとは、コード内の変数と関数を指します.コード内のキーワードはシンボルに属しません.2.記号は以下の4種類に分けられる:(1)引き出し可能記号は本モジュールによって定義され、本モジュールと他のモジュールによって参照可能な記号は非Staticグローバル関数であり、非staticグローバル変数はいずれも引き出し可能記号(2)外部記号は他のモジュールによって定義されるが、本モジュールによって参照された記号である.他のモジュールの引出可能符号は、本モジュールで使用すると、本モジュールの外部符号外部符号変数がextern修飾(3)静的符号が本モジュールによって定義され、本モジュールで参照されるのみの符号帯staticのグローバル変数およびグローバル関数が静的符号(4)局所符号が関数内部で定義非static変数3である.例を挙げる
extern int buf[];
static int *bufp0 = &buf[0];
int *bufp1;
void swap()
{
    int temp;
    bufp1 = &buf[1];
    temp = *bufp0;
    *bufp0 = *bufp1;
    *bufp1 = temp;
}

上の内容を用いて,このコードの中の記号を分類する.
シンボル名
シンボルタイプ
buf
がいぶきごう
bufp0
スタティツクシンボル
bufp1
引き出し可能シンボル
swap
引き出し可能シンボル
temp
ローカルシンボル
三、シンボル解析
シンボル解析とは,シンボルの定義と参照を結びつけることである.異なるシンボルタイプ、解析のポリシーが異なります.理解しやすいように、ここでは順序を乱して、最も簡単なことから言います.4.ローカルシンボルリンクは、ローカルシンボルがスタック内で管理されているため、ローカルシンボルには少しも関心がありません.3.静的シンボルリンクの静的シンボルの処理は比較的簡単である.静的シンボルの定義と参照は同じモジュールにあるに違いないからである.モジュール内の1つのシンボルが1つの定義しかないことを保証すればよい.2.外部シンボルコンパイラは、モジュール内のシンボルが定義されていないことを発見すると、シンボルテーブルに配置され、リンクは他のモジュールからこれらのシンボルの定義を見つけます.1.引き出し可能な記号引き出し可能な記号の処理は複雑で、すべてのモジュールからこの記号の定義を検索するには、再定義の問題も処理しなければならない.
四、記号再定義の処理策略
外部シンボルと引き出し可能シンボルの解析中に、シンボルの再定義の問題が発生する可能性があります.リンクがシンボル再定義を発見した場合、どのように処理しますか?それは間違っていますか?答えは「必ずしも」ではない.場合によっては、リンクが再定義されたことを発見すると、リンクエラーが表示され、問題をタイムリーに発見できます.しかし、リンクは、他の定義を無視して定義の1つをこっそり選択し、定義しにくいBUGを生成する場合があります.1.強弱シンボルルールリンクは、強弱シンボルルールを使用して、シンボル再定義の問題をどのように処理するかを決定します.(1)最大1つの強い記号が存在し,複数の強い記号が現れるとリンクが誤る(2)1つの強い記号と複数の弱い記号がある場合は強い記号を選択(3)複数の弱い記号がある場合は弱い記号の中から任意に1つを選択することから,誤りを報告しないことから,再定義導入の問題をタイムリーに発見するために,できるだけ記号を強い記号として定義します.2.強い記号とは何か、弱い記号とは何か
きょうきごう
(1)関数(2)初期化されたグローバル変数
弱記号
初期化されていないグローバル変数