linux strip(执行文件的减肥工具strip)
大家好,感谢邀请,今天来为大家分享一下linux strip的问题,以及和执行文件的减肥工具strip的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
strip对动态库文件和静态库文件的不同效果
Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
ln-s libhello.so.1.0 libhello.so.1
ln-s libhello.so.1 libhello.so
动态库和静态库的区别:
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
两种库的编译产生方法:
第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:
/* hello.c*/
#include
void sayhello()
{
printf("hello,world\n");
}
用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:
gcc-c hello.c-o hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar cqs libhello.a hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc-shared-Wl,-soname,libhello.so.1-o libhello.so.1.0 hello.o
另外再建立两个符号连接:
$ln-s libhello.so.1.0 libhello.so.1
$ln-s libhello.so.1 libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc-shared参数使其生成是动态库而不是普通执行程序。
-Wl表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有 soname名字的文件,%B
strip命令如何去除动态库的符号和行号信息以减小文件大小
strip命令是一种强大的工具,专门用于优化和简化XCOFF对象文件,如可执行文件、目标文件和动态库,以减少文件大小。它的主要作用是移除不必要的符号信息和调试数据,这对于降低库文件的存储需求,特别是在发布阶段,至关重要。在开发流程中,通常会采用strip前的库进行调试,而strip后的库用于实际发布,它们之间保持着符号对应关系,便于问题追踪。
strip命令的使用非常灵活,提供了一系列选项以满足不同需求。例如,-e选项可以设置F_LOADONLY标志,-E则用于取消这一设置。通过-h或-l选项,可以分别移除对象文件头和行号信息。如果只想移除符号表信息而不影响函数符号或行号,可以使用-t选项。若要完全移除符号表,包括静态和外部符号,可以使用-x选项。具体的实例包括:
移除a.out文件中的符号表和行号:[root@linuxcool~]# strip-l a.out
移除a.out文件的头部分:[root@linuxcool~]# strip-H a.out
针对lib.a库移除32位和64位符号表:[root@linuxcool~]# strip-X32-64 lib.a
总之,strip命令是开发人员在文件优化和管理过程中不可或缺的实用工具,它通过精确控制去除的元素,帮助我们更好地平衡文件大小和符号支持的需求。
Linux 可执行文件瘦身指令 strip 使用示例
Linux下的`strip`命令是一个工具,主要用于从可执行文件和共享库中移除符号信息。这些符号信息包括全局变量、函数和结构体定义等,通过移除它们,可执行文件和共享库的大小能够被显著减小,这对于存储空间有限的环境特别有用。
使用`strip`的命令格式是:`strip [选项] filename...`。接下来,通过几个实际示例来展示如何使用`strip`。
首先,准备一个可执行文件`test`。生成`test`的源文件`test.cpp`。
为了查看文件内部的符号信息,可以使用`readelf`命令。接着,使用`strip`的`-s`选项移除所有符号信息,再次使用`readelf`读取文件信息,这时能看到符号信息已被移除,但仍保留动态链接库所需的信息。
如果仅仅需要移除调试信息,可以使用`--strip-debug`选项。
若需要移除特定的字段信息,可以使用`-R`选项,例如移除`.gnu.version`字段信息。
对于重定位时不需要的符号信息,可以使用`--strip-unneeded`选项。而对于静态链接库,这个选项不会影响其链接。
`-K`选项允许指定保留某些符号信息,同时对其他符号进行移除。多个符号可以多次使用`-K`保留。
`-N`选项则允许指定需要移除的符号,而不影响其他符号。
`strip`命令的输出结果可保存到新文件中,使用`-o`选项指定输出文件名。
若希望在瘦身文件后保持原有的访问和修改时间信息,可以使用`-p`选项。
为了灵活切换配置,`strip`还支持从文件中读取选项,如在文件`filename`中存储所需的参数,例如:
将文件中的内容应用于`strip`命令,等同于直接通过命令行参数设置,实现不同的配置管理。
在使用`strip`的过程中,还可以选择`-v`选项以输出命令执行的详细过程。