[Linux]プログラムがダイナミックライブラリ.soソリューションを見つけることができません| .soダイナミックライブラリの情報を表示します| .soダイナミックライブラリをロードする順序

目次

.soソリューションが見つかりません

方法1:環境変数を追加する

方法2:soファイルをlibパスにコピーします

方法3 :(推奨)パスを見つけるためにldconfigを追加します

方法4:ターゲットコードをコンパイルするときに、プログラムのダイナミックライブラリ検索パスを指定します

その他のコマンド

プログラムが依存する.soライブラリを表示する

ダイナミックライブラリ接続プロセスを表示する

soリンクライブラリのバージョンを表示する

Soファイルの文字列情報を表示します(最も一般的なのはバージョン番号です)

ダイナミックライブラリの検索順序

ダイナミックライブラリの[リンク時間]パスと[実行時間]パス

eflファイル(プログラム、ライブラリファイル)のライブラリ依存パスを変更します


.soソリューションが見つかりません

Linuxダイナミックライブラリのデフォルトの検索パスは/ libと/ usr / libです。デフォルトの検索パスに加えて、次の方法で指定することもできます。

オリジナル:https//www.it610.com/article/1295147005911310336.htm

方法1:環境変数を追加する

環境変数を追加する3つの方法

1.現在のユーザーの現在の端末環境変数を追加します(一時的)

export LD_LIBRARY_PATH=/home/czd/...  #.so file path

2.現在のユーザーの環境変数を追加ます

〜/ .bashrcファイルを変更し、最後に環境変数を追加します

vim ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/czd/...  #.so file path

それを効果的にする、

source ~/.bashrc

有効にならない場合は、再起動してください

3.すべてのユーザーの環境変数を追加します

プロファイルファイルを変更し、最後に環境変数を追加します

vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/czd/...  #.so file path

効果的にする

source /etc/profile

有効にならない場合は、再起動してください

方法2:soファイルをlibパスにコピーします

Linuxシステムのsoライブラリは通常「/ usr / lib /」パスに保存され、ダイナミックライブラリはこのパスにコピーできます。

sudo cp liblibtest.so /usr/lib/

即時効果

方法3 :(推奨)パスを見つけるためにldconfigを追加します

手順1.リンク構成ファイルを編集します

vim /etc/ld.so.conf、内容が次のとおりかどうかを確認し、そうでない場合は次のように変更します。

