首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc编译结构与tcc结构的兼容性

gcc编译结构与tcc结构的兼容性
EN

Stack Overflow用户
提问于 2014-10-23 19:58:48
回答 2查看 1K关注 0票数 3

我正在尝试从C++运行libtcc来使用C作为运行时脚本语言。运行时编译的代码必须能够从外部代码运行函数。这在传递ints时运行良好,但是当将一个结构从tcc代码传递给gcc代码时,会发生一些奇怪的事情。

最小运行示例:

代码语言:javascript
复制
#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();
}

与以下人一起奔跑:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-23 22:49:31

问题的核心似乎是C和C++将整个"struct测试“理解为一个参数的方式。在TCC中,它被处理/假定为指针。在C++中,似乎必须更清楚地说明它是一个指针。

代码语言:javascript
复制
#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();
}

产出如下:

代码语言:javascript
复制
got 5
票数 4
EN

Stack Overflow用户

发布于 2015-10-07 17:30:47

在官方git存储库的tcc (libtcc)的新版本中,它按预期工作(打印“get0”)。在gcc 4.9.3和tcc 0.9.26 (提交00ba4b)上测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26536367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档