- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 GCC 的早期版本中,objdump
报告的符号偏移量与代码实际执行期间使用的符号偏移量相匹配。例如:
$ cat example.c
#include <stdio.h>
int g_someGlobal = 0;
int main()
{
printf("%d\n", g_someGlobal);
return 0;
}
$ gcc-6 -v
...
gcc version 6.1.1 20160802 (Debian 6.1.1-11)
$ gcc-6 -O0 -g -o example example.c
$ objdump -x example | grep Global
...
080496f4 g O .bss 00000004 g_someGlobal
...
事实上,在运行二进制文件时,执行过程中使用的符号的实际地址与 objdump 报告的地址相同:
$ gdb ./example
...
(gdb) start
Temporary breakpoint 1, main () at example.c:10
10 printf("%d\n", g_someGlobal);
(gdb) p/x &g_someGlobal
$1 = 0x80496f4
不幸的是,在最近发布的 Debian Stretch 中重复相同的命令序列,却发生了这种情况:
$ gcc-6 -v
...
gcc version 6.3.0 20170415 (Debian 6.3.0-14)
$ gcc-6 -O0 -g -o example example.c
$ objdump -x example | grep Global
00002020 g O .bss 00000004 g_someGlobal
符号偏移现在似乎是一个更小的值 - 这......
$ gdb ./example
...
(gdb) start
...
Temporary breakpoint 1, main () at example.c:7
7 printf("%d\n", g_someGlobal);
(gdb) p/x &g_someGlobal
$1 = 0x80002020
...不再与运行时使用的匹配。
我在这里犯了一个错误吗?在此期间,工具的用法是否发生了变化?如果不是,这一变化背后的原因是什么?
无论如何 - 理论上必须有一种方法来获取托管变量的 .bss 段的“预期运行时偏移量”(objdump
确实报告它将被放置在哪个部分,因此最终的运行时位置可以通过添加 .bss
偏移量来计算)。不过,在我的初步尝试中,我还没有找到实现这一点的方法:
$ readelf --sections example | grep bss
[26] .bss NOBITS 0000201c 00101c 000008 00 WA 0 0 4
这似乎没有报告 0x80000000 的“移位”,而在本例中,这似乎发生在 .bss
托管变量上。
(即使这是这个新执行环境的“魔法常量”,这也适用于 .data
变量吗?说实话,我讨厌魔法值 -以前,无论符号位于何处,objdump -x
得出的结果都是准确的...)
非常欢迎任何解决此问题的信息。理想情况下,我想重现 objdump -x 的旧行为 - 即静态地(不是在运行时)从 ELF 获取符号的运行时地址的值托管它。
更新:我对 GCC7.1.0 进行了自定义编译(从源代码),这不再可重现。也许这是 GCC 6.3(Debian Stretch 中打包的版本)中的回归......
最佳答案
原因是 Debian 的 gcc 软件包是使用 --enable-default-pie
构建的。在 PIE 可执行文件中,ELF 段可以加载到任意(只要正确对齐)基地址,通常由加载器随机选择。您在 ELF 文件中看到的符号地址是相对于其加载的基地址的偏移量,而不是绝对虚拟地址。
如果您不想/不需要 PIE,您可以将 -no-pie
添加到链接命令行,以像您习惯的那样获取链接时确定的地址。
关于c - objdump 报告的符号偏移量不再与运行时偏移量匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45369536/
我正在检查使用以下命令编译的 C 文件的 objdump: riscv64-unknown-elf-gcc -O0 -o maxmul.o maxmul.c riscv64-unknown-elf-o
当我运行 objdump 时,我无法找出为什么我的汇编代码中有时会缺少一些 .words。一行中单独的“...”代表什么? 最佳答案 在 -d 或 -D(反汇编)的 objdump 输出内部,通常会有
SYMBOL TABLE: 0000000000000000 w *UND* 0000000000000000 __gmon_start__ 我已经man ob
转储可执行文件时,我只希望将代码段打印在标准输出上,而不是代码的偏移量和二进制形式。我无法从 man objdump 有办法吗? 最佳答案 您可以使用以下命令抑制目标代码十六进制转储 --no-sho
$ objdump -f ./a.out ./a.out: file format elf32-i386 architecture: i386, flags 0x00000112: EXEC_
在 GCC 的早期版本中,objdump 报告的符号偏移量与代码实际执行期间使用的符号偏移量相匹配。例如: $ cat example.c #include int g_someGlobal = 0
当我运行objdump -d 时在 Linux 服务器(在大学)上,我得到以下信息: kmwe236@kmwe236:~/Downloads/buflab-handout$ objdump -d bu
我正在尝试使用 objdump 比较二进制文件的两个不同版本,想知道是否有人知道如何从我的 objdump 输出的以下行中解释符号名称: 102b33bc l O .rodata 000
如果我在一个函数中定义一个本地字符数组,然后使用 objdump 获取该特定函数的汇编代码,我能否在汇编代码中找到该数组的内存? 这是我的家庭作业问题。 最佳答案 当然,只要您的数组具有非零初始值设定
我使用 objdump -d a.out 获得以下内容。我最初假设第一列(例如 080482b4)是字节偏移量,但后来我注意到该文件只有 7190 字节长! a.out: file forma
我在 nasm (linux) 中写了一个简单的小程序: 使用命令 nasm -f elf32 -o file.o file.asm生成目标文件。 使用 objdump -M intel -d fil
有没有办法在 objdump 中获取完整地址?使用的命令是:objdump -d progname 前导零不正确。地址应如下所示: 地址中的最后三个值是正确的;但是,我非常希望在 objdump 中显
我发现不得不反汇编大量库代码只是为了获得足够的上下文来查看导致崩溃的原因,这真的很烦人。有没有什么办法可以让 objdump 一个地址,让它为我找到包含函数的边界? 编辑:更好的是,我可以让它为我分解
请参阅特定函数 (func) 的特定目标文件的以下 objdump 行: 3c: e03a b.n 78 现在,目标系统 (ARMv6-M) 中的操作码 e03a
我们如何使用objdump输出到二进制文件? 这绝对不是正确的做法: objdump -s -j .text /path/firmware.ko > /content.bin 因为它只呈现文本格式。我
如果我在 (linux amd64) .o 文件上运行 objdump -d,函数调用会在没有完成链接时间解析的情况下出现。示例: 90: 66 89 44 24 1c mo
例如,如果我在 perf report 中,我可以按 enter 键跟随一个分支。如果一个 bin 使用 -g 一些来源也会出现。 我真的不需要源代码,但如果我能跟着跳转会很方便。我该怎么做才能使阅读
这个问题在这里已经有了答案: meaning of objdump -d output assembly (2 个回答) 5 个月前关闭。 我跑了objdump -r在目标文件上并得到以下输出。这里的
我有以下汇编代码: global _start section .text _start: add byte [eax], al 编译和链接后,我尝试查看操作码: $ objdump -d eax.o
因此,我尝试使用 objdump 实用程序从程序集构建控制流图,但遇到了问题。基本上,每当发生分支并且目标地址是相对的时,我不知道如何知道下一个基本块从哪里开始。我不确定我是否清楚,所以我会添加一个例
我是一名优秀的程序员,十分优秀!