On Sun, 16 Oct 2016, Christian Jullien wrote:

Ok Michael,
It is defined in sys/cdefs.h as:

#if __GNUC_PREREQ__(2, 7) || defined(__INTEL_COMPILER)
#define __dead2         __attribute__((__noreturn__))
#define __pure2         __attribute__((__const__))
#define __unused        __attribute__((__unused__))
#define __used          __attribute__((__used__))
#define __packed        __attribute__((__packed__))
#define __aligned(x)    __attribute__((__aligned__(x)))
#define __section(x)    __attribute__((__section__(x)))

Yeah, we gathered this meanwhile from grischkas research. A bug in FreeBSDs header (the bug being that there's no fallback definition of the macros that are nevertheless used unconditionally in standard headers).

Now, I do agree that we'd want to add a work around for this in tcc. I think a better work-around than defining __GNUC__ is to define the above macros instead. __GNUC__ simply has quite some side-effects. (E.g. after the patch you can't compile programs on some versions of glibc anymore because it then uses facilities of GNU C that tcc simply doesn't implement).

-    tcc_define_symbol(s, "__GNUC_MINOR__", "1");
+    tcc_define_symbol(s, "__GNUC_MINOR__", "7");

And it helps a little bit, now I get the same result as if I define
__aligned(x) __attribute__((__aligned__(x))) i.e. code compiles (with
__aligned defined) but std C library is not found.

------------ test3 ------------
../tcc -B.. -I../include -I.. -I.. -DTCC_TARGET_I386 -DONE_SOURCE -run
../tcc.c -B.. -I../include -I.. -I.. -DTCC_TARGET_I386 -DONE_SOURCE -run
../tcc.c -B.. -I../include -I.. -I.. -DTCC_TARGET_I386 -DONE_SOURCE -run
../tcc.c -B.. -I../include -I.. -I.. -run tcctest.c > test.out3
tcc: error: undefined symbol 'memcpy'

Yes, I wrote a paragraph about this in my initial answer of how you should start trying to corner this problem.


Tinycc-devel mailing list

Reply via email to