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.7.21 winx64 グリーンバージョンのインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 5.7.21のインストールと設定方法を記録しています。具体的な内容は以下のと...

Reactは、読み込み、読み込み完了、読み込み失敗の3つの段階の原則分析を実装します。

最近ブログに書いたのですが、プロジェクトリストの中に写真がたくさんあり、最初は読み込みが遅いので、ス...

CSS3 はアニメーション属性を使用してクールな効果を実現します (推奨)

animation-name アニメーション名。複数のアニメーションがバインドされていることを示す...

Nest.js 環境変数の設定とシリアル化の詳細な説明

環境変数の設定の簡単な説明プログラムは、環境によって異なる環境変数を必要とします。たとえば、実稼働環...

Docker での RocketMQ の詳細なインストールと使用

RocketMQ イメージを検索するには、Docker の hub.docker.com で検索する...

MySQLのUPDATE文の落とし穴を記録する

背景最近、オンライン操作中に DML ステートメントを実行しました。これは絶対確実だと思っていました...

MySQL5.7.03 上位バージョンから MySQL 5.7.17 への置き換えインストール プロセスと見つかった問題の解決策

1. インストール方法は? 1. [実行] -> [cmd] と入力して、小さな黒いウィンドウ...

JavaScript バブルソートの例

目次1. バブルソートとは何か2. 例を挙げるラウンド1:第2ラウンド:第3ラウンド:第4ラウンド:...

Webデザインの経験: Webコードを効率的に書く

本来、この第 7 章では、デザインにおけるレイヤーと空間テクニックについて深く議論するはずです。しか...

Windows 10 無料インストール版の MySQL インストールと設定のチュートリアル

ネットでいろいろ検索してみたところ、Linux システム向けではなく、現在の新しいバージョンと一致し...

mysql MDLメタデータロックの詳細な分析

序文: MySQL で SQL 文を実行すると、予想した時間内に文が完了しません。このような場合、通...

MySQL データ型 DECIMAL(N,M) における N と M の意味の詳細な説明

同僚から、MySQL データ型 DECIMAL(N,M) の N と M の意味を尋ねられました。言...

Docker+daocloudはフロントエンドプロジェクトの自動構築とデプロイを実現します

自動プロジェクト展開は大企業やユニコーン企業でよく使用され、手動でプロジェクトを展開するよりも効率的...