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

推薦する

要素内の TimePicker は時間の一部を無効にします (分単位で無効)

プロジェクトの要件は、日付と時刻を選択し、現在の時刻以降の時刻のみを選択し、最小レベルを分単位で無効...

JSはリクエストディスパッチャーを実装する

目次抽象化と再利用シリアルセグメントシリアル、セグメントパラレル要約するはじめに: JS は当然並列...

WeChat アプレットのシンプルなログイン ページの実装 (ソース コード付き)

目次1. 上の写真2. ユーザーが存在しない3. コードをアップロードする1. 上の写真 2. ユー...

MySQL設定ファイルを変更できない問題の解決方法(Win10)

他の人のために解決した問題を記録します。問題の説明MySQLのバージョンは5.7、オペレーティングシ...

document.getElementBy系メソッドがオブジェクトを取得できない問題を解決する

getElementByIdはオブジェクトを取得できませんブラウザがドキュメントを解析するときにはシ...

Linuxで新しいユーザーを作成し、指定されたディレクトリへの権限を付与する

1 ユーザーを作成し、ユーザーのルートパスとパスワードを指定します useradd -d /home...

vue-video-player を使用してライブ放送を実現する方法

目次1. vue-video-playerをインストールする2. vue-video-playerを...

HTTP ステータス コード

このステータス コードは、リクエストのステータスに関する情報を提供し、サイトとリクエストされたページ...

Vue はネストされたルーティングメソッドの例を実装します

1. ネストされたルーティングはサブルーティングとも呼ばれます。実際のアプリケーションでは、通常、ネ...

LinuxシステムにISOファイルをインストールする方法

Linux システムで iso ファイルをインストールするにはどうすればいいですか?インストール手順...

インタラクティブな視覚化 JS ライブラリ gojs の使い方の紹介とヒント

目次1. gojsの紹介2. Gojsのアプリケーションシナリオ3. gojs を選ぶ理由: 4. ...

SNMP4J サーバー接続タイムアウト問題の解決策

弊社のネットワーク管理センターは管理センター兼サーバーとして機能します!各管理対象デバイスは、TCP...

Vue+Element+Springboot画像アップロードの実装例

最近、たまたま vue+springboot のフロントエンドとバックエンドの分離プロジェクトに触れ...

MySQL のテーブルリターンとインデックスカバレッジの例の詳細な説明

目次インデックスタイプインデックス構造非クラスター化インデックスクエリインデックスカバー要約するイン...

Linux で docker-compose を使用したソフトウェア構成の詳細な説明

序文この記事では、docker-compose の構成をいくつか紹介します。これらを参考にして、独自...