C++ 在VisualStudioDebugMode中编译的可执行文件:调用中的jmp到函数体而不是直接地址
想象一下这个虚假的程序:C++ 在VisualStudioDebugMode中编译的可执行文件:调用中的jmp到函数体而不是直接地址,c++,visual-studio,assembly,C++,Visual Studio,Assembly,想象一下这个虚假的程序: void foo ( void ) { // anything } int main () { foo (); return 0; } 当使用VisualStudio在调试模式下编译时,编译器会构建某种“函数映射”,或者以调用方式进行编译 因此,例如,当您在调试器中遵循foo()时,或者只是尝试通过&foo检索函数的偏移量时,您会发现自己处于一个jmp的“列表”中,当您再次遵循它们时,它将引导您到实际的函数体 我的问题是: 是否有可能对sin
void foo ( void )
{
// anything
}
int main ()
{
foo ();
return 0;
}
当使用VisualStudio在调试模式下编译时,编译器会构建某种“函数映射”,或者以调用方式进行编译
因此,例如,当您在调试器中遵循foo()时,或者只是尝试通过&foo检索函数的偏移量时,您会发现自己处于一个jmp的“列表”中,当您再次遵循它们时,它将引导您到实际的函数体
我的问题是:
是否有可能对single choosen函数禁用此选项,以便&foo将地址返回到函数体,而不是jmp。当然不用禁用调试模式
如果不是,哪个标志为整个程序启用/禁用此功能
提前谢谢
为用户SigTerm编辑:
关闭“增量链接”
你的问题很像这个
“你发现你自己”据我所知,这不会发生,也没有“跳跃列表”。除非你能用一些严肃的例子来支持你的观点,否则我不得不说你可能误解了一些非常基本的东西。。。我很抱歉假设一个能成功回答我问题的人应该知道我在说什么。。。毕竟我不知道正确的术语,这就是为什么我在这里而不是在谷歌上…这是不可能的。当涉及到可动态加载的模块时,对于加载程序来说,这将是太多的工作,其中对动态加载模块中的函数的每个调用都需要修补。相反,只需在导入地址表中修补单个jmp指令就很方便了。对于不保证在任何特定地址加载的可执行文件也是如此。@Superman:这不是dll,那是程序。@Andy:“我正在调试可执行文件中的函数以将其复制出来”这是个坏主意。即使是汇编程序也有编码风格,通过复制机器(并没有大脑)生成的代码,你们将学到更少的东西。多亏了增量链接,这正是我所希望的答案!