标签:dso not found 静态库 编译 load x86_64 etc 存在 setuid
背景:
初学者经常搞不清楚,一个main.cpp文件,调用了某库(可能静态也可动态)中的函数,如何将它跑起来。
编译:
g++ -c main.cpp main.cpp:3:26: fatal error: leveldb/db.h: No such file or directory #include "leveldb/db.h" ^ compilation terminated.
g++ -c main.cpp -I/home/ww/2.src/leveldb/include
OK,生成main.o
g++ -o main main.o -L/home/ww/2.src/leveldb/out-static -lleveldb -lpthread
OK,执行正常。
g++ -o main main.o -L/home/ww/2.src/leveldb/out-shared -lleveldb -lpthread
但这个可执行文件是跑不了的:
ldd main
linux-vdso.so.1 (0x00007fffd58f2000)
libleveldb.so.1 => not found
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbb4a509000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fbb4a1fe000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbb49efd000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fbb49ce7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbb4993c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbb4a726000)
./main
./main: error while loading shared libraries: libleveldb.so.1: cannot open shared object file: No such file or directory
loader找到动态库文件有几种方法:
ww@iZj6c1oc6sq0uze89upki0Z:/etc/ld.so.conf.d$ cat * /usr/lib/x86_64-linux-gnu/libfakeroot # libc default configuration /usr/local/lib # Multiarch support /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu
因此,需要将动态库放到对应的地点,并对应修改或增加.conf文件。
之后,需要调用ldconfig。它的作用是建立起加载所需要的符号缓存。这里不做示例。
LD_PRELOAD=/home/ww/2.src/leveldb/out-shared/libleveldb.so ./main Open db OK
export LD_LIBRARY_PATH=/home/ww/2.src/leveldb/out-shared:${LD_LIBRARY_PATH} ldd main linux-vdso.so.1 (0x00007ffe239f5000) libleveldb.so.1 => /home/ww/2.src/leveldb/out-shared/libleveldb.so.1 (0x00007ff405fe6000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff405dc9000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff405abe000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff4057bd000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff4055a7000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff4051fc000) /lib64/ld-linux-x86-64.so.2 (0x00007ff40629d000)
/lib64/ld-linux-x86-64.so.2 --library-path /home/ww/2.src/leveldb/out-shared ./main Open db OK
参考:
【1】http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
【2】http://xahlee.info/UnixResource_dir/_/ldpath.html
标签:dso not found 静态库 编译 load x86_64 etc 存在 setuid
原文地址:http://www.cnblogs.com/qqmomery/p/6291583.html