linux下so動態庫一些不為人知的祕密(上)
阿新 • • 發佈:2019-01-01
相關文章
linux 下有動態庫和靜態庫,動態庫以.so為副檔名,靜態庫以.a為副檔名。二者都使用廣泛。本文主要講動態庫方面知識。
基本上每一個linux 程式都至少會有一個動態庫,檢視某個程式使用了那些動態庫,使用ldd命令檢視-
# ldd /bin/ls
-
linux-vdso.so.1 => (0x00007fff597ff000)
-
libselinux.so.1 => /lib64/libselinux.so.1 (0x00000036c2e00000)
-
librt.so.1 => /lib64/librt.so.1 (0x00000036c2200000)
-
libcap.so.2 => /lib64/libcap.
-
libacl.so.1 => /lib64/libacl.so.1 (0x00000036d0600000)
-
libc.so.6 => /lib64/libc.so.6 (0x00000036c1200000)
-
libdl.so.2 => /lib64/libdl.so.2 (0x00000036c1600000)
-
/lib64/ld-linux-x86-64.so.2 (0x00000036c0e00000)
-
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000036c1a00000)
- libattr.so.1 => /lib64/libattr.so.1 (0x00000036cf600000)
-
#include <stdio.h>
-
#include <iostream>
-
#include <string>
-
using namespace std;
-
int main ()
-
{
-
cout << "test" << endl;
-
return 0;
- }
-
# g++ -o demo main.cpp
-
# ldd demo
-
linux-vdso.so.1 => (0x00007fffcd1ff000)
-
libstdc++.so.6 => /usr/
-
libm.so.6 => /lib64/libm.so.6 (0x00000036c1e00000)
-
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000036c7e00000)
-
libc.so.6 => /lib64/libc.so.6 (0x00000036c1200000)
- /lib64/ld-linux-x86-64.so.2 (0x00000036c0e00000)
-
# g++ -o demo -lz -lm -lrt
main.cpp
-
# ldd demo
-
linux-vdso.so.1 => (0x00007fff0f7fc000)
-
libz.so.1 => /lib64/libz.so.1 (0x00000036c2600000)
-
librt.so.1 => /lib64/librt.so.1 (0x00000036c2200000)
-
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007ff6ab70d000)
-
libm.so.6 => /lib64/libm.so.6 (0x00000036c1e00000)
-
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000036c7e00000)
-
libc.so.6 => /lib64/libc.so.6 (0x00000036c1200000)
-
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000036c1a00000)
- /lib64/ld-linux-x86-64.so.2 (0x00000036c0e00000)
-
# strace ./demo
-
execve("./demo", ["./demo"], [/* 30
vars */]) = 0
-
... = 0
-
open("/lib64/libz.so.1", O_RDONLY) = 3
-
...
-
close(3) = 0
-
open("/lib64/librt.so.1", O_RDONLY) = 3
-
...
-
close(3) = 0
-
open("/usr/lib64/libstdc++.so.6", O_RDONLY) = 3
-
...
-
close(3) = 0
-
open("/lib64/libm.so.6", O_RDONLY) = 3
-
...
-
close(3) = 0
-
open("/lib64/libgcc_s.so.1", O_RDONLY) = 3
-
...
-
close(3) = 0
-
open("/lib64/libc.so.6", O_RDONLY) = 3
-
...
-
close(3) = 0
-
open("/lib64/libpthread.so.0", O_RDONLY) = 3
-
...
-
close(3) = 0
- ...
-
# ldd -u demo
-
Unused direct dependencies:
-
/lib64/libz.so.1
-
/lib64/librt.so.1
-
/lib64/libm.so.6
- /lib64/libgcc_s.so.1
-
# g++ -Wl,--as-needed -o
demo -lz -lm -lrt main.cpp
-
# ldd demo
-
linux-vdso.so.1 => (0x00007fffebfff000)
-
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007ff665c05000)
-
libc.so.6 => /lib64/libc.so.6 (0x00000036c1200000)
-
libm.so.6 => /lib64/libm.so.6 (0x00000036c1e00000)
-
/lib64/ld-linux-x86-64.so.2 (0x00000036c0e00000)
-
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000036c7e00000)
-
# ldd -u demo
- Unused direct dependencies: