linux 动态库文件stripped属性理解

2024-05-09 13:32

本文主要是介绍linux 动态库文件stripped属性理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

centos 6.2下用file命令查看文件信息的时候,显示如下:
libcom_err.so.2:      ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

libcrypto.so.10:      ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

libcrypt.so.1:        ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

libc.so.6:            ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

libdl.so.2:           ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
第一个最后显示的是stripped,第二个是not stripped。而且对于同样名字的动态库,带not stripped库会大很多。

所以由此想到会不会类似于gcc编译的时候加上调试信息的形式呢?
至少乍一看,对于这个名词都不是很懂,百度翻译了一下也不好用,那么到底是什么意思呢?
在一篇“elf文件格式与动态链接库”的博客里我们可以找到答案。
a.outelfExecutable and Linking Format)。这两种格式中都有符号表(symbol table),其中包括所有的符号(程序的入口点还有变量的地址等等)。在elf格式中符号表的内容会比a.out格式的丰富的多。但是这些符号表可以用 strip工具去除,这样的话这个文件就无法让debug程序跟踪了,但是会生成比较小的可执行文件。a.out文件中的符号表可以被完全去除,但是 elf中的在加载运行时起着重要的作用,所以用strip永远不可能完全去除elf格式文件中的符号表。但是用strip命令不是完全安全的,比如对未连接的目标文件来说如果用strip去掉符号表的话,会导致连接器无法连接。

例如:

代码:

$:gcc -c hello.c 

$:ls hello.c hello.o

gcchello.c编译成目标文件hello.o

代码:

$:strip hello.o

strip去掉hello.o中的符号信息。

代码:

$:gcc hello.o /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o –o hello

/*

$:gcc hello.o /usr/lib/gcc/i686-pc-linux-gnu/3.4.5/../../../crt1.o7

: In function `_start'

: init.c: (.text+0x18) 

: undefined reference to `main' collect2

: ld returned 1 exit status

*/ 

再用gcc连接时,连接器ld报错。说明在目标文件中的符号起着很重要的作用,如果要发布二进制的程序的话,在debug后为了减小可执行文件的大小,可以用strip来除去符号信息但是在程序的调试阶段还是不要用strip为好。

到此前面遇到的问题基本上也大概明白了。

这篇关于linux 动态库文件stripped属性理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973552

相关文章

Linux命令学习之二

每日一结 ​               命令置换:是将一个命令的输出作为另一个命令的参数,命令格式如下: commond1 `command2` 其中,命令command2的输出将作为命令command1的参数,需要注意的是, 命令置换的单引号为ESC键下方的 ` 其意思就是说,先运行单引号内的命令,再将其命令作为

Linux命令学习之一

每日一结                                                                                        注:当用户不确定一个软件包的类型时, 可使用file命令查看文件类型

Linux文件I/O之一

每日一结(标准I/O)   一  库    本质 :一组实现函数接口 [printf,scanf,strcpy,strlen]   使用标准库好处:屏蔽底层细节,向上层提供统一的接口,提高程序的可移植性   windows 库 : *.dll  linux   库 : *.so    二 系统调用接口    本

Linux网络编程之五

每日一结 组播: ​ 网络地址: 一些特殊的组播地址:   一 组播包收和发 1.发送方 (1)创建用户数据报套接字 (2)填充组播地址和端口  (3)发送数据到组播地址 2.接收方  (1)创建用户数据报套接字 (2)加入组播组  struct ip_mreq mreq; mreq.imr_m

Linux网络编程之四

每日一结 一 UDP并发  核心思想:父进程接收到客户端的数据,就创建子进程,在子进程中创建一个新的套接字  和客户端交互  int do_client(接受客户端地址,数据,数据长度) { 1.创建用户数据报套接字  2.自动分配地址  3.处理数据[例如:输出数据内容] 4.通过新创建的套接字将数据回发给客户端  w

Linux网络编程之三

每日一结 Tftp服务器的实现: server.c ​       client.c     代码分析如下:     一 Linux IO模型  (1)阻塞IO  (2)非阻塞IO  非阻塞IO

Linux网络编程之二

每日一结   一 TCP 函数接口  int listen(int sockfd, int backlog); 功能:设置流式套接字为监听模式  参数: @sockfd    流式套接字的fd  @backlog   请求队列的长度,最大128  返回值: 成功返回0,失败返回-1    int accept(i

Linux网络编程之一

每日一结 一 网络基础知识 (一)IP地址 1.IP   :网络中一台主机唯一标识  2.组成 :网络号 + 主机号  3.IP 分类 最高位    第一个字节 A  1 + 3     0        [0-127]     B  2 + 2    10        [128-191]

Linux进程与线程之五

每日一结 一 共享内存 :内核空间预留出来的一块内存,用于进程间通信  (1)int shmget(key_t key, size_t size, int shmflg); 功能:获取共享内存段的ID  参数: @key    IPC_PRIVATE  或 ftok()  @size   申请的共享内存段大小 [4k的倍

Linux进程与线程之四

每日一结 一 传统的进程间通信  1.信号 : 异步进程间通信方式    信号是对中断机制的一种模拟  进程对信号处理方式: (1)忽略信号  SIGKILL ,SIGSTOP 不能忽略  (2)捕捉 : 信号到达的时候,执行信号处理函数  (3)缺省操作 : 系统默认的操作  大部分信号默认的操作都是杀死进程,SIGCHLD 进