背景
OpenSPIFe(https://github.com/NASA/OpenSPIFe)组件通过XmlRpc与其自带的编译后的DynamicEuropa通信调用,本人在科研过程中需要对Europa(开源)某些算法做修改,随后被OpenSPIFe调用。但经过反编译发现DynamicEuropa带有许多开源Europa没有的封装,加上本人反编译能力不足,无法复现整个封装实现,故有此项目。
项目要求:
1. 向新开源版本Europa(下简称开源版)添加代码,并编译为和OpenSPIFe(https://github.com/NASA/OpenSPIFe)中ClientSide相关包(开发时先以Win32版本为主)的DynamicEuropa(下称闭源版)功能一致。
备注:闭源版的DynamicEuropa是基于老开源版本Europa开发的,本条要求的主要意思就是将老版本的某些封装,通过反编译移植到新版本上。闭源版提供了Debug文件,因此可以恢复大部分的函数和变量名称。
2. 编写开源版Europa(完成1中修改之前)的cmake或Makefile文件,要求该版本Europa通过cmake或Makefile可以在Ubuntu 16.04 LTS下编译出x86和x64、Debug和Release版本的:可执行文件、静态库、动态库(即与VS端一致),生成单一的一个文件,而不是针对每个组件生成一个。
3. 编写添加代码之后的开源版Europa(完成1中修改之后)的cmake或Makefile文件,要求该版本Europa通过cmake或Makefile可以在Ubuntu 16.04 LTS下编译出x86和x64、Debug和Release版本的可执行文件。
功能一致要求:
1. 对于开源版中不存在的代码,保持和闭源版反编译代码一致;对于开源版中存在的代码,遵循开源版代码。
2. SPIFe对编写完之后的开源版本和对闭源版本的所有调用和返回情况一致,即无损替换。
代码要求:
1. 使用C++开发,目前测试使用C++17版本语法可正常编译Europa,C++20未测试,若可正常编译也可以使用。
2. 对于反编译中未被命名的变量,不要在编写后的版本中出现,以增强代码简洁性。
3. 类名、命名空间等和反编译代码保持一致
需要翻译的类和函数(部分函数是在翻译过程中会遇到的,没有写在这里):
(这个是我研究过程中发现的,可能不止于此)
DynamicEuropaLogger(Class)(7 func)
EuropaXmlRpc(namespace)
EUROPA::Flout(class)(5 func)
EuropaServer(class)(93 func)
EuropaServerError(class)(6 func)
EuropaServerConfig(class)(20 func)
EUROPA::ActivityServer(class)(142 func)(继承ActivityEngine)
EUROPA::ActivityServerError(class)(4 func)
EUROPA::ActivityServerFatalError(class)(2 func)
EUROPA::GroundedActivityServer(class)(21 func)(继承ActivityServer)
EUROPA::GuardedEqConstraint(class)(3 func)(继承Constraint)
EUROPA::ActPoint(class)
EUROPA::CompositeActivityEngine(class)(68 func)(继承ActivityEngine)
SimpleTimer(class)(18 func)
EUROPA::ModeHKConstraint(class)(3 func)(继承Constraint)
EUROPA::DualEngine(class)(10 func)(继承CompositeActivityEngine)
EUROPA::FlexibleTimeActivityServer(class)(11 func)(继承ActivityServer)
EUROPA::FixedTimeActivityServer(class)(14 func)(继承ActivityServer)
EUROPA::GroundedEngine(class)(6 func)(继承CompositeActivityEngine)
可提供的源码
1. 新开源版本Europa的源码(此处提供的源码是对github中的部分内部源码作了修改,以提供的为准)
2. 老开源版本Europa源码
3. OpenSPIFe源码
4. 反编译了一部分的闭源源码(不保证正确性,建议仅供参考)
5. IDA反编译的闭源源码
6. 找到的一个合适的XmlRpc(C++)源码