gpt4 book ai didi

c++ - 已编译的 gcc 和 tcc 结构的兼容性

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:47 26 4
gpt4 key购买 nike

我正在尝试从 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 而不是 int 放入结构时,它起作用了。输出任何其他数据类型和随机内容。

一开始我以为是因为对齐什么的,但在结构中只使用单个变量时也会发生这种情况。

我正在使用 Linux 3.16 x86_64 和 tcc 0.9.26

最佳答案

问题似乎集中在 C 和 C++ 将整个“struct Vec test”理解为参数的方式上。在 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

关于c++ - 已编译的 gcc 和 tcc 结构的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26536367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com