问题标签 [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 - 如何使用 GDB 调试加载器/链接器问题
我正在调试在我的程序启动之前发生的一个特别奇怪的问题,即。这发生在代码在“_start”符号处开始执行之前的加载时间。是的,我正在手动修改 ELF。没有迹象表明 ELF 格式不好,我正在使用 libelf 进行修改,并且到目前为止一直非常成功。
使用 GDB,我可以看到内存中的 .plt.got、.data(rw 数据)和 .bss 部分,并在“_start”地址(或 readelf 返回的入口点地址)处放置一个断点。.plt.got 和在我运行程序之前,.data 看起来都很好。然后我运行程序,我的 .data 部分以及 .plt.got 中的最后一个条目都被零清除了。
最初我以为是 .bss 初始化到了错误的地址,但正确加载了 .bss 数据(几个全局变量)。然后我还观察到,如果我改变 .data 的大小,它被初始化的地址块也会增长 - 它总是比我的 .data 部分的大小大 16 字节,如果我改变它不会增长.bss 部分大小。
我该如何调试呢?GDB 不会让我拦截或向运行时加载的库添加断点(或者我不知道如何),而且我确信加载器/链接器用作初始化某些数据的基础可能有一些数据出错记忆。
我还在寻找一些指向默认 std gnuc 东西的指针,这些东西在加载/链接时运行并执行一些初始化,以及该块中的哪些进程执行程序页面中数据的初始化,特别是任何会关闭大小的东西.data 部分。
以下是一些相关数据:
初始化从 0x606050 开始(清除 .got.plt 中的最后一个条目,即 execv@GLIBC_2.2.5)
以及相关部分:
请注意,无论我制作的 .data 部分多么大,我都看到一个从 0x606050 开始的块,比 .data 部分大 16 字节被设置为零 - 顺便说一句,它会覆盖我所有的 rw 数据。
c++ - 如何从 elf 文件的部分标题中提取所有字段?
所以我能够在这里使用精灵教程获取 sh_name:http ://wiki.osdev.org/ELF_Tutorial和这个问题:在节头精灵文件中获取 sh_name 成员,但是使用相同的方法来获取其余部分在部分标题中的字段中,当我调用readelf -S
我正在分析的目标文件时,我没有得到相同的输出。我正在打印出以下字符串:
当我这样做时,我什么也得不到。是选角的问题吗?我应该将其转换为 int 或类似的东西吗?我认为这将是一种字符串格式,因为我假设sh_strtab
是与节标题相关联的字符串表。
elf - readelf 显示两个版本号
我尝试使用 -h 选项运行 readelf,它会显示两个名为 Version 的字段,其中的数字均为 1。
它在一个字段中显示版本 1(当前),在另一个字段中显示版本 0x1。
这两个领域的意义何在?
c++ - 来自同一地址的 readelf 几乎重复的符号
我正在使用 readelf 来弄清楚为什么二进制文件这么大,但我对输出感到困惑。或者我的二进制文件链接非常错误。现在二进制文件大约是 380MB,如果我这样做:
readelf -W -s 二进制文件 | awk 'NR > 3 { sum += $3 } END { 打印总和 }'
我得到 236221726 字节。似乎很低,但也许我缺少静态符号或没有。但如果我这样做:
readelf -W -s 二进制文件 | 排序 -n -r -k 3 | 较少的
我看到这个:
172766:000000000cf8d960 99993 FUNC 全局默认值 10 符号A
147338: 000000000cf8d960 99993 FUNC 全局默认值 10 符号 B
132791: 000000000cf8d960 99993 FUNC 全局默认值 10 符号A
107363: 000000000cf8d960 99993 FUNC 全局默认值 10 符号 B
其中 symbolA 和 symbolB 仅 1 个字符不同,并且对同一事物进行分解。
所以,我的问题:1)如果这些东西有相同的地址,我的二进制文件中实际上有四个副本吗?2)如果没有四个副本,并且这些是别名,那么 readelf 不应该报告吗?3)如果是四个副本,如何以及为什么?我假设我在做一些不好的链接方式。4)如果没有四个副本,那么来自 readelf 的总大小远低于二进制文件的实际大小 - 为什么?
编辑:添加更多信息...上面的 readelf 输出来自完全链接的二进制文件。仅查看包含 symbolA/symbolB 的 .o,readelf 仍然在同一地址报告每个 symbolA 和 symbolB 的 1 个副本。
但是如果我 objdump -d .o 文件,我只会看到 symbolA 的程序集。
那么 - objdump 或 readelf 是“错误的”吗?
c - 如何在结构“Elf64_Rela”中获取符号名称
这是我获取.rela.dyn
section 的代码。但我不知道如何获得符号的名称。我知道Elf64_Rela
结构没有name
字段。在“SYMTAB”部分,我可以使用&strtab[p->st_name]
. 我能怎么做?
linux - What does numbers in parenthesis means in readelf outputs?
When using readelf on executables, I get a number in parenthesis after some symbols names. For instance:
There is a (3)
after the symbol name for stderr in that case. What does this means ?
c - 如何查找 ELF 文件的 .dynamic 部分中的条目数?
有没有一种方法可以在不使用 readelf 实用程序的情况下确定 ELF 文件的 .dynamic 部分中的条目数?我正在尝试使用该gelf_getdyn()
函数从 .dynamic 部分输出数据,但无法找出以编程方式查找此部分中条目数的方法。任何可以提供帮助的帮助或网页(找不到源代码readelf
)都将非常感激。
file - ELF 文件中的 .data 和 .symtab 有什么区别?
我的理解是 .data 存储了程序初始化的全局变量。但这不也是 .symtab 存储的吗?
c - 精灵。隐藏已链接 DSO 的导出符号
我有一个已经编译/链接的 DSO 文件,它导出了一些确实必须隐藏的函数。当我尝试将我的代码与该库链接时 - 它会选择那些不需要的符号而不是我自己的符号。我无法访问源代码,因此我无法重建二进制文件并为不需要的东西使用适当的可见性属性。
我在这里看到唯一的一种解决方案 - 将不需要的符号形式GLOBAL
的可见性HIDDEN
直接更改为二进制。进行这种更改的明显工具是objcopy
,但问题是objcopy
没有修改动态符号表的选项,它只能处理常规符号表。
那么有谁知道哪个工具可以让我改变动态符号表中符号的可见性?
c++ - 为什么我不能像 C++ 中的 Little Endian 文件那样读取 Big Endian ELF 文件?
本质上,我正在做类似于https://wiki.osdev.org/ELF_Tutorial的事情,我将数据加载到结构中并通过它们的偏移量读取各个部分。主机是小端,我正在尝试分析为大端目标交叉编译的文件。我尝试对这些大端文件执行与小端文件相同的代码序列,但是在尝试访问这些部分时代码段错误。
为什么大端文件的代码会失败?