动态连接-8 readelf -d ,ldd

[root@localhost mhello]# readelf -d hello

Dynamic section at offset 0x7a8 contains 21 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [file_b.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x80483c8
 0x0000000d (FINI)                       0x804867c
 0x6ffffef5 (GNU_HASH)                   0x804818c
 0x00000005 (STRTAB)                     0x80482a8
 0x00000006 (SYMTAB)                     0x80481c8
 0x0000000a (STRSZ)                      177 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x804987c
 0x00000002 (PLTRELSZ)                   40 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x80483a0
 0x00000011 (REL)                        0x8048398
 0x00000012 (RELSZ)                      8 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x8048378
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x804835a
 0x00000000 (NULL)                       0x0

[root@localhost mhello]# ldd hello
	linux-gate.so.1 =>  (0x00110000)
	file_b.so => /lib/file_b.so (0x00111000)
	libc.so.6 => /lib/libc.so.6 (0x007f0000)
	/lib/ld-linux.so.2 (0x007d0000)


	
[root@localhost mhello]# readelf -d file_b.so

Dynamic section at offset 0x5e4 contains 21 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x37c
 0x0000000d (FINI)                       0x548
 0x6ffffef5 (GNU_HASH)                   0xf8
 0x00000005 (STRTAB)                     0x208
 0x00000006 (SYMTAB)                     0x138
 0x0000000a (STRSZ)                      161 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000003 (PLTGOT)                     0x16b8
 0x00000002 (PLTRELSZ)                   16 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x36c
 0x00000011 (REL)                        0x2f4
 0x00000012 (RELSZ)                      120 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x00000016 (TEXTREL)                    0x0
 0x6ffffffe (VERNEED)                    0x2c4
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x2aa
 0x6ffffffa (RELCOUNT)                   6
 0x00000000 (NULL)                       0x0
 
[root@localhost mhello]# ldd file_b.so
	linux-gate.so.1 =>  (0x00110000)
	libc.so.6 => /lib/libc.so.6 (0x00113000)
	/lib/ld-linux.so.2 (0x007d0000)
[root@localhost mhello]# 



<think>好的,我需要解释用户询问的`ldd -r`命令的作用。用户可能已经了解`ldd`的基本用法,现在想深入理解`-r`选项的具体功能。首先,我得回顾`ldd`的基础知识,确认`-r`的作用。 记得`ldd`主要用于显示可执行文件或共享库所依赖的动态链接库。默认情况下,`ldd`会列出所有直接和间接依赖的库。那`-r`选项呢?我之前学过,`-r`或`--function-relocs`选项会让`ldd`不仅检查未解析的符号,还会执行重定位并报告任何未找到的函数或对象符号。这对于检测动态链接时的缺失符号非常有用,尤其是在某些库版本不兼容或符号被剥离的情况下。 用户可能遇到了运行时符号缺失的问题,使用`ldd -r`可以帮助他们提前发现这些问题,而无需实际运行程序。需要举例说明,比如当编译时链接了某个库,但该库在运行时版本不同,缺少某些函数,`ldd -r`会指出这些未解析的符号。 另外,要注意`ldd`的安全问题,因为运行`ldd`实际上会加载并执行目标程序的依赖库,不可信的可执行文件可能有风险。但用户的问题更多关注功能而非安全,所以重点放在技术解释上。 需要分点清晰地说明`-r`的作用:1. 执行重定位处理;2. 检查未解析的符号;3. 帮助发现运行时可能出现的符号缺失。然后给出一个示例命令和输出解释,比如`ldd -r ./my_program`,并说明输出中可能出现的错误信息。 最后,总结使用场景,比如调试动态链接问题,确保所有符号在运行时都可用。可能还需要对比普通`ldd`和`ldd -r`的区别,强调`-r`的额外检查步骤。确保语言通俗,避免过于技术化,让用户容易理解。</think>### **分步解释 `ldd -r` 命令的作用** #### **1. `ldd` 基础功能** `ldd`(List Dynamic Dependencies)命令用于**显示二进制文件(如可执行程序或共享库)依赖的动态链接库**。例如: ```bash ldd /bin/ls ``` 输出类似: ``` linux-vdso.so.1 (0x00007ffd45df0000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f1a2b2d0000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a2aeb0000) ... ``` --- #### **2. `-r` 选项的核心作用** `-r` 或 `--function-relocs` 选项会让 `ldd` **执行重定位(Relocation)并检查未解析的符号**。 具体行为: - **重定位处理**:模拟动态链接器的行为,解析符号地址。 - **检查未解析符号**:若某些函数或变量在依赖的库中找不到定义,会直接报错。 --- #### **3. 典型应用场景** 当程序依赖的库存在以下问题时,`ldd -r` 能提前发现: - **符号缺失**:如依赖的库版本错误,或编译时链接了不兼容的库。 - **符号冲突**:多个库定义了同名符号。 - **调试动态链接问题**:帮助定位运行时错误(如 `undefined symbol`)。 --- #### **4. 示例演示** 假设编译程序时链接了一个不完整的库(缺少某些函数),执行: ```bash ldd -r ./my_program ``` 输出可能包含: ``` ... libbad.so => /usr/lib/libbad.so (0x00007f8d12345000) undefined symbol: missing_function (./my_program) ``` 这里明确指出了 `libbad.so` 中缺少 `missing_function` 的定义。 --- #### **5. 对比 `ldd` 与 `ldd -r`** | 命令 | 行为 | |--------------|----------------------------------------------------------------------| | `ldd` | 仅列出依赖的库路径,不检查符号完整性。 | | `ldd -r` | 额外执行符号解析,报告未定义或冲突的符号,**更严格**。 | --- #### **6. 注意事项** - **安全警告**:`ldd` 实际上会加载并运行目标程序的依赖库,**不要对不可信的可执行文件使用 `ldd`**。 - **替代工具**:若需安全地检查依赖,可使用 `readelf -d <文件> | grep NEEDED` 或 `objdump -p <文件>`。 --- ### **总结** - **`ldd -r` 的核心价值**:提前发现动态链接时的符号缺失问题,避免程序运行时崩溃。 - **典型使用场景**:调试编译后的程序,确保所有依赖库的符号完整可用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值