C를 런타임 스크립팅 언어로 사용하려면 libtcc를 C에서 실행하려고합니다. 런타임 컴파일 된 코드는 외부 코드의 기능을 실행할 수 있어야합니다. 이것은 int를 전달할 때 잘 동작하지만, tcc 코드의 구조체를 gcc 코드로 전달할 때 이상한 일이 발생합니다.컴파일 된 gcc와 tcc 구조체의 호환성
최소한의 실행 예 :
이gcc -ltcc -ldl test.c && ./a.out
> got 23b472b0
tcc -ltcc -ldl test.c && ./a.out
> got 0
가 왜 GCC는 컴파일 된 버전이 예상 0 인쇄되지 않습니다
#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();
}
함께 실행? 구조체에 int 대신 long long
만을 넣으면 작동합니다. 다른 데이터 유형과 무작위 항목이 출력됩니다.
처음에는 정렬이나 무언가 때문이라고 생각했지만 구조체에서 하나의 변수 만 사용하는 경우에도 발생했습니다.
내가 리눅스 3.16 x86_64에와 TCC 0.9.26
아키텍처 및 운영 체제는 무엇입니까? Tinycc는 64 비트 x86-64 (a.k.a. amd64)보다 32 비트 x86 (a.k.a.ia32)에서 더 잘 작동합니다. –
'Arch Linux x86_64'. 그러나 "더 잘 작동"한다는 것은 무엇을 의미합니까? 이것은 64 비트 버전의 버그입니까? – phiresky
x86-64의 심각한 프로그램에서'tcc'를 사용할 수 없었습니다. tinycc는 64 비트에서 매우 버그가 있습니다. –