我正在尝试从 C++ 运行 libtcc 以使用 C 作为运行时脚本语言。运行时编译的代码必须能够从外部代码运行函数。这在传递整数时工作正常,但是当将结构从 tcc 代码传递到 gcc 代码时,会发生奇怪的事情。
最小运行示例:
#include <libtcc.h>
#include <stdio.h>
struct Vec {
int x;
};
void tmp(struct Vec test) {
printf("got %x\n",test.x);
}
int main() {
TCCState* tcc; tcc = tcc_new();
tcc_set_output_type(tcc, TCC_OUTPUT_MEMORY);
tcc_add_symbol(tcc, "tmp", (void*)&tmp);
tcc_compile_string(tcc, "\
struct Vec {int x;};\
void tmp(struct Vec test);\
void fun() {\
struct Vec x = {0};\
tmp(x);\
}");
tcc_relocate(tcc, TCC_RELOCATE_AUTO);
void (*fun)(void) = (void(*)())tcc_get_symbol(tcc, "fun");
fun();
}
运行:
gcc -ltcc -ldl test.c && ./a.out
> got 23b472b0
tcc -ltcc -ldl test.c && ./a.out
> got 0
为什么 gcc 编译后的版本不打印预期的 0?当我只将long long
s 而不是 int 放入结构时,它可以工作。输出任何其他数据类型和随机内容。
起初我认为这是因为对齐或其他原因,但在结构中仅使用单个变量时也会发生这种情况。
我正在使用 Linux 3.16 x86_64 和 tcc 0.9.26