较为简单,直接按照老师的代码敲就完了,然后编译运行。
- 码代码
fred.c
bill.c
lib.h
slmain.c
gcc -c fred.c bill.c
gcc -c slmain.c
gcc -o slmain slmain.o bill.o
./slmain
- 使用
ar
命令创建静态库,使用ranlib
命令为文档建立索引 ar crv libfoo.a bill.o fred.o
ranlib libfoo.a
gcc -o slmain slmain.o libfoo.a
./slmain
较为简单,只须将静态链接
中的slmain.c
的代码复制一份重命名为dlmain.c
即可,然后使用不同的命令进行链接
gcc -c -fPIC bill.c fred.c
-f
后跟一些编译选项,PIC(Position Independent Code)
表示生成位置无关代码gcc -shared -o libfoo.so bill.o fred.o
cp slmain.c dlmain.c
拷贝一份静态链接的代码gcc dlmain.c -o dlmain -L ./ -lfoo
sudo cp libfoo.so /usr/lib
将生成的动态链接库拷贝到usr/lib
路径下,因为操作系统默认前往该路径查找动态链接库./dlmain
难度不大,参照课上或实验指导中的教程照猫画虎即可
- 在代码中写入第二个实验内容生成的动态链接库
gcc damain.c -o damain -ldl
-l
表示链接某一个库,之前的-lpthread
也是这种情况./damain
使用ldd 文件名
进行观察比较即可
- 编写
libtest.c
文件 - 编写
main.c
文件 - 使用命令
gcc libtest.c -shared -fPIC -o libtest.so
生成动态链接库libtest.so
- 使用命令
gcc main.c -o main -ldl
生成链接了动态库的可执行文件main
./main
运行程序- 使用命令
ps -ef | grep main
查询main
程序的pid
- 打开相应的文件夹
/proc/pid
- 结合程序的流程使用命令
cat maps
观察内存变化
dlopen
:打开动态库。函数原型void* dlopen(const char* filename, int flag);
dlopen
用于打开指定名字(filename)
的动态库,并返回操作句柄。dlsym
,取函数执行地址。函数原型为void* dlsym(void* handle, char *symbol);
dlsym
根据动态库操作句柄(handle)
与符号(symbol)
,返回符号对应的函数的执行代码地址。dlclose
,关闭动态库。函数原型为int dlclose (void *handle);
dlclose
用于关闭指定句柄的动态库,只有当此动态库的使用计数为0
时,才会真正被系统卸载。