[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Tinycc-devel] Odp: Compilation in memory tcc-0.9.27 Windows

From: piotr . jaholkowski
Subject: [Tinycc-devel] Odp: Compilation in memory tcc-0.9.27 Windows
Date: Wed, 02 Jan 2019 12:46:15 +0100
User-agent: GWP-Draft

Ok apparently I messed something while building shared library. It works

Dnia 1 stycznia 2019 16:05 address@hidden <address@hidden> napisał(a):


I recently downloaded version tcc-0.9.27.tar.bz2 and built it with Visual Studio compiler.

I tried to write code with compiles and run from memory just like in libtcc_test.c example from tcc-0.9.27-win32-bin.zip (I could not find this example in tcc-0.9.27.tar.bz2 package)

There are few things wrong with version I don't know if previous versions work I did not try them.

1. DLL built from tcc-0.9.27.tar.bz2 does not export tcc_relocate function but dll in tcc-0.9.27-win32-bin.zip has it. Why ?
2. tcc_get_symbol does not work properly in DLL from tcc-0.9.27.tar.bz2 or tcc-0.9.27-win32-bin.zip. Instead of returning address of function in memory it returns byte offset from .text section to that function. In case of failure this function returns 0 but in case of symbol being at the begin of bytecode it will also return 0.
3. I'm not sure if compilation in memory ever worked in Windows newer than XP. Even in case where tcc_get_symbol would return proper address it's not gonna work because of DEP protection. Can somebody confirm that it works on Windows ?
My test program:

#include <libtcc/libtcc.h>

typedef int(*func)();

void compileTest()
HMODULE libtccHandle = GetModuleHandleA("libtcc");
void* p_tcc_relocate = GetProcAddress(libtccHandle, "tcc_relocate");

TCCState *s;

func z;

s = tcc_new();

tcc_set_output_type(s, TCC_OUTPUT_MEMORY);

const char* program =
"int test(int a){\n"
"return 5;\n"
"int test1(int a){\n"
"return 2;"
"int main() {\n"
"return test(5)\n;"

int status = tcc_compile_string(s, program);

//tcc_relocate(s, TCC_RELOCATE_AUTO);

z = (func)tcc_get_symbol(s, "main");
void* pT = tcc_get_symbol(s, "test");
void* pT1 = tcc_get_symbol(s, "test1");

/* run the code */
int r = z();

Tinycc-devel mailing list

reply via email to

[Prev in Thread] Current Thread [Next in Thread]