一尘不染

有什么方法可以在运行时使用C或C ++编译其他代码吗?

linux

这是我想做的:

  1. 运行程序并初始化一些数据结构。
  2. 然后,编译可以访问/修改现有数据结构的其他代码。
  3. 根据需要重复步骤2。

我希望能够既要做到这一点C,并C++使用gcc(并最终Java于)类Unix系统(特别是Linux和Mac OS
X)。这个想法基本上是为这些语言实现read-eval-
print循环,该循环会在输入表达式和语句时对其进行编译,并使用它们来修改现有的数据结构(该操作始终以脚本语言完成)。我正在用编写该工具python,该工具会生成C/
C++文件,但这应该无关紧要。

我已经探索过使用共享库执行此操作,但了解到修改共享库不会影响已经在运行的程序。我也尝试过使用共享内存,但是找不到将函数加载到堆上的方法。我也考虑过使用汇编代码,但尚未尝试使用。

我宁愿不要使用任何编译器,gcc除非绝对没有办法在中进行编译gcc

如果任何人有任何想法或知道如何执行此操作,将不胜感激。


阅读 216

收藏
2020-06-07

共1个答案

一尘不染

我认为您可以使用动态库并在运行时(使用dlopen和朋友)加载它们来完成此操作。

void * lib = dlopen("mynewcode.so", RTLD_LAZY);
if(lib) {
    void (*fn)(void) = dlsym(lib, "libfunc");

    if(fn) fn();
    dlclose(lib);
}

显然,您在进行过程中将不得不编译新代码,但是如果您继续替换,mynewcode.so我认为这将对您有用。

2020-06-07