可执行文件中的函数地址(由 objdump 检查)与 printf 打印的同一函数的地址不匹配。幕后发生了什么?

2023-12-30

我使用的是 Ubuntu (22.04.3) x86_64 系统。

我知道虚拟内存和页面一般是如何工作的,我也知道系统可以使用 ASLR。 不过我想知道在这个特定场景下 Ubuntu 系统到底会发生什么。 我在名为 test.c 的文件中有这个小程序:

#include <stdio.h>

int main(){

    int a = 10;
    a++;
    printf("%p\n",(void*)&main);
}

我用“gcc test.c -o test”编译了这个文件。然后我运行命令“objdump -d test”,我得到了这个:


0000000000001149 <main>:
    1149:   f3 0f 1e fa             endbr64 
    114d:   55                      push   %rbp
    114e:   48 89 e5                mov    %rsp,%rbp
    1151:   48 83 ec 10             sub    $0x10,%rsp
    1155:   c7 45 fc 0a 00 00 00    movl   $0xa,-0x4(%rbp)
    115c:   83 45 fc 01             addl   $0x1,-0x4(%rbp)
    1160:   48 8d 05 e2 ff ff ff    lea    -0x1e(%rip),%rax        # 1149 <main>
    1167:   48 89 c6                mov    %rax,%rsi
    116a:   48 8d 05 93 0e 00 00    lea    0xe93(%rip),%rax        # 2004 <_IO_stdin_used+0x4>
    1171:   48 89 c7                mov    %rax,%rdi
    1174:   b8 00 00 00 00          mov    $0x0,%eax
    1179:   e8 d2 fe ff ff          call   1050 <printf@plt>
    117e:   b8 00 00 00 00          mov    $0x0,%eax
    1183:   c9                      leave  
    1184:   c3                      ret 

正如你所看到的,主地址是0x1149。 当我运行程序时,main的地址是不同的,并且每次运行它时都是不同的。我已经做了三次,得到了三种不同的结果:

0x55b032770149
0x5615f1082149
0x557829668149

我可以推断这与 ASLR 有关。这是我的问题:

  1. 我们如何从 0x1149 到例如 0x55b032770149 ?幕后发生的整个过程是什么?

  2. C 程序中打印的地址(如 0x55b032770149)是我们程序的实际且确定的虚拟地址吗?

  3. RIP 寄存器是否包含虚拟地址(例如 0x55b032770149)作为下一条要执行的指令的地址?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可执行文件中的函数地址(由 objdump 检查)与 printf 打印的同一函数的地址不匹配。幕后发生了什么? 的相关文章

