c++ - 架构和 ABI 兼容性
问题描述
我有一个想法将 C++ 编译为二进制文件,将二进制文件存储在堆上并执行它。我正在考虑一种编译到特定架构(如 Google Native Client)的实现,然后知道我编译到的架构,在我的程序中使用相同或不同的编译器 - 在运行时 - 编译“片段”或“脚本”并将机器代码输出到堆上分配的内存。然后将函数指针指向正确的位置并运行它。我的问题是,独立于编译器,如果 C++ 编译为相同的架构,生成的二进制文件是否会具有相同的 ABI 并因此具有任何类型的可调用函数(调用约定)/入口点?一些灵感来自这样的项目,但我想在某种程度上独立于平台(我的意思是我可以编译到架构并且我知道我在什么架构上)这样做,编译器独立的方式在运行时工作。
我想到的一个可能的实现只是关注 LLVM IR 代码,换句话说,只需获取 IR 代码,将其组装(到正确的指令集/架构),然后将二进制文件写入堆,并带有入口点由函数指针指向,例如(伪代码):
typedef unsigned short( * )( int ) ENTRY_POINT_T;
ENTRY_POINT_T Inject( Binary code )
{
void* block = malloc( sizeof( code ) );
*( ( Binary* ) block ) = code;
ENTRY_POINT_T entryPoint = ( ENTRY_POINT_T* ) block;
return entryPoint;
}
#ifdef x86
#define ARC "x86"
#endif
#ifdef PowerPC
#defnie ARC "PowerPC"
#endif
int main()
{
Binary executableCode = llvm.assemble( irCodeString, "-" + ARC );
auto entry = Inject( executableCode );
int result = entry( 0 );
std::cout << result << "\n";
return 0;
}
作为旁注,llvm 中的compiler-rt模块看起来可能很有用(以及解析器)。
解决方案
推荐阅读
- unix - 在 Unix 中将几个单行文本文件组合成一个单行文本文件
- php - 如何在cakephp 4中为没有主键但只有外键的表进行蛋糕烘焙
- c# - 扩展方法:“访问非静态成员需要对象引用”在 Travis CI 中运行时引发错误
- python - 无法从 python 中的 json 数组获取嵌套对象
- python - 在游戏循环中发出异步请求(Python/Pygame)
- javascript - JavaScript 仅从数组中提取值
- javascript - 我需要帮助才能在 JavaScript 中获取 URL
- swift - 过滤 ForEach 时 SwiftUI 导航链接不起作用
- java - 将字符串“5m 12s 635ms”转换为“05:12:635”
- android - Sqflite rawQuery 在真正的三星设备上不起作用