スタティックライブラリとダイナミックライブラリの動作について

目次

静的ライブラリ

ダイナミックライブラリ

1. .o ファイルを追加します。

2. .o ファイルを削除します。

静的ライブラリと動的ライブラリの関数名を表示する

1. 静的ライブラリ内の関数名を表示します (libexample.a を例にします)。

2. ダイナミック ライブラリ内の関数名を表示します (例として libexample.so を使用します)。

ダイナミックライブラリとスタティックライブラリが32ビットか64ビットかを確認する

1. 動的ライブラリの場合は、ファイル *.so を使用できます。  

2. 静的ライブラリの場合は、objdump -x *.a を使用できます。


静的ライブラリ

.o ファイルを静的ライブラリに追加するには、次の手順が必要です。

  1. ar コマンドを使用して、libexample.a などの静的ライブラリ ファイルを作成します。

    ar rcs libexample.a example1.o
    

    このコマンドは、静的ライブラリ ファイル libexample.a を作成し、それに example1.o ファイルを追加します。

  2. 新しい .o ファイルを追加する必要がある場合は、次のコマンドを使用できます。

    ar rcs libexample.a example1.o example2.o
    

    このコマンドは、example2.o ファイルを libexample.a に追加します。

  3. .o ファイルを削除する必要がある場合は、次のコマンドを使用できます。

    ar d libexample.a example1.o
    

    このコマンドは、example1.o ファイルを libexample.a から削除します。

        または、次のコマンドを使用することもできます。

ar -x libexample.a
rm example1.o
ar rcs libexample.a *.o

まず ar -x を使用して静的ライブラリを解凍し、次に対応する .o ファイルを削除して、残りの .o ファイルを再パッケージします。

ダイナミックライブラリ

1. .o ファイルを追加します。

新しい .o ファイルを so ライブラリに追加する必要がある場合は、新しいソース ファイルを .o ファイルにコンパイルし、次に 1d コマンドを使用して複数の .o ファイルを新しい .so ライブラリ ファイルにリンクします。 :

gcc -c -fPIC -o new file.o new file.c
ld -shared -o new lib.so old lib.so new file.o

このうち、-c オプションはオブジェクト ファイルへのコンパイルを意味し、-fPIC オプションは位置に依存しないコードへのコンパイルを意味し、-shared オプションは共有ライブラリへのリンクを意味します。このようにして、新しい .o ファイルを元の .so ライブラリ ファイルに追加できます。


2. .o ファイルを削除します。

so ライブラリ内の .o ファイルを削除する必要がある場合は、ar コマンドを使用してその中のすべての .o ファイルを抽出し、不要な .o ファイルを削除して、最後に残りの .o ファイルを新しい .o ファイルに再パッケージ化します。 o ファイル: ライブラリ ファイル、たとえば:

ar -x old lib.so
rm old file.o
gcc -shared -o new lib.so *.o

このうち、-x オプションはすべての .o ファイルを抽出することを意味し、-shared オプションは共有ライブラリに再リンクすることを意味します。

静的ライブラリと動的ライブラリの関数名を表示する

次のコマンドを使用して、静的ライブラリと動的ライブラリの関数名を表示できます。

1. 静的ライブラリ内の関数名を表示します (libexample.a を例にします)。

nm libexample.a

このコマンドは、関数名、変数名などを含む、libexample.a 内のすべてのシンボルをリストします。

2. ダイナミック ライブラリ内の関数名を表示します (例として libexample.so を使用します)。

nm -D libexample.so

このコマンドは、libexample.so 内のエクスポートされた関数名をすべてリストします。ダイナミック ライブラリにはまだエクスポートされていない関数と変数がいくつかあることに注意してください。これらのエクスポートされていないシンボルは、次のコマンドで表示できます。

nm libexample.so

このコマンドは、エクスポートされたものとエクスポートされなかったものの両方の libexample.so 内のすべてのシンボルをリストします。

T クラス: ライブラリで定義された関数であり、最も一般的な T で表されます;    
U クラス: ライブラリで呼び出されますが、ライブラリで定義されていません (他のライブラリ サポートの必要性を示します)。 U;    
W クラス: いわゆる「弱い状態」シンボル。ライブラリ内で定義されていますが、W で表される他のライブラリ内の同じ名前のシンボルによって上書きされる可能性があります。

例: nm *.so | grep printf (printf が *.so で参照されているかどうか)

ダイナミックライブラリとスタティックライブラリが32ビットか64ビットかを確認する

1. 動的ライブラリの場合は、ファイル *.so を使用できます。  

ダイナミック ライブラリ libexample.so が 32 ビットか 64 ビットかを確認します。

$ file libexample.so
libexample.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, B

2. 静的ライブラリの場合は、objdump -x *.a を使用できます。

objdump は、コード セグメント、データ セグメント、シンボル テーブル、再配置テーブル、動的シンボル テーブルなどを含むバイナリ ファイルのさまざまな情報を表示するために使用できる逆アセンブラです。objdump -x コマンドは、バイナリ ファイルのすべてのヘッダー情報を表示するために使用されます。

具体的には、objdump -x コマンドは、ファイル タイプ、システム アーキテクチャ、エントリ アドレス、セグメント テーブル、シンボル テーブル、動的シンボル テーブル、再配置テーブルなどを含む、バイナリ ファイルのさまざまなヘッダ情報を一覧表示します。この情報はバイナリのデバッグと分析に非常に役立ち、開発者がバイナリの構造と実行時の動作をより深く理解するのに役立ちます。

objdump -x コマンドはバイナリ ファイルのヘッダー情報のみを表示することに注意してください。より詳細な逆アセンブリ情報を表示する必要がある場合は、objdump -d コマンドなどの他の objdump コマンドを使用できます。

おすすめ

転載: blog.csdn.net/L888666Q/article/details/131009264