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

推薦する

vite2.0+vue3 モバイルプロジェクトの詳細な説明

1. 関連する技術的なポイントバイト版ヴュー3 ts統合ルーティングvuexを統合するAxiosを統...

Linux 環境の Apache で https サービスを有効にする方法の詳細な説明

この記事では、Linux 環境の Apache で https サービスを有効にする方法について説明...

高可用性 Web クラスターを実装するための Keepalived+Nginx+Tomcat サンプル コード

高可用性 Web クラスターを実現する Keepalived+Nginx+Tomcat 1. Ngi...

MySQLはデフォルトのエンジンと文字セットの詳細を変更します

目次1. データベースエンジン1.1 ビューデータベースエンジン1.2 デフォルトのデータベースエン...

MySQL のインストール方法と設定に関するいくつかの問題の概要

1. MySQL rpm パッケージのインストール # インストールソースをダウンロードします [r...

Vue.jsはアイコンをクリックしてズームインし、

前回の記事では、Vue で画像の切り抜きや拡大・縮小、回転を実現する方法を紹介しました。今回は、アイ...

MySQLの累積集計原理と使用例の分析

この記事では、例を使用して、MySQL 累積集計の原理と使用方法を説明します。ご参考までに、詳細は以...

nginxプロセスロックの実装の詳細な説明

目次1. nginxプロセスロックの役割2. エントリーレベルのロックの使用3. nginxプロセス...

Web コンポーネントの内部イベント コールバックと問題点の分析

目次前面に書かれたWC とは何でしょうか?現在の欠陥1. コンポーネント内部イベントのコールバック2...

ウェブデザイナーは適した人材

<br />この世に道はない。より多くの人が歩くようになると、それは道になります。最初は...

Vue を使用して Web ページのスクリーンショットを撮る方法をご存知ですか?

目次1. html2Canvasをインストールする2. 必要なVueコンポーネントを導入する3. ス...

jQueryはアコーディオン効果を実装します

この記事では、アコーディオンを実装するためのjQueryの具体的なコードを参考までに紹介します。具体...

Linux にソフトウェアをインストールするときにソフトウェア パッケージが存在しない問題を解決する方法

ソフトウェア パッケージが存在しない場合は、インストールされているソフトウェアのソフトウェア ソース...

Vue で計算プロパティを使用する際の知識ポイントのまとめ

計算されたプロパティ場合によっては、テンプレートにロジックを詰め込みすぎると、テンプレートが重くなり...