我正在使用C ++(而不是我的主要lang)制作PE加载器,我有以下类:
//Main builder of PE file format
class PEC
{
HMODULE mapTo(char* fullpath);
}
//Build the imports
class ImportBuilder
{
//This func needs PEC::MapTo
bool buildImports(HMODULE module)
}
//Find the exports
class ExportFinder
{
//This func needs PEC::MapTo
void* findExport(int ordinal, HMODULE module);
}
问题是PEC类需要ImportBuilder类来重建导入,而且ImportBuilder类还需要PEC类来加载当前进程内未建立的模块导入。对于ExportBuilder也是如此,他需要PEC :: MapTo函数来加载一些未建立的转发导出模块。
这引出了一个循环依赖...任何解决这个问题的方法?。
感谢。
答案 0 :(得分:0)
问题基本上是间接递归之一。
您加载了一个文件。然后你尝试解决它的导入。
为此,您(递归地)加载更多文件,并尝试解析其导入。
当你达到两点之一时就完成了:
导致后者的两个显而易见的可能性是你找不到一个应该包含你需要解决的符号的文件,或者你找到了该文件,但它没有导出它应该解决的符号
这实际上只会更改您打印出来的错误消息 - “无法找到foo.dll”与“foo.dll不导出所需的符号栏()”。
重读,也许你只是在谈论如何解决代码中的循环依赖。通常,您可以通过将代码重新排列为以下订单来执行此操作:
class PEC;
class ImportBuilder {
// function declarations, but not definitions here
// functions can use references or pointers to a PEC, but not
// actual PEC objects.
};
class PEC {
// function declarations, but not definitions here
};
// Definitions of member functions for PEC and ImportBuilder here