标签: readelf

readelf vs. objdump:为什么两者都需要

我需要了解我正在处理的项目的ELF文件布局,并且我注意到这些工具的存在.为什么所有Linux发行版都包含readelf和objdump?这些工具是否相互补充?我什么时候更愿意使用另一个?

linux elf objdump readelf

37
推荐指数
1
解决办法
1万
查看次数

nm vs"readelf -s"

假设我们有一个名为libtest.so的共享库,其中有一个函数"foo"

使用条带丢弃libtest.so中的所有符号

$strip libtest.so
Run Code Online (Sandbox Code Playgroud)

所以,现在如果我们使用:

$nm libtest.so
Run Code Online (Sandbox Code Playgroud)

它会打印出来:

nm:libtest.so:没有符号

但如果我们使用:

$readelf -s libtest.so 
Run Code Online (Sandbox Code Playgroud)

foo函数仍然可以从其结果中看出:

...

10:000005dc 5 FUNC GLOBAL DEFAULT 12 _Z3foov

...

我们也可以使用命令字符串来检查它:

$strings libtest.so
Run Code Online (Sandbox Code Playgroud)

...

_Z3foov

...

这是我的问题,为什么nm没有给条纹libtest.so带来任何结果?

谢谢

linux readelf nm

35
推荐指数
1
解决办法
1万
查看次数

ldd相当于android

我有一个libTest.so,在某些设备上没有加载.logcat绝对没用.使用arm-linux-androideabi-readelf.exe -d libTest.so我能够看到libTest.so需要的所有必需的库.我将它们全部拉进我本地PC上的同一个文件夹中.

如何找出哪些符号丢失以及哪个库?我只有NDK的标准工具集(nm,readelf,objdump等).哪个工具以及如何使用它以便它解析我的libTest.so和所有依赖的libs并告诉我哪个符号阻止我的lib加载到目标设备上.

android android-ndk ldd readelf

21
推荐指数
3
解决办法
1万
查看次数

存储在ELF文件中的"段到段映射"在哪里?

作为尝试从头开始编写编译器的一部分,我目前正处理处理ELF文件的部分.

在浏览了几篇关于它们的文章和规范之后,我仍然不太清楚存储段映射映射的部分.当观察由NASM + ld生成的小型可执行文件时,我可以看到.text部分以某种方式映射到LOAD类型的程序头,但是如何?

当给出一个小的(工作)可执行文件作为输入时,一小段readelf的输出:

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x0000000000000084 0x0000000000000084  R E    200000

 Section to Segment mapping:
  Segment Sections...
   00     .text 
Run Code Online (Sandbox Code Playgroud)

这种映射是否需要具有可运行的可执行文件?或者它们可以完全省略,你仍然有一个有效的可执行文件?

compiler-construction elf readelf

12
推荐指数
1
解决办法
3032
查看次数

在GNU汇编程序中,点在名称的开头表示什么?

以下是来自微处理器启动文件的一行,用于输入GNU汇编程序,如下所示:

.section  .isr_vector,"a",%progbits
Run Code Online (Sandbox Code Playgroud)

名称开头的点是否.isr_vector意味着什么特别的?PS:此名称由GNU链接器ld引用.

编辑:

此名称还在readelf输出中显示为Section Header:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  ...
  [ 1] .isr_vector       PROGBITS        08000000 008000 0001ac 00   A  0   0  1
Run Code Online (Sandbox Code Playgroud)

assembly linker gnu ld readelf

8
推荐指数
2
解决办法
3341
查看次数

如何修补第 3 方 .so 文件以访问非导出符号 (C++)

我有一些.fic专有格式的二进制文件,我有一个wd250hf64.so来自该供应商的包含 C++ 方法的文件 CComposanteHyperFile::HExporteXML(wchar_t* const path)

我可以使用 nm 看到

$ nm  --demangle   wd250hf64.so  --defined-only 


0000000000118c90 t CComposanteHyperFile::HExporteXML(wchar_t const*)
Run Code Online (Sandbox Code Playgroud)

未损坏的版本_ZN20CComposanteHyperFile11HExporteXMLEPKw与我使用本地 g++ 版本的版本相同

雷德夫给出

readelf -Ws wd250hf64.so  | grep _ZN20CComposanteHyperFile11HExporteXMLEPK

 19684: 0000000000118c90   119 FUNC    LOCAL  DEFAULT   11 _ZN20CComposanteHyperFile11HExporteXMLEPKw

Run Code Online (Sandbox Code Playgroud)

现在我尝试编写一个非常简单的程序

