Go to file
Luigi Rizzo 55cb2170cd solve tccelf problem on FreeBSD
On Sun, Nov 22, 2009 at 05:43:14PM +0100, Luigi Rizzo wrote:
> Hi,
> there is a well known problem with tcc and FreeBSD in the generation
> of elf objects -- see
> http://lists.gnu.org/archive/html/tinycc-devel/2005-07/msg00070.html
>
> Apparently Sergey Lyubka has tried a partial fix to the problem.
> I was wondering if Sergey or someone can post some more detail on
> what needs to be done so we can try to help fixing this issue

I think i have managed to solve the problem and produce
almost valid elf files on FreeBSD. The two patches attached
address a few problems (trying to explain to the
best of my knowledge; i am not very familiar with ELF and
the FreeBSD ELF conventions):

1. ELF file format
  tcc produces an ELF executable which is good for linux but
  not for FreeBSD. It misses the PHDR section which is almost
  mandatory for shared executables, puts in the .dynsym section
  some relocation info that FreeBSD expects to be in .got,
  and expect the relocation sections to be contiguous.

  patch-tccelf.c tries to address the above problem using
  conditional sections (so hopefully can be imported upstream)
  and also adds the ability to override the name of the dynamic
  loader through an environment variable (this is important to
  debug tcc).

2. predefined macros

  patch-libtcc.c adds/fixes some predefined macros when compiling
  on FreeBSD: these are __FreeBSD__ and the usual set of
  __i386__ and __unix__ variants.
  It also sets __INTEL_COMPILER so we can grab the __aligned
  macro from cdefs.h , otherwise many programs would fail

The resulting elf file is still not 100% correct -- if you strip it,
the program will not run (presumably there is some dangling reference).
Other than that, program do seem to run correctly.

It would be nice to integrate these patches in the main repository.
The FreeBSD specific code is in #ifdef so it should not harm
linux users
	cheers
	luigi
2009-12-01 17:59:28 +01:00
examples fix makefiles etc for subdirs 2009-04-18 15:08:03 +02:00
include win64: use new headers from mingw 2009-07-18 22:06:37 +02:00
lib x86-64: chkstk, alloca 2009-07-18 22:06:54 +02:00
tests x86-64: change the type of size_t and ptrdiff_t. 2009-08-24 13:30:03 +02:00
win32 win32: remove #define alloca from mingw headers 2009-12-01 17:58:39 +01:00
.cvsignore update 2005-04-15 00:11:02 +00:00
arm-gen.c x86-64: Fix stab debug information. 2009-08-24 13:30:03 +02:00
c67-gen.c x86-64: Fix stab debug information. 2009-08-24 13:30:03 +02:00
Changelog ulibc: #define TCC_UCLIBC and load elf_interp 2009-05-16 22:29:40 +02:00
coff.h C67 COFF executable format support (TK) 2004-10-05 22:33:55 +00:00
configure configure: support DESTDIR for RPM packagers etc. 2009-07-18 21:54:43 +02:00
COPYING changed license to LGPL 2003-05-24 14:18:56 +00:00
elf.h added 16-bit x86 assembly support 2009-11-13 18:08:58 +01:00
i386-asm.c asm 32/64: replace (long)sym->next by sym->jnext 2009-11-21 23:43:30 +01:00
i386-asm.h fix 32bit asm 2009-11-14 20:05:22 +01:00
i386-gen.c win32: handle __declspec(dllimport) 2009-11-13 18:04:56 +01:00
i386-tok.h fixed and added missing file for x86_64 assembly 2009-11-13 18:09:01 +01:00
il-gen.c cleanup: constify some global data 2009-07-18 22:07:42 +02:00
il-opcodes.h added CIL target 2002-02-10 16:14:03 +00:00
libtcc.c solve tccelf problem on FreeBSD 2009-12-01 17:59:28 +01:00
libtcc.h libtcc: add support to be build as DLL 2009-04-18 15:08:03 +02:00
Makefile ARM: first support for arm-pe target 2009-11-13 18:09:00 +01:00
README win32: readme.txt->tcc-win32.txt, update tcc-doc 2009-04-18 15:08:03 +02:00
stab.def added 2002-12-08 14:36:36 +00:00
stab.h added 2002-12-08 14:36:36 +00:00
tcc-doc.texi win32: readme.txt->tcc-win32.txt, update tcc-doc 2009-04-18 15:08:03 +02:00
tcc.c ARM: first support for arm-pe target 2009-11-13 18:09:00 +01:00
tcc.h various fixes and new options for PE format 2009-11-13 18:09:00 +01:00
tccasm.c first support of x86_64 assembly 2009-11-13 18:08:59 +01:00
tcccoff.c fix unused/uninitalized warnings 2009-05-11 18:46:39 +02:00
tccelf.c solve tccelf problem on FreeBSD 2009-12-01 17:59:28 +01:00
tccgen.c fix sizeof(array + integer) 2009-11-13 18:05:15 +01:00
tccpe.c tccpe: fclose FILE* 2009-11-30 17:14:37 +01:00
tccpp.c tccpp: fix quirk with cached headers and #else 2009-08-24 13:30:01 +02:00
tcctok.h fixed and added missing file for x86_64 assembly 2009-11-13 18:09:01 +01:00
texi2pod.pl automatic man page generation from tcc-doc.texi 2003-05-18 18:11:06 +00:00
TODO Udated and cleaned up TODO. 2008-01-16 22:33:56 +00:00
VERSION update Changelog, bump version: 0.9.25 2009-05-11 19:01:26 +02:00
x86_64-asm.c asm 32/64: replace (long)sym->next by sym->jnext 2009-11-21 23:43:30 +01:00
x86_64-asm.h x86_64: fix asm 2009-11-14 21:48:37 +01:00
x86_64-gen.c x86-64: Fix stab debug information. 2009-08-24 13:30:03 +02:00
x86_64-tok.h x86_64: fix asm 2009-11-14 21:48:37 +01:00

