首页 > 解决方案 > 架构和 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模块看起来可能很有用(以及解析器)。

标签: c++reflectionarchitecturecompilationabi

解决方案


推荐阅读