静态库和动态库的创建和使用

反汇编指令: 1. gcc x.c -g -o x; 2、objdump -S -d ./hello。-g是为了添加调试信息,objdump中的-S选项 为了在显示汇编代码的时候同时显示原来的C语言源代码程序。

  • -d:将所有包含指令的段反汇编
  • -s 将ELF文件格式的所有段以十六进制方式打印出来
  • -h 显示ELF文件段表信息
  • -S:将代码段反汇编的同时,将反汇编代码和源代码交替显示,编译时需要给出-g,即需要调试信息。gcc -c -g  hello.c; objdump -S hello.o
  • -C:将C++符号名逆向解析。
  • -l:反汇编代码中插入源代码的文件名和行号。
  • -j section:仅反汇编指定的section。可以有多个-j参数来选择多个section

静态链接库:以 lib*.a(linux系统下)命名; 编译时使用,执行时可以删除;实际上就是多个 .o文件的压缩包。
执行命令: ar crv lib*.a x1.o x2.o
调用命令: gcc y.c -o y -l*(链接)
动态链接库: 以lib*.so(Linux系统)命名;执行时使用,不可删除;可以共享内存资源,减少内存消耗,,可以减少链接次数(补丁多以动态库发布);

执行命令gcc -shared -fPCI  -Wl ,-soname,-my_soname -o lib*.so x1.o x2.o

其中, -Wl ,-soname,-my_soname,gcc会将 -Wl ,-soname,-my_soname传递给编译器,用来指定输出共享库的so-name(符号链接),可使得用ldconfig命令时可以更新改动态库的符号软链接。

调用命令: gcc y.c -o y -L. -l* (*为库名) ;-L指明库的路径,-l指明库的名称

ps:通过设置将库添加到文件可找到的位置,防止出现路径错误

linux下动态库(.so)文件默认的查找路径:/lib和/usr/lib和/usr/local/lib 里的库直接用-l参数就能链接;

程序编译连接,程序运行都需要知道动态库所在位置。"-L"参数可以指定编译连接时的库文件路径,无法提供程序运行时库文件的路径。可以采用下面方法来提供:
(方法1)使用环境变量LD_LIBRARY_PATH,命令如下:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/yangxt/demo

(方法2)获得系统权限下,将所用到的动态库文件放到/lib 或者 /usr/lib目录下;

(方法3)可以在/usr/lib目录下创建软连接,连接到你自己目录下的动态库,命令如下:
ln -s /home/yangxt/demo/libmydyn.so /usr/lib/libmydyn.so # ln -s 源文件 目标文件
这样就在/usr/lib目录下创建了一个指向/home/yangxt/demo/libmydyn.so动态库的软连接;


(方法4)修改"vi /etc/ld.so.conf"文件,添加你自己的动态库文件路径,内容如下:
include ld.so.conf.d/*.conf
/home/yangxt/demo #你自己的动态库文件路径
添加完成之后,使用"ldconfig"重新加载配置文件使之生效。

猜你喜欢

转载自blog.csdn.net/caozhigang129/article/details/78398047