linux 动态库文件stripped属性理解

本文解释了在 CentOS 6.2 下使用 file 命令查看 ELF 文件时,stripped 和 not stripped 的含义。介绍了 ELF 文件格式中的符号表作用及 strip 工具的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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为好。

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

<think>嗯,用户问到了关于.so文件中显示的“64-bit LSB pie executable”和“64-bit LSB shared object”之间的区别以及对使用的影响。首先,我需要回忆一下ELF文件格式的相关知识。ELF(Executable and Linkable Format)是Linux系统中常见的文件格式,用于可执行文件、共享库等。 用户之前的问题是关于“not stripped”的含义,现在转向了文件类型的不同描述。这可能意味着他们在进行系统调试或开发时遇到了相关的文件,需要进一步理解这些术语的意义以及实际影响。 首先,“64-bit LSB pie executable”和“64-bit LSB shared object”都是ELF文件类型。LSB代表Least Significant Byte,即小端字节序。PIE(Position Independent Executable)是一种位置无关的可执行文件,而shared object则是共享库。需要明确这两者的区别。 可能用户在使用file命令时看到了这两种不同的输出,想知道它们之间的区别。例如,当一个.so文件被识别为PIE executable而不是shared object时,是否会影响其作为共享库的功能?或者是否有其他潜在的问题? 接下来,需要解释两者的技术差异。PIE executable和shared object都是位置无关的,但它们的用途不同。PIE主要用于可执行文件,而shared object是共享库。然而,有时候构建过程可能导致共享库被标记为PIE executable,这可能是因为编译时的选项或构建系统的配置问题。 需要确定这种标记是否会影响库的使用。例如,动态链接器在加载共享库时是否会有不同的处理方式?是否会导致兼容性问题?此外,是否在某些情况下这种标记是正常的,比如某些构建工具或特定配置下的结果? 还要考虑用户可能的实际应用场景。例如,用户可能在开发过程中遇到了链接错误或运行时问题,怀疑是文件类型标识不同导致的。需要解释即使标记为PIE executable,只要导出符号正确,共享库仍然可以正常使用,但某些构建配置可能需要调整。 另外,需要检查是否有常见的工具或命令可以进一步分析或修改这些属性,比如readelf或objdump,来查看ELF头中的具体信息,帮助用户确认文件的实际类型和属性。 总结来说,回答需要包括: 1. 解释两个术语的具体含义。 2. 分析它们的区别,尤其是在ELF文件类型中的不同。 3. 讨论对实际使用的影响,包括可能的兼容性问题或构建配置注意事项。 4. 提供验证和处理的建议,帮助用户确认文件类型并解决问题。 需要确保语言清晰,结构合理,避免使用过于专业的术语,但又要准确传达技术细节。同时,要联系用户之前的问题,保持连贯性,让用户能够逐步深入理解相关概念。</think>以下是关于 **`64-bit LSB pie executable`** 和 **`64-bit LSB shared object`** 的详细解释及对比分析: --- ### 一、**基础概念** 1. **ELF 文件类型** Linux 系统中的可执行文件、共享库等均采用 **ELF(Executable and Linkable Format)** 格式。通过 `file` 命令输出的信息反映了其类型和属性。 2. **关键术语** - **64-bit**:64 位架构编译的文件。 - **LSB(Least Significant Byte)**:小端字节序(常见于 x86/x86_64 架构)。 - **PIE(Position Independent Executable)**:位置无关的可执行文件(加载到内存时地址随机化)。 - **Shared Object**:共享库(`.so`),供其他程序动态链接使用。 --- ### 二、**两种类型的区别** | **属性** | **`64-bit LSB pie executable`** | **`64-bit LSB shared object`** | |-------------------------|-----------------------------------------|------------------------------------------| | **主要用途** | 可直接执行的程序(如编译后的二进制) | 动态共享库(需被其他程序链接使用) | | **位置无关性** | 必须支持(PIE 特性强制开启) | 默认支持(共享库本身需位置无关) | | **入口点** | 有 `main()` 函数入口 | 无入口点(仅导出函数供调用) | | **编译选项** | `gcc -pie -fPIE` | `gcc -shared -fPIC` | | **动态链接依赖** | 可能依赖其他共享库 | 被其他程序或共享库依赖 | --- ### 三、**为何 `.so` 会显示为 `pie executable`?** 1. **常见原因** - **误操作**:编译时混淆了可执行文件和共享库的编译选项(例如未添加 `-shared`)。 - **特殊设计**:某些库被设计为可执行文件(如结合 `dlopen()` 自加载)。 2. **技术验证** 使用 `readelf` 查看文件头,确认类型: ```bash readelf -h libexample.so | grep "Type" # 正常共享库应显示:Type: DYN (Shared object file) # PIE 可执行文件显示:Type: DYN (Position-Independent Executable file) ``` --- ### 四、**对使用库的影响** 1. **正常情况** - 若共享库误标为 `pie executable`,但实际导出符号正常(通过 `nm -D libexample.so` 确认),则 **不影响动态链接和使用**。 2. **潜在问题** - **链接器警告**:某些旧版本链接器可能对类型不匹配产生警告。 - **安全策略限制**:若系统启用 SELinux/AppArmor 等强制访问控制,可能因文件类型不符导致加载失败(罕见)。 3. **修复建议** 若需严格生成共享库,修正编译命令: ```bash gcc -shared -fPIC -o libexample.so source.c # 明确使用 `-shared` ``` --- ### 五、**总结** - **核心差异**:`pie executable` 是可直接运行的位置无关程序,`shared object` 是供动态链接的库。 - **对使用的影响**:若共享库误标为 `pie executable`,但符号导出正常,通常无实质影响;若需规范构建,应修正编译选项。 - **验证方法**:通过 `readelf` 和 `nm` 检查文件头和符号表。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值