include /etc/ld.so.conf.d/*.conf

手順2./etc/ld.so.conf.dディレクトリを入力し、*。confファイルを作成します。ファイル名は任意です。拡張子は.confである必要があります。

cd /etc/ld.so.conf/
vim libmy.conf 

ステップ4.ファイル内に、soのパスを追加し、保存して終了します

/home/czd/eclipse-workspacee/calllib/Debug

ステップ5.実行命令の有効期間

sudo ldconfig

プログラムが実行時にsoライブラリを検索すると、追加されたディレクトリが検索されます。

 

https://blog.csdn.net/qq_38350702/article/details/106128030

方法4:ターゲットコードをコンパイルするときに、プログラムのダイナミックライブラリ検索パスを指定します

 

2つの解決策があります。最初のプログラムがリンクされるときにリンクライブラリの場所を指定するには、-wl、-rpath = <link_path>パラメータを使用し、<link_path>はリンクライブラリのパスです。といった:

gcc -o foo foo.c -L. -lfoo -Wl,-rpath=/usr/mylib

上記は、リンクの場所が/ usr / mylibであることを指定するためのものです。./fooを実行すると、fooは/ usr / mylibに移動してlibfoo.soライブラリを検索します。

ただし、一般的には次の形式を使用します

gcc -o foo foo.c -L$(prefix)/lib -lfoo -Wl,-rpath=$(prefix)/lib

 

その他のコマンド

プログラムが依存する.soライブラリを表示する

プログラムを実行するために必要なダイナミックライブラリと、それらが見つかるかどうかを確認します

ldd / usr / bin / mount

[root @ rdma64 lcx] #ldd ./ceph_perf_msgr_server_normal
        linux-vdso.so.1 =>(0x00007ffc24dec000)
        libpthread.so.0 =>
        /lib64/libpthread.so.0(0x00007f6f9a6ee000)libdl.so.2 => / lib64 /libdl.so.2(0x00007f6f9a4ea000)libmymalloc.so
        =>見つかりません
        libjemalloc.so.1 =>見つかりません

        libsnappy.so.1 =>
        /lib64/libsnappy.so.1(0x00007f6f9a0e2000)libceph-common.so.0 => ./bak/libceph-common.so.0(0x00007f6f912d5000)

 


実行可能プログラムに必要なダイナミックライブラリを表示するには、次のコマンドを使用します。readelf-d [実行可能プログラム]   

 

ダイナミックライブラリ接続プロセスを表示する

キープを確認してください

ldconfig -v | grepキープ

ldconfig -p | grepキープ

soリンクライブラリのバージョンを表示する

正確なバージョンが必要な場合は、このライブラリファイルがリンクされている特定のファイルを確認してください。

/ lib#ファイルlibhandle.so

libhandle.so: `libhandle.so.1 'へのシンボリックリンク

lib#ファイルlibhandle.so.1

libhandle.so.1: `libhandle.so.1.0.3 'へのシンボリックリンク

2つのリンクの後、最終的なファイル名の1.0.3がバージョン番号であることがわかりますが、他のメソッドはメインのバージョン番号しか取得できません。

Soファイルの文字列情報を表示します(最も一般的なのはバージョン番号です)

文字列libc.so | grepバージョン

 

ダイナミックライブラリの検索順序

 

上記の結果に基づいて、ダイナミックライブラリの検索パスの検索順序は次のとおりであることがわかります。

1.ターゲットコードのコンパイル時に指定されたダイナミックライブラリ検索パス; //-L、-rpath、および-rpath-link

2.環境変数LD_LIBRARY_PATHで指定されたダイナミックライブラリ検索パス。

3.構成ファイル/etc/ld.so.confで指定されたダイナミックライブラリ検索パス。

4.デフォルトのダイナミックライブラリ検索パス/ lib;

5.デフォルトのダイナミックライブラリ検索パス/ usr / lib。

上記1、2、3でダイナミックライブラリ検索パスを指定すると、複数のダイナミックライブラリ検索パスを指定でき、指定したパス順に検索シーケンスが検索されます。

http://blog.csdn.net/21aspnet/article/details/6724457

 

ダイナミックライブラリの[リンク時間]パスと[実行時間]パス

http://blog.csdn.net/q1302182594/article/details/42102961(-L、-rpath、-rpath-linkの違い)

最新のリンカは、ダイナミックライブラリを処理するときに、リンク時パスと実行時パスを分離します。ユーザーはできます

  • -Lを使用してコンパイルおよびリンクするときに、ライブラリのパスを指定します
  • -R(または-rpath)を使用して、プログラムランタイムライブラリのパスを指定します。

ライブラリアプリケーションの柔軟性を大幅に向上させます。

たとえば、ターゲットがコンパイルされた後、コンパイル環境gcc -o target -L / work / lib / zlib / -llibz-1.2.3(work / lib / zlibはコンパイル環境のダイナミックライブラリディレクトリです)にいます。 、zlibをダウンロードするだけで済みます。ライブラリファイルをオペレーティング環境のデフォルトパスにコピーします。または、-rpath(または-R)、LD_LIBRARY_PATHを使用して検索パスを指定します。

 

リンカldのオプションは、-L、-rpath、および-rpath-linkです。これは、おおまかに次のことを意味します。

-L:「リンク」すると、検索するディレクトリ、つまり-lxxxオプション内のすべてのライブラリが、最初に-Lで指定されたディレクトリから検索され、次にデフォルトの場所が検索されます。-Lは、プログラムのコンパイルおよびリンク時のライブラリーのパスのみを指定し、プログラムの実行時のライブラリーのパスには影響しません。

-rpathと-rpath-linkはどちらも、リンク時にライブラリのパスを指定できますが、実行可能ファイルを実行すると、-rpath-linkで指定されたパスは無効になります(リンカはライブラリのパスを実行可能ファイル)、

-rpathで指定されたパスは引き続き有効です(リンカが実行可能ファイルにライブラリのパスを含めているため)。

 

eflファイル(プログラム、ライブラリファイル)のライブラリ依存パスを変更します

ツール:patchelf
(RHELにはすでにchrpathツールが付属しているので、直接使用できます。(yum install chrpath)しかし、chrpathには欠陥があります。現在のシステムがx86_64の場合、i386 elfを変更するとエラーが報告されますが、patchelfにはそのような問題はありません。 )

 

rpathのフルネームは実行時検索パスです。Linuxではすべてのelf形式のファイル、特に実行可能ファイルに含まれています。.soファイルを検索するときに実行可能ファイルの最優先位置を指定します。patchelfを使用してその情報を変更します。https://www.cnblogs.com/ar-cheng/p/13225342.html

デモが依存するライブラリを表示します。

$ readelf-dデモ
 

更改程序或库运行时搜索依赖库的路径(多个路径用冒号隔开)

$ patchelf  --set-rpath   /opt/my-libs/lib:/other-libs   my-program

去掉冗余的依赖库路径(Shrink the RPATH of executables and libraries:)

$ patchelf  --shrink-rpath  my-program

去掉冗余的依赖库路径,但保留/usr/lib:/foo/lib前缀的路径

$ patchelf  --shrink-rpath  --allowed-rpath-prefixes  /usr/lib:/foo/lib  my-program

删除一些设置的依赖

$ patchelf  --remove-needed  libfoo.so.1 my-program 

增加依赖
$ patchelf  --add-needed        libfoo.so.1 my-program  

更换依赖。原本是依赖 liboriginal.so.1,改为依赖 libreplacement.so.1

$ patchelf  --replace-needed  liboriginal.so.1  libreplacement.so.1  my-program 

Change SONAME of a dynamic library:
$ patchelf  --set-soname  libnewname.so.3.4.5  path/to/libmylibrary.so.1.2.3 

Change the dynamic loader ("ELF interpreter") of executables
$ patchelf  --set-interpreter /lib/my-ld-linux.so.2 my-program 

チュートリアル:https//blog.csdn.net/juluwangriyue/article/details/108617283

公式ウェブサイトの説明:

README.md
PatchELF is a simple utility for modifying existing ELF executables and libraries. In particular, it can do the following:

Change the dynamic loader ("ELF interpreter") of executables:
$ patchelf --set-interpreter /lib/my-ld-linux.so.2 my-program

Change the RPATH of executables and libraries:
$ patchelf --set-rpath /opt/my-libs/lib:/other-libs my-program

Shrink the RPATH of executables and libraries:
$ patchelf --shrink-rpath my-program

This removes from the RPATH all directories that do not contain a library referenced by DT_NEEDED fields of the executable or library. For instance, if an executable references one library libfoo.so, has an RPATH /lib:/usr/lib:/foo/lib, and libfoo.so can only be found in /foo/lib, then the new RPATH will be /foo/lib.

In addition, the --allowed-rpath-prefixes option can be used for further rpath tuning. For instance, if an executable has an RPATH /tmp/build-foo/.libs:/foo/lib, it is probably desirable to keep the /foo/lib reference instead of the /tmp entry. To accomplish that, use:

$ patchelf --shrink-rpath --allowed-rpath-prefixes /usr/lib:/foo/lib my-program

Remove declared dependencies on dynamic libraries (DT_NEEDED entries):
$ patchelf --remove-needed libfoo.so.1 my-program

This option can be given multiple times.
Add a declared dependency on a dynamic library (DT_NEEDED):
$ patchelf --add-needed libfoo.so.1 my-program

This option can be give multiple times.
Replace a declared dependency on a dynamic library with another one (DT_NEEDED):

$ patchelf --replace-needed liboriginal.so.1 libreplacement.so.1 my-program

This option can be give multiple times.

Change SONAME of a dynamic library:
$ patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3

 

おすすめ

転載: blog.csdn.net/bandaoyu/article/details/113181179