随机推荐

  • 在 VB 2010 中的数据表中插入新列时,如何更新 SQL Server 2008 数据库?

    使用 VB 2010 和 SQL Server 2008 我能够在数据表中插入新行 删除行和更新数据 并使用数据适配器更新数据库 不会出现任何问题 当我尝试添加新列时 该列出现在数据表中 但不会更新到数据库 我目前正在使用 DataAdap
  • 如何向表格行添加边距 [重复]

    这个问题在这里已经有答案了 我有一个包含许多行的表 其中一些行是class highlight 并表示需要采用不同样式并突出显示的行 我想要做的是在这些行之前和之后添加一些额外的间距 以便它们看起来与其他行稍微分开 我以为我可以完成这件事m
  • 将手势识别器应用到导航栏时遇到问题

    在我的 iPad 应用程序中 我的屏幕上有多个视图 我想要做的是将双击手势识别器应用到导航栏 但我没有成功 但是当相同的手势识别器应用于该视图时它就可以工作了 这是我正在使用的代码 Create gesture recognizer not
  • 如何在 Maven 2 中的两个测试套件之间切换?

    我们正在使用maven surefire 插件 http maven apache org plugins maven surefire plugin 运行我们的 Java 测试 测试分为两类 快速测试 测试缓慢 整个 快速 套件只需几秒钟
  • 理解和使用复制赋值构造函数

    我试图了解复制赋值构造函数在 C 中的工作原理 我只使用过java 所以我真的对此一无所知 我读过并发现返回参考文献是一个很好的做法 但我不知道应该如何做到这一点 我写了这个小程序来测试这个概念 主要 cpp include
  • 计算文件中的空白行数

    In 计算 bash 中的 非空白 代码行数 https stackoverflow com questions 114814 count non blank lines of code in bash他们解释了如何计算非空行的数量 但是有
  • 调用线程必须是STA

    我正在尝试模拟射弹 并尝试仅在定时事件中创建标签一次 因为它的参数中有一个我需要在定时事件中的对象 但是当我运行它时出现这个线程错误 请帮助 我的代码是 void onTimedEvent Object source ElapsedEven
  • 无法连接到服务器: dial tcp [::1]:8080: connectex: 由于目标机器主动拒绝而无法建立连接

    我正在研究 Azure Kubernetes 我们可以在 Azure 中存储 Docker 映像 我正在尝试检查我的 kubectl 版本 然后我得到 无法连接到服务器 拨打 tcp 1 8080 connectex 否 由于目标机器主动拒
  • 有人有 ERD 符号快速参考吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一页快速参考或备忘单 最好是 PDF 格式 以了解 Crowsfoot Martin 表示法
  • isset() 和 array_key_exists() 有什么区别? [复制]

    这个问题在这里已经有答案了 以下两个函数调用如何比较 isset a key array key exists key a array key exists https www php net manual function array k
  • 如何在 WPF 中使用 XAML 设置 ComboBox 标头

    过去几天我一直试图为我的组合框创建标题 但我似乎找不到方法 到目前为止我发现的所有内容都无法在我的模型中实现 我不得不说我对数据绑定的了解很薄弱 我一直在认真阅读它 我创建了一个组合框并用来自不同数据库的数据填充它 然后 我使用转换器连接相
  • PHP - 将变量传递给类

    我正在尝试学习 OOP 并且我已经完成了这门课 class boo function boo another class some normal variable some normal variable another class gt
  • 将图像对齐到段落 css 的右侧

    我想将图像与段落的右侧对齐 并且我希望能够这样做 而不必在段落上设置固定宽度以及远离图像的一些填充 我怎样才能做到这一点 https jsfiddle net mnakoajk https jsfiddle net mnakoajk box
  • ios9 无法加载资源

    当我在 ios9 中调用我的 api 时遇到此错误 但在 ios8 中工作正常 无法加载资源 因为应用程序传输安全策略需要使用安全连接 ios9 您需要在 plist 中添加一个标志 更多信息请访问https forums develope
  • 使用 MSBuild 进行 ClickOnce 部署 -> 如何传递应用程序版本/或自动增量的当前内部版本号

    我们有一个使用 ClickOnce 部署的 Outlook 加载项 一旦开发人员签入构建 PC 就会对构建进行排队 并将应用程序发布到共享驱动器上的某个位置 问题在于 构建不会将发布版本更改为当前程序集版本 因此它会在先前版本的文件夹中发布
  • Android Google+ 集成 - 重复 UserRecoverableAuthException

    我们已就此事联系了 Google 并且我们正在聊天 https chat stackoverflow com rooms 33772 discussion between lee and arkaaito 该问题似乎已针对设备修复excep
  • DeleteD 会自动取消选择对象吗?

    我是否总是需要调用 SelectObject 将原始对象恢复到 DC 并使我的对象可供删除 即使我无论如何都要删除 DC e g Create DC HBITMAP hBitmap CreateCompatibleBitmap hDC re
  • 安装 R3.3 的 udunits2 软件包

    我只是浪费了一整天的时间试图弄清楚如何安装 udunits2 软件包以便能够安装units 软件包以便能够安装ggforce 和ggraph 软件包 我尝试在 Ubuntu 16 04 和 R gt 3 3 上安装它 因为 ggforce
  • .NET 上 C# 的模拟工具 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 C NET 新手 但我从事 TDD 已经有一段时间了 我想知道在 C 中编写测试时可用于模拟对象
  • 可执行文件中的函数地址(由 objdump 检查)与 printf 打印的同一函数的地址不匹配。幕后发生了什么?

    我使用的是 Ubuntu 22 04 3 x86 64 系统 我知道虚拟内存和页面一般是如何工作的 我也知道系统可以使用 ASLR 不过我想知道在这个特定场景下 Ubuntu 系统到底会发生什么 我在名为 test c 的文件中有这个小程序