目次
方法3 :(推奨)パスを見つけるためにldconfigを追加します
方法4:ターゲットコードをコンパイルするときに、プログラムのダイナミックライブラリ検索パスを指定します
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