Я пытаюсь запустить libtcc из C++, чтобы использовать C как язык сценариев времени исполнения. Скомпилированный код во время выполнения должен иметь возможность запускать функции из внешнего кода. Это прекрасно работает при передаче int, но при передаче структуры из tcc-кода в gcc-код происходят странные вещи.Совместимость скомпилированных gcc и tcc structs
Минимальный ход Пример:
#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 вместо ints в структуру, он работает. Выводится любой другой тип данных и случайный материал.
Сначала я думал, что это связано с выравниванием или чем-то, но это также происходит при использовании только одной переменной в структуре.
Я использую Linux 3.16 x86_64 и TCC 0.9.26
На какой архитектуре и в какой операционной системе? Tinycc работает лучше на 32 бит x86 (a.k.a. ia32), чем на 64 бит x86-64 (a.k.a. amd64). –
'Arch Linux x86_64'. Но что значит «работать лучше»? Это ошибка в 64-битной версии? – phiresky
Я никогда не мог использовать 'tcc' в серьезных программах на x86-64. Мне кажется, что tinycc очень глючит на 64 бита. –