问题标签 [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.
elf - 使用 binutils/readelf 确定符号地址
我正在开发一个项目,我们的验证测试脚本需要在被测软件的构建中定位符号地址。这可能用于设置断点或从内存中读取静态数据。我所追求的是创建一个包含符号名称、内存中的基地址和大小的映射文件。我们的构建输出一个 ELF 文件,其中包含我想要的信息。我一直在尝试使用readelf、nm 和 objdump工具来尝试并获得我需要的符号地址。
我最初尝试过readelf -s file.elf
,这似乎可以访问一些符号,尤其是那些用汇编程序编写的符号。然而,我想要的许多符号都不在那里——特别是那些源自我们的 Ada 代码的符号。
我曾经readelf --debug-dump file.elf
转储所有调试信息。从中我确实看到了所有符号,包括 Ada 代码中的符号。但是,格式似乎是 DWARF 格式。当我要求它列出符号信息时,有谁知道为什么 readelf 不会输出这些符号?也许我只是缺少一个选项。
现在我可以编写一个自定义 DWARF 解析器来获取信息,但如果我可以使用 Binutils(nm、readelf、objdump)之一来获取它,那么我真的更喜欢标准解决方案。
python - 如何在 python 中读取 ELF 文件的动态部分
我想获取有关 ELF 文件的动态部分的信息。基本上与我使用命令行获得的信息相同:
readelf -d elfFile
c - Printf 符号分辨率
我正在编写一个小程序,它使用 ptrace(单步、getregs、pick_text、操作码比较等)跟踪二进制文件(elf)的所有系统调用和调用。
到目前为止,我已经成功地跟踪了系统调用和简单的调用,比如用户定义的函数。
但是由于 ptrace,我无法从我选择的地址中获取 printf 符号的名称。
我的问题是:对于 printf、strlen 等动态链接函数,如何在 elf 文件中从地址中检索符号名称?
通过简单的调用,这很容易,我遍历 .strtab 部分,当地址匹配时,我返回相应的 str。
但是对于 printf,该符号在 .strtab 中是已知的,但地址为“0”。
objdump -d 以某种方式成功地将对 printf 的调用与其地址链接起来。
你有什么主意吗 ?
arm - ARM ELF 对象内的函数大小不正确
目标文件的 readelf 输出:
.text 部分结构据我所知:
.text 部分的大小为 0x124
请注意,节大小为 0x124,最后一个函数以 0x125 结束,丢失的字节发生了什么?
谢谢。
python - 如何在 ELF 文件中查找全局变量的类型?
因为这是我在 SO 上的第一个条目:大家好 :)
现在到了好的部分......我正在努力从 ELF 文件中找出一种全局变量。我编译前的源代码是这样的:
当我用 readelf 或 objectdump 试试运气时,这是我得到的最远距离。结果readelf -s LEKCJA2.elf
是:
如您所见,我可以列出我的全局变量(例如variable_global1
),我也知道它在内存中的大小,但不幸的是不知道类型 - 无论是 unsigned int、signed int、UBYTE 等等。
最后我的问题:是否甚至可以从 ELF 文件中找出一种全局变量(未初始化或已初始化),如果可以,我该怎么做?现在我正在使用不同的 CMD 工具和 Python 库来解析 ELF 文件,但我无法更接近我想要做的事情。
我感谢你所有的帮助:)
gdb - gdb backtrace 如何知道每个函数取自哪个库?
我编写了一个简单的程序,它所做的只是调用一个名为 meller1 的函数,该函数调用 meller2,依此类推,直到某个函数调用空闲并崩溃。当使用 coredump 文件在该程序上运行 gdb 回溯时,我收到:
我的问题是,gdb bt 怎么知道 free 是取自 /lib/libc.so.6 的?给定一个Coredump文件和可执行文件本身,有没有一种我可以自己做的手动方式?谢谢。
linker - Readelf查找绝对地址
我有一个 C 程序,它有一个全局变量和一个局部变量。我的问题是在readelf上。以下是我的问题;1. 当我使用“readelf --symbols”进行地址转储时,我得到的全局变量地址与我运行程序时打印的地址相同。readelf 如何在我的程序运行或加载之前知道绝对地址?2. 为什么没有局部变量符号的信息?我只能看到全局变量的符号。
linux - ldd -v 中的版本信息是什么意思?
所以有 3 行libc.so.6
,版本为GLIBC_2.xx
。
这意味着什么?这liblapack.so
需要什么版本的 libc.so.6?
我怎样才能得到liblapack.so
的版本?
c++ - 在 Linux 中使用插件的 C++ 程序的最佳实践
有人可以阐明将插件加载到 C++ Linux 程序中的最佳实践是什么?
假设我们有一个带有插件(libsyntax.so)的程序(编辑器)。编辑器的配置文件包含 libsyntax.so 库的路径 (plugin1=/opt/editor/gizmos/libsyntax.so)。编辑器读取配置然后调用:
一切都很好,东西工作。
现在让我们假设 (libsyntax.so) 依赖于辅助库 (libcolor.so)。当我们运行 readelf 时,我们得到:
但是此时上述 dlopen() 失败并且错误是“没有这样的文件或目录”。使用 LD_DEBUG=all 显示在加载 libsyntax.so 后,消息是:
加载器/链接器正在标准位置查找,显然没有找到我的依赖项。这可以通过 ldconfig 或 LD_LIBRARY_PATH 轻松解决,但两种解决方案都感觉很脏。
有没有一种干净的方式来加载插件和依赖项?你是怎么做到的?
gcc - ELF 文件中的 VirtualAddress、LoadAddress 和 PhysicalAddress?
根据输出部分描述的ld手册:
地址或>区域代表VMA,即输出部分的虚拟内存地址。
AT()或AT>lma_region代表 LMA,即输出部分的加载内存地址。
我决定仔细查看readelf -e
转储 helloworld elf 文件的节头和程序头。结果如下:
我的问题是:
- 为什么转储的标头中没有LMA?LMA 在 ELF 文件中如何表示?
- 红色矩形中的 Addr 列是什么意思?虚拟机?
- 绿色矩形中的 PhysAddr 是什么意思?
加 1
到目前为止,PhysAddr 似乎是 LMA。