Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 要执行的对象文件的动态加载_C++_Visual C++_Dynamic_Linker_Loader - Fatal编程技术网

C++ 要执行的对象文件的动态加载

C++ 要执行的对象文件的动态加载,c++,visual-c++,dynamic,linker,loader,C++,Visual C++,Dynamic,Linker,Loader,我想知道加载对象文件(由msvc编译器从单个源文件生成)的步骤是什么,将其加载到已经运行的程序的内存中(例如在缓冲区中),然后运行其中的代码 用例是,我有一个大程序,它需要一分钟的时间来加载,并希望从源代码进行实时修改。就像加载对象文件一样,修复此对象文件中的一些地址,使用-hotpatch函数在我已经运行的进程中拦截调用,并重定向到我的对象文件 在我看来,我应该解析目标文件的导入表,以指向我已经加载的程序,并截取已修改的函数的调用 我错过什么了吗?在尝试之前,我想问一下,不要在一些可能不可能的

我想知道加载对象文件(由msvc编译器从单个源文件生成)的步骤是什么,将其加载到已经运行的程序的内存中(例如在缓冲区中),然后运行其中的代码

用例是,我有一个大程序,它需要一分钟的时间来加载,并希望从源代码进行实时修改。就像加载对象文件一样,修复此对象文件中的一些地址,使用-hotpatch函数在我已经运行的进程中拦截调用,并重定向到我的对象文件

在我看来,我应该解析目标文件的导入表,以指向我已经加载的程序,并截取已修改的函数的调用

我错过什么了吗?在尝试之前,我想问一下,不要在一些可能不可能的事情上浪费时间


谢谢

回答直接问题(关于加载和执行obj文件):这实质上相当于重新编写链接器。这几乎是不可能的


至于(我能理解的)您的预期用途:动态加载和执行obj文件不会让您更接近于在已经运行的进程中拦截调用。你想要的可能是钩住。有很多(不,说真的,很多)方法可以做到这一点。这或多或少是实现这一点的官方方式,这里有一些来自奇特方面的方式。

要回答直接的问题(关于加载和执行obj文件):这实质上相当于重新编写链接器。这几乎是不可能的


至于(我能理解的)您的预期用途:动态加载和执行obj文件不会让您更接近于在已经运行的进程中拦截调用。你想要的可能是钩住。有很多(不,说真的,很多)方法可以做到这一点。这或多或少是实现这一点的官方方式,这里有一些来自奇特方面的方式。

我的理解是,对象文件是一种中间表示,不一定是可执行的。对象文件中可能有未解析的符号,这些符号由链接器解析。您是否将对象文件与静态库或动态库混淆?听起来您需要使用动态库。操作系统可以根据需要或在启动时将其加载到程序中。这些库可以包含可执行代码,它们通常没有未解析的外部引用。事实上,我想将这些引用解析为程序中已加载的地址。我不想重新链接整个可执行文件。我不想使用LoadLibrary函数。当然应该是可能的,快速搜索显示了Windows dll的示例。是的,但我想加载一个.obj文件而不是.dll。所以可能有一些我不知道的区别?我的理解是,对象文件是一种中间表示,不一定是可执行的。对象文件中可能有未解析的符号,这些符号由链接器解析。您是否将对象文件与静态库或动态库混淆?听起来您需要使用动态库。操作系统可以根据需要或在启动时将其加载到程序中。这些库可以包含可执行代码,它们通常没有未解析的外部引用。事实上,我想将这些引用解析为程序中已加载的地址。我不想重新链接整个可执行文件。我不想使用LoadLibrary函数。当然应该是可能的,快速搜索显示了Windows dll的示例。是的,但我想加载一个.obj文件而不是.dll。因此,可能有一些我不知道的差异?对于钩子来说,它似乎非常简单,从未尝试过,但它似乎只是在旧函数中为新函数编写了一个jmp。我有一个名为InterceptAPI的代码,它似乎可以做到这一点。但是,我也从未测试过它,所以我希望它能工作:只有当您不打算从修补程序(或其他地方)调用原始函数时,DIt才那么容易。如果你这么做了,你可能应该多读一点关于这个主题的内容。我见过一些叫做蹦床的技术,但我不打算使用这些技术,因为我想用更新的代码替换旧函数。对于钩子来说,它似乎很简单,从未尝试过,但它似乎只是在旧函数中为新函数编写一个jmp。我有一个名为InterceptAPI的代码,它似乎可以做到这一点。但是,我也从未测试过它,所以我希望它能工作:只有当您不打算从修补程序(或其他地方)调用原始函数时,DIt才那么容易。如果你这样做了,你可能应该多读一点关于这个主题的内容。我见过一些叫做蹦床的技术,但我不打算使用它们,因为我只想用更新的代码替换旧函数。