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 権限を設定する方法

推薦する

Vue コンポーネント値転送中のデータ損失の分析と解決

序文前回の記事では、JavaScript の 2 つのデータ型、基本型と参照型、および参照型の浅いコ...

誰もが知っておくべきウェブサイトのユーザビリティに関する 10 のヒント

これ以上時間を無駄にせず、早速本題に入りましょう。 1. ロゴに代替テキストを追加するこれには 2 ...

設定ファイルを書いてMyBatisを簡単に使う方法

設定ファイルを書いてMyBatisを簡単に使う方法マイバティス3.xここでは MyBatis につい...

CentOS サーバーに FFmpeg をインストールするための完全な手順

序文サーバーシステム環境は、CentOS 6.5 (最終) です。 FFmpeg をサーバーに正常に...

Linux での stat 関数と stat コマンドの使用法の詳細な説明

stat 関数と stat コマンドLinux ファイル内の [inode = インデックス ノード...

mysql の not equal to null と equal to null の書き方の詳細説明

1. テーブル構造 2. 表データ 3. クエリのteacher_nameフィールドは空にすることは...

Apache ab を使用して HTTP パフォーマンス テストを実行する

MacにはApache環境が付属していますターミナルを開き、sudo apachectl -v と入...

Podmanはコンテナを自動的に起動し、Dockerと比較します

目次1. podmanの紹介2. Dockerと比較した利点3. 互換性4. バックグラウンド サー...

Vue プロジェクトで SVG コンポーネントをパッケージ化して構成する手順

最近新しい会社に入社しました。プロジェクトに携わった後、タイトルアイコンが svg で作られていると...

mysql バックアップ スクリプト mysqldump の使い方の詳細な説明

この記事では、参考までにMySQLバックアップスクリプトを紹介します。具体的な内容は次のとおりです。...

Centos8 で NIS ドメイン サービスをセットアップおよび構成するための詳細な手順

目次NIS の紹介ネットワーク環境: 1. 環境の準備(両方のノードが必要) 2.nisマスターサー...

MySQL (8 および 5.7) の Docker インストール

この記事では、Dockerを使用してMySQLデータベースとリモートアクセス構成をデプロイする方法を...

モバイルデバイス上のぼやけた小さなアイコンの問題を解決する方法

序文以前、画像とテキストの垂直方向のずれの問題について説明しました。ここで示した小さな例では、小さな...

MySQL 8.0.26 のインストールと簡易チュートリアル (インターネット上で最も完全)

目次1. MySQLをダウンロードする1.1 ダウンロード1.2 インストール1. MySQLをダウ...

Angular CLI リリース パスの構成項目の簡単な分析

序文プロジェクトのリリースでは、常に特定の状況に応じたパッケージ化が必要です。Angular CLI...