Tiny C Compiler - C Scripting Everywhere - The Smallest ANSI C compiler
-----------------------------------------------------------------------

Features:
--------

- SMALL! You can compile and execute C code everywhere, for example on
  rescue disks.

- FAST! tcc generates optimized x86 code. No byte code
  overhead. Compile, assemble and link about 7 times faster than 'gcc
  -O0'.

- UNLIMITED! Any C dynamic library can be used directly. TCC is
  heading torward full ISOC99 compliance. TCC can of course compile
  itself.

- SAFE! tcc includes an optional memory and bound checker. Bound
  checked code can be mixed freely with standard code.

- Compile and execute C source directly. No linking or assembly
  necessary. Full C preprocessor included. 

- C script supported : just add '#!/usr/local/bin/tcc -run' at the first
  line of your C source, and execute it directly from the command
  line.

Documentation:
-------------

1) Installation on a i386 Linux host (for Windows read tcc-win32.txt)

   ./configure
   make
   make test
   make install

By default, tcc is installed in /usr/local/bin.
./configure --help  shows configuration options.


2) Introduction

We assume here that you know ANSI C. Look at the example ex1.c to know
what the programs look like.

The include file <tcclib.h> can be used if you want a small basic libc
include support (especially useful for floppy disks). Of course, you
can also use standard headers, although they are slower to compile.

You can begin your C script with '#!/usr/local/bin/tcc -run' on the first
line and set its execute bits (chmod a+x your_script). Then, you can
launch the C code as a shell or perl script :-) The command line
arguments are put in 'argc' and 'argv' of the main functions, as in
ANSI C.

3) Examples

ex1.c: simplest example (hello world). Can also be launched directly
as a script: './ex1.c'.

ex2.c: more complicated example: find a number with the four
operations given a list of numbers (benchmark).

ex3.c: compute fibonacci numbers (benchmark).

ex4.c: more complicated: X11 program. Very complicated test in fact
because standard headers are being used !

ex5.c: 'hello world' with standard glibc headers.

tcc.c: TCC can of course compile itself. Used to check the code
generator.

tcctest.c: auto test for TCC which tests many subtle possible bugs. Used
when doing 'make test'.

4) Full Documentation

Please read tcc-doc.html to have all the features of TCC.

Additional information is available for the Windows port in tcc-win32.txt.

License:
-------

TCC is distributed under the GNU Lesser General Public License (see
COPYING file).

Fabrice Bellard.