较为简单,直接按照老师的代码敲就完了,然后编译运行。
- 码代码
fred.cbill.clib.hslmain.c gcc -c fred.c bill.cgcc -c slmain.cgcc -o slmain slmain.o bill.o./slmain- 使用
ar命令创建静态库,使用ranlib命令为文档建立索引 ar crv libfoo.a bill.o fred.oranlib libfoo.agcc -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.ocp slmain.c dlmain.c拷贝一份静态链接的代码gcc dlmain.c -o dlmain -L ./ -lfoosudo 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时,才会真正被系统卸载。