$ nm  --demangle   wd250hf64.so  --defined-only 


0000000000118c90 t CComposanteHyperFile::HExporteXML(wchar_t const*)
Run Code Online (Sandbox Code Playgroud)

但是当我用它编译时g++ toto.cpp -L. -l:wd250hf64.so

我有toto.cpp:(.text+0x10): undefined reference to 'CComposanteHyperFile::HExporteXML(wchar_t const*)'

我没有更多的运气dlopen

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int
main(int argc, char **argv)
{
    void *handle; …
Run Code Online (Sandbox Code Playgroud)

c++ reverse-engineering ld readelf nm

8
推荐指数
1
解决办法
923
查看次数

解释readelf -S输出

我正在尝试将elf文件加载到我制作的MIPS模拟器中.我遇到的问题是我不太明白精灵部分标题偏移背后的含义.当我进行段转储时,段25-31和33-35在0x00000000处"开始",但是标题表明该段以某个值的偏移量开始(例如010190).同样在-S部分的开头,readelf声明头部在内存中以0x107b4开始.但是在-S中可以看到,最早的内存分配(因为段0为空)实际上位于偏移010210的段26中.有人可以解释这里发生了什么吗?我想静态地将所有这个文件分配到一个内存数组中.是否有一些关于抵消的假设阻止我这样做?为什么readelf说0x107b4是标题起点?

另外,.init在将PC放在readelf指定的"入口点"之前,我应该运行吗?

编辑:好的,所以,我做了一个可执行文件的十六进制转储,我现在意识到偏移是指实际elf文件中的位置(包含"地址"0 - 11d48的元素.)所以我现在的问题是. ..如何解决许多内存地址引用地址0x00000000的事实?它们当然有不同的偏移但现在我知道这是特定于文件的,它意味着有几个部分别名.我是否真的在内存寻址中使用偏移量?

第25部分:

  0x00000000 00474343 3a202847 4e552920 332e342e .GCC: (GNU) 3.4.
  0x00000010 35000047 43433a20 ...
Run Code Online (Sandbox Code Playgroud)

Readelf -S 输出:

  There are 36 section headers, starting at offset 0x107b4:
Run Code Online (Sandbox Code Playgroud)

章节标题:

  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        00400134 000134 00000d 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            00400144 000144 000020 00   A  0   0  4
  [ …
Run Code Online (Sandbox Code Playgroud)

linker compilation elf readelf

7
推荐指数
1
解决办法
1万
查看次数

readelf -s不输出完整的变量名

我需要从编译的c程序文件中获取全局符号.我使用的是linux命令,readelf -s filePath 当我使用该命令时,这就是我得到的:

在此输入图像描述

我绘制一个蓝色矩形表示变量名称无法正确显示.他们在25个字符后修剪.如何让它显示全名?

linux elf dwarf readelf

7
推荐指数
1
解决办法
5454
查看次数

readelf:错误:不是ELF文件 - 它在开始时有错误的魔术字节

我构建了一个程序,它运行良好(我的意思是我可以运行这个程序).但是当我使用"readelf"来检查是否有调试信息时,会出现错误:

readelf: Error: Not an ELF file - it has the wrong magic bytes at the start    
readelf: Error: test/select: Failed to read file header
Run Code Online (Sandbox Code Playgroud)

我的linux发行版是Ubuntu-12.有人可以帮帮我吗?

elf readelf

7
推荐指数
1
解决办法
2万
查看次数

阅读ELF二进制和打印功能虚拟地址的plt部分

我想读取ELF二进制文件的.plt部分并获取外部函数的所有虚拟地址.

Disassembly of section .plt:

0000000000400400 <puts@plt-0x10>:
  400400:       ff 35 02 0c 20 00       pushq  0x200c02(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
  400406:       ff 25 04 0c 20 00       jmpq   *0x200c04(%rip)        # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
  40040c:       0f 1f 40 00             nopl   0x0(%rax)

0000000000400410 <puts@plt>:
  400410:       ff 25 02 0c 20 00       jmpq   *0x200c02(%rip)        # 601018 <_GLOBAL_OFFSET_TABLE_+0x18>
  400416:       68 00 00 00 00          pushq  $0x0
  40041b:       e9 e0 ff ff ff          jmpq   400400 <_init+0x20>

0000000000400420 <__libc_start_main@plt>:
  400420:       ff 25 fa 0b 20 00       jmpq   *0x200bfa(%rip) …
Run Code Online (Sandbox Code Playgroud)

c executable elf readelf

6
推荐指数
1
解决办法
1943
查看次数