在 Visual Studio 调试模式编译的可执行文件: jmp 到函数体而不是调用中的直接地址

Posted

技术标签:

【中文标题】在 Visual Studio 调试模式编译的可执行文件: jmp 到函数体而不是调用中的直接地址【英文标题】:In Visual Studio debugmode compiled executable: jmp to function body instead of direct address in call 【发布时间】:2012-06-02 01:42:54 【问题描述】:

想象一下这个虚假程序:

void foo ( void )

    // anything


int main ()

    foo ();
    return 0;

当使用 Visual Studio 在调试模式下编译时,编译器会构建某种“函数映射”或以任何方式调用它。

因此,例如,当您在调试器中跟随 foo (),或者只是尝试通过 &foo 检索函数的偏移量时,您会发现自己处于 jmp 的“列表”中,当您再次跟随它们时,它将引导您到实际的函数体。

我的问题是: 是否有可能为单个选择的函数禁用此功能,以便 &foo 将地址返回到函数体,而不是 jmp.当然不用禁用调试模式。

如果不是,哪个标志为整个程序启用/禁用此功能?

提前致谢!

为用户 SigTerm 编辑:

【问题讨论】:

“你找到了自己” 据我所知,这不会发生,也没有“跳跃列表”。除非你能用一些严肃的例子来支持你的观点,否则我不得不说你可能误解了一些非常基本的东西。 现在添加了一张图片......我很抱歉假设成功回答我问题的人应该知道我在说什么......毕竟我不知道正确的术语,这就是为什么我在这里而不是在谷歌上...... 这是不可能的。当涉及到动态加载模块时,这对加载器来说工作量太大,每次调用动态加载模块中的函数都需要修补。相反,在导入地址表中简单地修补一条 jmp 指令会很方便。对于不能保证在任何特定地址加载的可执行文件也是如此。 @Superman:这不是 dll,这是一个程序。 @Andy:“我正在通过可执行文件本身中的函数进行调试以将它们复制出来”非常糟糕的主意。即使是汇编程序也有编码风格,通过复制机器(没有大脑)生成的代码,你会学到更少。 【参考方案1】:

关闭“增量链接”

你的问题很像这个 Address of function is not actual code address

【讨论】:

感谢增量链接正是我所希望的答案!

以上是关于在 Visual Studio 调试模式编译的可执行文件: jmp 到函数体而不是调用中的直接地址的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 新项目向导制造的 MFC Dialog 程序在调试模式下无法编译?

在 Visual Studio 2017 上无法使用调试模式 x64 进行 opencv3.2 编译

调试模式在 Visual Studio 2015 中不起作用

Visual Studio 2013 发布编译不打开文件

visual studio 怎么使用pdb进行调试

visual studio 怎么编译