我需要了解我正在处理的项目的ELF文件布局,并且我注意到这些工具的存在.为什么所有Linux发行版都包含readelf和objdump?这些工具是否相互补充?我什么时候更愿意使用另一个?
假设我们有一个名为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带来任何结果?
谢谢
我有一个libTest.so,在某些设备上没有加载.logcat绝对没用.使用arm-linux-androideabi-readelf.exe -d libTest.so我能够看到libTest.so需要的所有必需的库.我将它们全部拉进我本地PC上的同一个文件夹中.
如何找出哪些符号丢失以及哪个库?我只有NDK的标准工具集(nm,readelf,objdump等).哪个工具以及如何使用它以便它解析我的libTest.so和所有依赖的libs并告诉我哪个符号阻止我的lib加载到目标设备上.
作为尝试从头开始编写编译器的一部分,我目前正处理处理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)
这种映射是否需要具有可运行的可执行文件?或者它们可以完全省略,你仍然有一个有效的可执行文件?
以下是来自微处理器启动文件的一行,用于输入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) 我有一些.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) 我正在尝试将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) 我需要从编译的c程序文件中获取全局符号.我使用的是linux命令,readelf -s filePath 当我使用该命令时,这就是我得到的:

我绘制一个蓝色矩形表示变量名称无法正确显示.他们在25个字符后修剪.如何让它显示全名?
我构建了一个程序,它运行良好(我的意思是我可以运行这个程序).但是当我使用"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二进制文件的.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)