问题标签 [readelf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linker - 解释 readelf -S 输出
我正在尝试将一个 elf 文件加载到我制作的 MIPS 模拟器中。我遇到的问题是我不太明白 elf 部分标题偏移背后的含义。当我进行段转储时,段 25 - 31 和 33 - 35 在 0x00000000 “开始”,但标题指出该段从某个值的偏移量开始(例如 010190)。同样在 -S 部分的开头,readelf 声明标头在内存中的 0x107b4 处开始。但是从 -S 中可以看出,最早的内存分配(因为段 0 是空的)实际上在段 26 的偏移量 010210 处。有人可以解释这里发生了什么吗?我想将所有这些文件静态分配到一个内存数组中。是否有一些关于偏移量的假设阻止我这样做?为什么 readelf 说 0x107b4 是标题起点?
另外,我应该.init
在将PC放在readelf指定的“入口点”之前运行吗?
编辑:好的,所以,我对可执行文件进行了十六进制转储,现在我意识到偏移量是指实际 elf 文件中的位置(包含“地址”0 - 11d48 处的元素。)所以我现在的问题是。 ..我如何解决许多内存地址引用地址0x00000000的事实?它们当然有不同的偏移量,但现在我知道这是特定于文件的,这意味着几个部分的别名。我真的在内存寻址中使用偏移量吗?
第 25 段:
Readelf -S
输出:
部分标题:
gcc - gcc 告诉寄存器从哪个变量编译
我需要知道从哪个变量编译obj文件中的二进制指令的寄存器。
简而言之:每条指令从寄存器到变量的映射
示例:假设 objdump 给出了一个 obj 文件片段:
我们怎么知道 R1 存储了源代码中的变量,比如var1 ?而 R2 存储var2?
我在readelf的文档中进行了搜索,不幸的是徒劳无功。
(虽然它可以为我提供源代码和二进制文件之间的线映射,但它对我没有进一步的帮助)
然后我搜索了一些 gcc 和链接器的调试选项。找到了一些有用的信息,但他们仍然没有解决我的问题。
我找到的信息是:
- 选项-fdump-rtl-vartrack可以跟踪所有变量,似乎很有用。但是在使用此选项进行编译时,我没有找到预期的 *.vartrack 转储文件。
- 选项*fdump-rtl-vartrack-uid显示每个变量的唯一 ID (DECL_UID)。但是我在使用时收到了这个错误:cc1: error: unrecognized command line option "-fdump-tree-uid"
- 选项fdump-rtl-lreg转储本地寄存器分配,但我看不出它如何告诉我从 reg 到变量的映射。
有没有人有一些经验或想法?
谢谢你们!
破解...
linux - readelf vs. objdump:为什么都需要
我需要了解我正在从事的项目的 ELF 文件布局,并且我注意到这些工具的存在。为什么所有 Linux 发行版都包含 readelf 和 objdump?这些工具是否相互补充?我什么时候更喜欢使用一个而不是另一个?
linux - 为什么 /lib32/libc.so.6 里面有两个“fopen”符号?
这是我的问题:
为什么 /lib32/libc.so.6 里面有两个 fopen 符号?应该禁止同一目标文件中的相同符号,对吗?
为什么 readelf -s 转储 fopen@@GLIBC_2.1 和 fopen@GLIBC_2.0 而不是 fopen?
谢谢
elf - 来自 elf 可执行文件的结构中元素的地址
是否可以从不为调试编译的 ELF 可执行文件中获取结构中元素的地址?
例如,给定以下代码:
nm 和 readelf 都给出了变量“places”的起始地址,readelf 也给出了 sizeof:
但是我需要的是结构中每个元素的地址。所以从上面我想要的是:
我目前唯一的方法是使用 dwarf2 调试信息进行编译,使用 readelf (-wliao) 转储 .debug_info 部分,然后从 DW_TAG_variable 中解析类型树,并加上 base_type 大小。示例自述:
我需要找到一种在不访问源代码的情况下执行此操作的方法,并且关闭调试信息..
任何帮助或指针表示赞赏。
谢谢,克里斯
linux - nm 与“readelf -s”
假设我们有一个名为 libtest.so 的共享库,其中有一个函数“foo”
使用条带丢弃 libtest.so 中的所有符号
所以,现在如果我们使用:
它会打印出来:
nm:libtest.so:没有符号
但如果我们使用:
foo 函数仍然可以从其结果中看出:
...
10: 000005dc 5 FUNC 全局默认值 12 _Z3foov
...
我们也可以使用命令字符串来检查它:
...
_Z3foov
...
这是我的问题,为什么 nm 没有给出条带化 libtest.so 的结果?
谢谢
simulation - 用于模拟的精灵到内存图像
我正在编写 Sparc V8 的 C++ 仿真模型。内存被简单地建模为一个数组。我需要读取一个由交叉编译器生成的 elf 可执行文件并用它来初始化内存。我打算这样做如下。
这会生成一个(地址、单词、单词)格式的文本文件,如下所示:
问:最后一列中的所有点是什么?
问:有没有更好的方法从 elf 可执行文件生成内存映像?我想我只需要复制 .text、.rodata 和 .data 部分
感谢您的任何建议
gcc - objdump/readelf 获取变量信息
我需要从已编译的 c 程序中获取有关全局变量的信息。我在这里问了一个类似的问题。
我现在遇到的问题是我试图提取变量信息的程序非常大,只需要 4 秒才能获得文本中的树(readelf -w[i] file.out
)。然后我必须解析来回跳跃的树才能到达我需要的地方。例如,如果一个变量是类型的,const unsigned char * volatile MyVariable
那么我将不得不导航到树的 5 个不同节点,如果程序包含 1000 个变量,那么需要一段时间才能得到我需要的东西。
所以我的问题是如何更好地利用 readelf 命令来实现我所需要的。该readelf -w[i] file.out
命令为我提供了我需要的更多信息(每个函数、子程序、局部变量等)。例如,我没有通过该命令的输出来获取全局变量,而是使用该readelf -s --wide file.out
命令来获取变量。该命令只会给我变量的名称,所以我仍然需要在树中查看变量是否为整数。
在此链接的第 237 页上,我相信有一个示例说明如何获取有关类型的信息。这是一张照片:
我需要大约 15 秒来解析我需要的内容,但仍然有几个错误。如果我不必重新发明轮子并更好地使用 readelf 命令,那就太好了。
linux - readelf -s 不输出完整的变量名
我需要从编译的 c 程序文件中获取全局符号。当我使用该命令时,我使用的是 linux 命令readelf -s filePath
,这就是我得到的:
我画了一个蓝色矩形来表明变量名没有正确显示。他们在 25 个字符后得到修剪。我怎样才能让它显示全名?
windows - 找出模式以在编译的程序中查找变量
我需要从已编译的 c 程序中提取全局变量。我现在正在做的是使用 Linux readelf 命令来获取该信息。换句话说,当我这样做时:
我使用可以从这里readelf.exe
下载的程序来做到这一点。因为我使用的是 Windows,这是我需要的唯一命令。在 linux 上,我将打开控制台并执行readelf -w[i] myFile.out
无论如何,当我执行该命令时,我会得到类似的东西:
有了那个“树”,我可以得到所有的全局变量和类型。例如,如果您查看第一个变量NetBuf_ID_Ctr
,我们可以看到我们可以获得有关节点上的类型的信息 <0x86923>
。那个节点在树的某个地方!如果你看一下那实际上是第一个节点。开始的那个 <1><86923>....
,如果您在该节点内部看到,我们知道该变量是一个无符号整数,大小为 4 个字节。
现在我的问题是,当我使用 readelf 命令时,我得到 了 192883 行需要解析的文本!这棵树给了我更多我需要的信息。如果我用十六进制编辑器查看文件,这就是我所看到的:
请注意,我能够找到相同的变量NetBuf_ID_Ctr
,并且它旁边(突出显示)是它的地址<0x86923>
!
互联网上有没有地方可以指导我如何构建树?命令 readelf.exe 需要 0.1 秒来创建树!它将输出放在 StreamReader 上,这就是它如此快的原因。如果我希望将 StreamReader 放在内存上,将其转换为需要很长时间的字符串。
编辑
总之,我想知道如何从 myFile.out 构造树(readelf 的输出)。我无法弄清楚这种模式,互联网上也没有一个地方可以解释如何。