Linuxダイナミックリンクライブラリの使用

Linuxダイナミックリンクライブラリの使用

通常のプログラムと比較すると、ダイナミック リンク ライブラリにはメイン関数がなく、一連の関数の実装です。共有および fPIC コンパイル パラメータを使用してダイナミック リンク ライブラリ ファイルを生成します。プログラムがライブラリ関数を呼び出すときは、このライブラリに接続するだけで済みます。たとえば、次の例では、単純な整数演算トランスポート ダイナミック リンク ライブラリを実装し、calculate.h と calculate.c という 2 つのファイルを定義し、libcac.so ダイナミック リンク ライブラリを生成します。

バイナリファイルに役立つコマンド

ファイルの種類を確認してください

ファイル

バイナリがリンクされているライブラリを確認する

ldd

バイナリファイルに含まれるシンボルを表示します。Tはロード中、Uは未定義のシンボルを意味します。

ナノメートル

バイナリファイルから情報を読み取る

readelf -a smu.o

バイナリファイルをアセンブリに変換する

objdump -d 合計.o

ダイナミックリンクライブラリの生成

合計.c

#include <stdio.h>
#include <stdlib.h>

int 合計(int x){
 int i、結果=0;
 (i=0; i<=x; i++){
  結果+=i;
  }
 (x > 100)の場合
  終了(-1);
 結果を返します。
};

void display(char* msg){
 printf("%s\n",メッセージ);
}
 
int add(float a,float b){
 a+b を返します。
}

int sum_array(int 配列[], int 数値){
 int i = 0、合計 = 0; 
 (i=0; i<num; ++i) の場合 
  合計 += 配列[i];
 合計を返します。
}

voidmodify_array(int配列[], int数値){
 int i = 0、合計 = 0; 
 (i=0; i<num; ++i) の場合 
  配列[i] *= 10;
}

メイン.c

#include <stdio.h>
#include <stdlib.h>

int main(void){
 整数x;
 printf("整数を入力してください:\n");
 scanf("%d", &x);
 printf("合計=%d\n", sum(x));
 0を返します。
};

実行ファイルを生成する

gcc -c main.c -o main.o
gcc -c sum.c -o sum.o
gcc 合計.o メイン.o

メインの実行ファイルが生成されます

ファイル main // ELF 64 ビット LSB 実行可能ファイル
ファイル sum.o // ELF 64 ビット LSB 再配置可能

sum.cには再利用可能な関数が含まれているため、sum.cをダイナミックリンクライブラリにコンパイルしたい。

gcc sum.o -shared -o sum.so

エラーが発生しました。

/usr/bin/ld: sum.o: 未定義のシンボル `exit@@GLIBC_2.2.5' に対する再配置 R_X86_64_PC32 は、共有オブジェクトの作成時には使用できません。-fPIC で再コンパイルしてください。
/usr/bin/ld: 最終リンクに失敗しました: 値が不正です
collect2: エラー: ld が 1 終了ステータスを返しました

つまり、すべての .o ファイルをダイナミック リンク ライブラリにコンパイルできるわけではありません。.o ファイルを生成するときは、パラメータ -fPIC を追加する必要があります。

gcc -c sum.c -fPIC -o sum.o
gcc sum.o -o 共有 sum.so

一般的に、共有ライブラリのコンパイルコマンドは(前回の実験)

ダイナミック リンク ライブラリ

gcc -shared -fPIC -o libmyhello.so hello.o
gcc -o hello main.c -L. -lmyhello

静的リンク

ar rcs libxx.a xx.o 
g++ -o main main.cpp -static -L. -lxx

現時点では

g++ -o メイン main.c sum.so
。/主要 

時々エラーが報告される

共有ライブラリのロード中にエラーが発生しました: sum.so: 共有オブジェクトファイルを開けません: そのようなファイルまたはディレクトリはありません

lddメイン
出力:
sum.so => 見つかりません

この時点で、

エクスポート $LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH

注: -fPIC は .o を生成するときに使用され、-shared はダイナミック リンク ライブラリを生成するときに使用されます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux のハードリンクとソフトリンクの詳細な紹介
  • Linux のソフトリンクとハードリンクの詳細な説明
  • Linux ソフトリンクと Linux ハードリンクとは何か
  • Linux カーネル デバイス ドライバー カーネル リンク リストの使用上の注意
  • Linux でのダイナミック リンク ライブラリの読み込みパスと検索パスに関する問題
  • Windows と Linux でダイナミック リンク ライブラリを呼び出す Python チュートリアル
  • Linuxリンクコンパイルの詳細な説明
  • Linux のハードリンクとソフトリンクの原理と使用法の分析

<<:  JS の効率的なマジック演算子の概要

>>:  phpmyadmin を使用して MySQL 権限を設定する方法

推薦する

MySQLインスタンスクラッシュ事例の詳細な分析

[問題の説明]私たちの実稼働環境には、複数の MySQL サーバー (MySQL 5.6.21) の...

kindとDockerを使用してローカルKubernetes環境を起動する

導入Kubernetes を使い始めるのに丸一日を費やしたことはありませんか?最近登場したいくつかの...

MySQL 起動エラー 1067 および文字セットを変更して再起動した後の無効な回復

公式サイトからmysql-5.6.37-winx64.zipの解凍バージョンをダウンロードし、構成フ...

Linux で LVGL エミュレータをコンパイルする際のエラーの解決方法

目次1. エラー現象2. エラー分析3. エラー解決1. エラー現象仮想マシンでLVGLエミュレータ...

MySQLクエリ文を書き換える3つの戦略

目次複雑なクエリとステップバイステップのクエリクエリステートメントを分割する共同クエリの分解問題のあ...

MySQLでストアドプロシージャをデバッグする最も簡単な方法

同僚から、一時テーブルを使用して変数データを挿入して表示する方法を教わったことがありますが、この方法...

CentOS に Docker をインストールし、Springboot で Docker をリモート公開する方法

目次1. CentOS7.0へのJDK1.8のインストール2. Dockerのインストール3.Doc...

MySQL の一時テーブルと派生テーブルについての簡単な説明

派生テーブルについてメイン クエリに派生テーブルが含まれている場合、または SELECT ステートメ...

Vue3デスクトップアプリケーションの構築方法

この記事では、Vite を使用して Vue 3 デスクトップ プロジェクトを開発する方法について説明...

CSS3 は反転可能なホバー効果を実現します

CSS3 は反転可能なホバー効果を実装します。具体的なコードは次のとおりです。 1.css /*基本...

知っておくべきHTML最適化テクニック

Web ページのパフォーマンスを向上させるために、多くの開発者は、JavaScript、画像の最適化...

MySql バージョンの問題に対する完璧なソリューション sql_mode=only_full_group_by

1. sql_modeを確認する @@sql_mode を選択照会された値は次のとおりです。 ON...

Windows での MySQL 8.0.11 インストール チュートリアル

この記事は、WindowsでのMySQL 8.0.11のインストールチュートリアルを記録しています。...

Workbench を介して MySQL データベースにリモートでアクセスする方法の詳細な説明

序文Workbench が 1 台のコンピューターにインストールされており、別の Ubuntu サー...

Linux サーバーでフォルダー、ファイル、解凍コマンドを削除する方法

1. フォルダを削除する例: rm -rf /usr/java /usr/javaディレクトリとその...