日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux so文件统一目录,linux加载指定目录的so文件

發布時間:2025/3/15 linux 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux so文件统一目录,linux加载指定目录的so文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

例如,有個so在/tmp/libs/libzmq.so.3:

[winlin@dev6 libs]$ ls /tmp/libs/ -lh

total 2.5M

lrwxrwxrwx 1 winlin winlin 15 Dec 12 12:58 libzmq.so -> libzmq.so.3.0.0

lrwxrwxrwx 1 winlin winlin 15 Dec 12 12:58 libzmq.so.3 -> libzmq.so.3.0.0

-rwxrwxr-x 1 winlin winlin 2.5M Dec 12 12:49 libzmq.so.3.0.0

寫如下代碼:

#include

#include "/home/winlin/zeromq-3.2.2/include/zmq.h"

/**

g++ RRServer.cpp -L/tmp/libs -lzmq -g -O0 -o RRServer

*/

int main(int argc, char** argv){

void* context = zmq_ctx_new();

void* responder = zmq_socket(context, ZMQ_REP);

zmq_bind(responder, "tcp://*:1990");

while(1){

zmq_msg_t request;

zmq_msg_init(&request);

zmq_msg_recv(&request, responder, 0);

zmq_msg_close(&request);

zmq_msg_t reply;

zmq_msg_init_size(&reply, 6);

memcpy(zmq_msg_data(&reply), "World", 6);

zmq_msg_send(&reply, responder, 0);

zmq_msg_close(&reply);

}

return 0;

}

編譯程序:

[winlin@dev6 zeromq]$ g++ RRServer.cpp -L/tmp/libs -lzmq -g -O0 -o RRServer

[winlin@dev6 zeromq]$ ldd RRServer

linux-vdso.so.1 => (0x00007fff7bdff000)

libzmq.so.3 => not found

libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003730000000)

libm.so.6 => /lib64/libm.so.6 (0x0000003723800000)

libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000372e400000)

libc.so.6 => /lib64/libc.so.6 (0x0000003723400000)

/lib64/ld-linux-x86-64.so.2 (0x0000003722c00000)

發現libzmp.so.3找不到,解決辦法有幾個:

1. 設置LD_LIBRARY_PATH,系統會在這個路徑下去找特殊的so:

[winlin@dev6 zeromq]$ export LD_LIBRARY_PATH=/tmp/libs:$LD_LIBRARY_PATH

[winlin@dev6 zeromq]$ ldd RRServer

linux-vdso.so.1 => (0x00007fff987ff000)

libzmq.so.3 => /tmp/libs/libzmq.so.3 (0x00007f9b67648000)

libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003730000000)

libm.so.6 => /lib64/libm.so.6 (0x0000003723800000)

libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000372e400000)

libc.so.6 => /lib64/libc.so.6 (0x0000003723400000)

librt.so.1 => /lib64/librt.so.1 (0x0000003724800000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003724000000)

/lib64/ld-linux-x86-64.so.2 (0x0000003722c00000)

但是有人說設置變量不太好:http://prefetch.net/articles/linkers.badldlibrary.html

還有其他的方法。

2. 編譯時指定路徑,這個對自己的so好使,但對libzmq不太好使:

[winlin@dev6 shared-libs]$ g++ shared-lib-doo.cpp -g -O0 -shared -fPIC -o libdoo.so

[winlin@dev6 shared-libs]$ g++ shared-lib.cpp ./libfoo.so ./libdoo.so -g -O0 -o shared-lib

[winlin@dev6 shared-libs]$ ldd shared-lib

linux-vdso.so.1 => (0x00007fff252df000)

./libfoo.so (0x00007f9f7df9c000)

./libdoo.so (0x00007f9f7dd9a000)

libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003730000000)

libm.so.6 => /lib64/libm.so.6 (0x0000003723800000)

libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000372e400000)

libc.so.6 => /lib64/libc.so.6 (0x0000003723400000)

/lib64/ld-linux-x86-64.so.2 (0x0000003722c00000)

3. 編譯時指定目錄參數,譬如ld的-R參數之類的,沒有用成功。

4. 使用工具,修改編譯出來的執行文件的路徑,這個好使:

http://nixos.org/patchelf.html

http://hydra.nixos.org/build/1524660/download/2/patchelf-0.6.tar.bz2

PatchELF is a small utility to modify the dynamic linker andRPATHofELF executables.Likewise, you can change theRPATH, the linker search path embedded into executables and dynamic libraries:

patchelf --set-rpath /opt/my-libs/lib:/foo/lib program

下載源碼后,編譯:

[winlin@dev6 patchelf-0.6]$ (cd /home/winlin/patchelf-0.6; ./configure ; make)

[winlin@dev6 patchelf-0.6]$ file /home/winlin/patchelf-0.6/src/patchelf

/home/winlin/patchelf-0.6/src/patchelf: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

[winlin@dev6 patchelf-0.6]$ /home/winlin/patchelf-0.6/src/patchelf

syntax: /home/winlin/patchelf-0.6/src/patchelf

[--set-interpreter FILENAME]

[--print-interpreter]

[--set-rpath RPATH]

[--shrink-rpath]

[--print-rpath]

[--force-rpath]

[--debug]

[--version]

FILENAME

執行命令如下:

[winlin@dev6 zeromq]$ /home/winlin/patchelf-0.6/src/patchelf --set-rpath /tmp/libs RRServer

[winlin@dev6 zeromq]$ ldd RRServer

linux-vdso.so.1 => (0x00007ffff37b0000)

libzmq.so.3 => /tmp/libs/libzmq.so.3 (0x00007f0c49c10000)

libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003730000000)

libm.so.6 => /lib64/libm.so.6 (0x0000003723800000)

libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000372e400000)

libc.so.6 => /lib64/libc.so.6 (0x0000003723400000)

librt.so.1 => /lib64/librt.so.1 (0x0000003724800000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003724000000)

/lib64/ld-linux-x86-64.so.2 (0x0000003722c00000)

總結

以上是生活随笔為你收集整理的linux so文件统一目录,linux加载指定目录的so文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。