问题标签 [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.
compiler-construction - ELF 文件中存储的“节到段映射”在哪里?
作为尝试完全从头开始编写编译器的一部分,我目前正在处理处理 ELF 文件的部分。
在浏览了几篇关于它们的文章和规范之后,我仍然不太明白节到段映射的存储位置。在观察由 NASM+ld 生成的小型可执行文件时,我可以看到 .text 部分以某种方式映射到 LOAD 类型的程序头,但是如何?
当给定一个小的(工作的)可执行文件作为输入时,一小段 readelf 的输出:
这个映射甚至需要有一个工作的可执行文件吗?还是可以完全省略它们而您仍然有一个有效的可执行文件?
c++ - 打印定义给定符号的库的名称
假设您有符号的名称(已解构或未解构)以及动态链接到其他符号的库的名称,您想找出哪个库能够解析该符号。
我尝试使用nm
,objdump
但readelf
我找不到关于它的好的文档,看起来使用这个工具是不可能的。
gdb
提供了类似的东西,但它是一个调试器,我需要一些东西来快速查找,你知道如何在不启动调试会话的情况下做到这一点吗?
regex - 如何使用 gnu utils 从这三行中选择一行?
所以基本上我想使用这个命令来获取.plt
部分信息。
输出是这样的:
所以基本上我只想得到中间线,即:
我尝试了几种方法,但我就是无法做到...
谁能给我一些帮助?
linux - readelf 命令中 mips 标志的含义?
我在linux上执行了命令“readelf -h test”(“test”是我的二进制程序),得到以下文本:
您能否详细告诉我上述文字中标志的各个含义?
我用谷歌搜索了它,但找不到答案。任何意见将不胜感激。
linux - 我应该参考哪些东西来正确配置交叉编译器?
我已经参考了“readelf -h target.bin”的输出(target.bin 在目标机器上运行)来配置交叉编译器。我假设交叉编译器编译的二进制程序的 readelf 输出应该与 target.bin 的输出相同。
但是,在以下情况下,两个具有不同“readelf”输出的程序可以在目标机器上成功运行。此外,具有与 target.bin 的输出类似的 readelf 输出的另一个程序在目标机器上不可执行。似乎 readelf 输出对于交叉编译器的配置并不重要。 那么...对于目标机器的交叉编译器的正确配置,我应该参考哪些内容?
例子:
readelf -h target.bin(target.bin 是运行在目标机器上的二进制程序)输出:
readelf -h myfail_target.bin(由我编译)在目标机器上不可执行,输出:
readelf -h mysuccess_target.bin(由我编译),可在目标机器上执行,输出:
任何意见将不胜感激。
linux - readelf如何翻译入口点
我有一个 elf 文件,当我使用 readelf -h filename 时,我得到了入口点。现在,假设我想自己计算这个地址[使用汇编,但语言并不重要]。
我怎样才能做到这一点?
我知道入口点是从文件中偏移量 24 开始的 4 个字节,但我不知道如何将这些数据转换为地址。
gcc - 了解为什么 gcc/ld 使用 readelf 链接来自特定库的符号
我在 gcc ( -llapacke -llapack -lcblas
) 中包含了几个库,并且我收到“未定义的引用”错误,除非我明确链接到其中一个库的静态版本 ( lapacke
)。我试图通过使用nm
和搜索有问题的库的各种变体来理解原因readelf
。让我们来看看“未定义”的功能zsysv_rook_
:
这就是动态变体。这是静态变体:
为什么它只编译静态版本?
c - DWARF - 如何在给定的二进制文件中找到函数的序幕结束/结尾起始地址?
我有一个 ARM 二进制文件,我需要准确地找到它的函数序言结束和结语开始的地址。换句话说,我需要功能体的边界。例如,如果我有一个函数,其程序集类似于:
我需要一种方法来使用 readelf 或 objdump 之类的东西快速找到0x00000326
and 0x0000034e
(prologue end/epilogue start) 或0x00000328
and (function body start/end)。0x0000034c
简单地反汇编它并检查代码是行不通的(理想情况下,我会使用脚本来解析 readelf 的输出或我用来获取 DWARF 信息的任何程序)。
根据 DWARF 4 标准,.debug_line 部分应该有行号信息,其中包括“ prologue_end
”和“ epilogue_begin
”,这正是我所需要的。但是,输出arm-linux-readelf --debug-dump=rawline,decodedline
并没有给我那个信息。
我正在使用gcc 4.8.2
标志-ggdb3
进行编译。
编辑:更多信息:objdump 和 readelf 都向我展示了这样的内容:
查看 binutils 的 dwarf.c 的来源,它似乎应该在行信息转储中打印类似“Set prologue_end to true”和“Set epilogue_begin to true”的内容。然而,所有的操作码似乎都是特殊的而不是标准的。
linux - 绝对路径如何进入可执行文件动态部分的“需要”部分?
我有许多链接到单个库路径的可执行文件。例如,可执行文件foo
链接到 (say)libboost_system.so
和libfoo.so
,后者是我自己构建的。我将第三方库放在一个变量LDLIBS
中,并通过链接我的库-lfoo
,因此 makefile 行如下所示:
然而,当我readelf
,我看到了自己的道路!
我自己的库是唯一具有绝对路径的库。
我怎样才能摆脱这个怪物只使用makefile,即不使用patchelf --replace-needed
or chrpath
?
c - 读取 ELF 二进制文件的 plt 部分并打印函数虚拟地址
我想读取 ELF 二进制文件的 .plt 部分并获取外部函数的所有虚拟地址。
比如0x400410
和函数名puts@plt
等等。我试图阅读REL_PLT
ELF 二进制文件的部分。但是我从全局偏移表中获得了0x601108
PLT 条目的地址。0x400410
如何获取 plt 条目的虚拟地址?
编辑:原来我正在阅读got.plt
部分。如何.plt
使用 readelf 仅阅读部分?