Я пытаюсь запустить libtcc из C++, чтобы использовать 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
s вместо целых чисел, это работает. Выводятся любые другие типы данных и случайные данные.
Сначала я подумал, что это из-за выравнивания или чего-то еще, но это также происходит при использовании только одной переменной в структуре.
Я использую Linux 3.16 x86_64 и tcc 0.9.26.
struct Vec test
изменяет членTest
, это изменение не должно влиять на вызывающую программу — и быстрый эксперимент с tcc версии 0.9.25 показывает, что tcc понимает это правильно. (Я не знаю, о чем все этиTCCState
вещи.) 24.10.2014<
и>
в директивах#include
. 24.10.2014FAILED
. В моей системе с gcc 4.8.2 и 0.9.25 он печатаетPASSED
, что говорит о том, что этот ответ неверен. Чарльз, я что-то пропустил? 24.10.2014FAILED
, потому что присваиваниеparam.ok
обновило быarg.ok
. Это не так. (Кстати, C не имеет ссылок в стиле С++, если вы это имеете в виду.) 24.10.2014