我正在尝试从C++运行libtcc来使用C作为运行时脚本语言。运行时编译的代码必须能够从外部代码运行函数。这在传递ints时运行良好,但是当将一个结构从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 longs而不是it放入到结构中时,它就能工作了。输出任何其他数据类型和随机内容。
起初,我认为这是因为对齐或其他原因,但在结构中只使用一个变量时也会发生这种情况。
我使用的是Linux3.16 x86_64和tcc 0.9.26
发布于 2014-10-23 22:49:31
问题的核心似乎是C和C++将整个"struct测试“理解为一个参数的方式。在TCC中,它被处理/假定为指针。在C++中,似乎必须更清楚地说明它是一个指针。
#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 = {5};\
tmp(x);\
}");
tcc_relocate(tcc, TCC_RELOCATE_AUTO);
void (*fun)(void) = (void(*)())tcc_get_symbol(tcc, "fun");
fun();
}产出如下:
got 5发布于 2015-10-07 17:30:47
在官方git存储库的tcc (libtcc)的新版本中,它按预期工作(打印“get0”)。在gcc 4.9.3和tcc 0.9.26 (提交00ba4b)上测试。
https://stackoverflow.com/questions/26536367
复制相似问题