关于静态库和动态库的操作

目录

静态库

动态库

1.增加.o文件:

2.删除.o文件:

查看静态库和动态库中的函数名

1.查看静态库中的函数名(以libexample.a为例):

2. 查看动态库中的函数名(以libexample.so为例):

查看动态库和静态库是32位,还是64位

1.  如果是动态库,可以使用: file *.so  

2. 如果是静态库,可以使用objdump -x *.a


静态库

要向静态库中增加一个.o文件,需要执行以下步骤:

  1. 使用ar命令创建一个静态库文件,比如libexample.a:

    ar rcs libexample.a example1.o
    

    这个命令将会创建一个静态库文件libexample.a,并将example1.o文件添加进去。

  2. 如果需要添加一个新的.o文件,可以使用以下命令:

    ar rcs libexample.a example1.o example2.o
    

    这个命令将会把example2.o文件添加到libexample.a中。

  3. 如果需要删除一个.o文件,可以使用以下命令:

    ar d libexample.a example1.o
    

    这个命令将会从libexample.a中删除example1.o文件。

        或者可以使用下面的命令:

ar -x libexample.a
rm example1.o
ar rcs libexample.a *.o

先用ar -x将静态库解压,然后删除对应的.o文件,再把其余的.o文件重新打包

动态库

1.增加.o文件:

如果需要增加新的.o文件到so库中,可以将新的源文件编译成.o文件,然后使用1d命令将多个.o文件链接成一个新的.so库文件,例如:

gcc -c -fPIC -o new file.o new file.c
ld -shared -o new lib.so old lib.so new file.o

其中,-c选项表示编译成目标文件,-fPIC选项表示编译成位置无关代码,-shared 选项表示链接成共享库。这样就可以将新的.o文件添加到原来的.so库文件中


2.删除.o文件:

如果需要删除so库中的某个.o文件,可以使用ar命令提取出其中的所有.o文件,然后将不需要的.o文件删除,最后再将剩余的.o文件重新打包成新的.so库文件,例如:

ar -x old lib.so
rm old file.o
gcc -shared -o new lib.so *.o

其中,-x选项表示提取所有的.o文件,-shared选项表示重新链接成共享库

查看静态库和动态库中的函数名

可以使用以下命令来查看静态库和动态库中的函数名:

1.查看静态库中的函数名(以libexample.a为例):

nm libexample.a

这个命令将会列出libexample.a中所有的符号,包括函数名、变量名等。

2. 查看动态库中的函数名(以libexample.so为例):

nm -D libexample.so

这个命令将会列出libexample.so中所有导出的函数名。请注意,动态库中还会有一些不导出的函数和变量,这些不导出的符号可以使用下面的命令查看:

nm libexample.so

这个命令将会列出libexample.so中所有的符号,包括导出的和不导出的。

T类:是在库中定义的函数,用T表示,这是最常见的;    
U类:是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;    
W类:是所谓的“弱态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。

例如: nm *.so | grep printf (*.so中是否引用了printf)

查看动态库和静态库是32位,还是64位

1.  如果是动态库,可以使用: file *.so  

查看动态库libexample.so是32位还是64位:

$ file libexample.so
libexample.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, B

2. 如果是静态库,可以使用objdump -x *.a

objdump是一个反汇编器,可以用于查看二进制文件的各种信息,包括代码段、数据段、符号表、重定位表、动态符号表等等。而objdump -x命令则是用来显示二进制文件的所有头部信息。

具体来说,objdump -x命令会列出二进制文件的各种头部信息,包括文件类型、系统架构、入口地址、段表、符号表、动态符号表、重定位表等等。这些信息对于调试和分析二进制文件非常有用,可以帮助开发人员更好地了解二进制文件的结构和运行时行为。

需要注意的是,objdump -x命令只显示二进制文件的头部信息,如果需要查看更详细的反汇编信息,可以使用其他objdump命令,比如objdump -d命令。

猜你喜欢

转载自blog.csdn.net/L888666Q/article/details/131009264
今日推荐