1.1 共享庫
有如下代碼共享庫與主函數中都有相同的add函數
-
cong@msi:/work/test/ctest/5dlopen_1$
cat libtestadd/libadd.c
-
int add(int a, int b)
-
{
-
return (a+b);
- }
gcc -g -fPIC -O0 -c -o libadd.o libadd.c
gcc -fPIC -shared libadd.o -o libtestadd.so
-
cong@msi:/work/test/ctest/5dlopen_1$
cat main.c
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include "libadd.h"
-
int add(int a, int b)
-
{
-
printf("main.c: add\n");
-
return 0;
-
}
-
int main (int argc, char *argv[])
-
{
-
printf("add=%d\n",add(1,2));
-
return 0;
- }
gcc main.o -o main -L./libtestadd/ -ltestadd -Wl,-rpath,libtestadd
1.3 運行結果
-
cong@msi:/work/test/ctest/5dlopen_1$ ./main
-
main.c: add -->發現調用的是主函數的add
- add=0
-
cong@msi:/work/test/ctest/5dlopen_1$
ldd main
-
linux-vdso.so.1 => (0x00007ffd975d9000)
-->這兒根本就沒有去鏈接libtestadd.so
-
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6ca45c9000)
- /lib64/ld-linux-x86-64.so.2 (0x00007f6ca49b5000)
- cong@msi:/work/test/ctest/5dlopen_1$
-
cong@msi:/work/test/ctest/5dlopen_1$
readelf -d ./main
-
-
Dynamic section at offset 0xe18 contains 25 entries:
-
Tag Type Name/Value
-
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
-->需要的共享庫只有libc.so根本就沒有用libtestadd.so
-
0x000000000000000f (RPATH) Library rpath: [libtestadd]
- 0x000000000000000c (INIT) 0x400428
-
cong@msi:/work/test/ctest/5dlopen_1$
ldd main
-
linux-vdso.so.1 => (0x00007ffd43f39000)
-
libtestadd.so => libtestadd/libtestadd.so (0x00007fd3bebd0000)
-->去掉main中的add纔會用到libtestadd.so這個共享庫
-
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd3be7e6000)
-
/lib64/ld-linux-x86-64.so.2 (0x00007fd3bedd4000)
- cong@msi:/work/test/ctest/5dlopen_1$
- cong@msi:/work/test/ctest/5dlopen_1$ readelf -d ./main
-
Dynamic section at offset 0xe08 contains 26 entries:
-
Tag Type Name/Value
-
0x0000000000000001 (NEEDED) Shared
library: [libtestadd.so]
-->去掉main中的add纔會用到共享庫中的add
-
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
-
0x000000000000000f (RPATH) Library rpath: [libtestadd]
- 0x000000000000000c (INIT) 0x400580
5dlopen_1.rar (下載後改名爲5dlopen_1.tar.gz)
2. 運行時加載庫
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
#include <dlfcn.h>
-
int add(int a, int b)
-
{
-
printf("add in main.c\n");
-
return (a+b);
-
}
-
#define TEST_LIB_PATH "./libtestadd/libtestadd.so"
-
int main (int argc, char *argv[])
-
{
-
int result;
-
void* dp = NULL;
-
int (*add_func)(int, int);
-
dp = dlopen(TEST_LIB_PATH, RTLD_LAZY );
-
if(dp==NULL)
-
{
-
printf("dlopen failed\n");
-
return 0;
-
}
-
-
add_func = dlsym(dp, "add");
-
result = add_func(3, 4);
-
printf("addr of add_func=%p\n", add_func);
-
printf("dlopen: add_func=%d\n", result);
-
dlclose(dp);
-
-
printf("add=%d\n",add(1,2));
-
return 0;
- }
-
cong@msi:/work/test/ctest/5dlopen$ ./main
-
addr of add_func=0x7f192e886675
-
dlopen: add_func=7 -->運行了libtestadd.so中的add
-
add in main.c
- add=3
-
cong@msi:/work/test/ctest/5dlopen$
ldd main
-
linux-vdso.so.1 => (0x00007ffdea9f0000)
-
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5d20aa9000)
-->需要用到libdl.so,但是自己的libtestadd.so沒有用到
-
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5d206e4000)
-
/lib64/ld-linux-x86-64.so.2 (0x00007f5d20cd4000)
-
cong@msi:/work/test/ctest/5dlopen$
readelf -d ./main
-
-
Dynamic section at offset 0xe18 contains 25 entries:
-
Tag Type Name/Value
-
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
-->需要用到libdl.so,但是自己的libtestadd.so沒有用到
-
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
- 0x000000000000000c (INIT) 0x400588
5dlopen.rar(下載後改名爲5dlopen.tar.gz)