2001/bellard updates
README.md format fixes. Update bugs.md with a note that the author used gcc 2.95.2 with a link to the download of that version at the GNU gcc website. This was also added to the top of the README.md file.
This commit is contained in:
1 parent
6fac09e989
commit
9a516dbcbe
2 files changed
+92
-78
No files matched your search
+87
-78
@@ -1,11 +1,10 @@
|
|||||||
# Best abuse of the rules
|
# Best abuse of the rules
|
||||||
|
|
||||||
Fabrice Bellard
|
Fabrice Bellard
|
||||||
451 chemin du mas de Matour
|
451 chemin du mas de Matour
|
||||||
34790 GRABELS
|
34790 Grabels
|
||||||
France
|
France
|
||||||
|
https://bellard.org
|
||||||
http://bellard.org
|
|
||||||
|
|
||||||
## To build:
|
## To build:
|
||||||
|
|
||||||
@@ -27,7 +26,11 @@ format so that will also make it harder to work. As it is it segfaults. He fixed
|
|||||||
an earlier segfault so that at least the file can be opened and he also changed
|
an earlier segfault so that at least the file can be opened and he also changed
|
||||||
some of the macro uses to what they expanded to but mostly he kept it the same.
|
some of the macro uses to what they expanded to but mostly he kept it the same.
|
||||||
He also fixed `bellard.otccex.c` so it does not segfault and seemingly works
|
He also fixed `bellard.otccex.c` so it does not segfault and seemingly works
|
||||||
okay. Thank you Cody for your assistance!
|
okay (it did not work at all). The author stated that they used [gcc
|
||||||
|
2.95.2](https://ftp.gnu.org/gnu/gcc/gcc-2.95.2/gcc-everything-2.95.2.tar.gz) but
|
||||||
|
we don't know if that's relevant or not. Thank you Cody for your assistance! Can
|
||||||
|
you fix the entry? We welcome your help! If you can please look at
|
||||||
|
[bugs.md](/bugs.md) for more information. Thank you!
|
||||||
|
|
||||||
|
|
||||||
## Try:
|
## Try:
|
||||||
@@ -42,125 +45,131 @@ okay. Thank you Cody for your assistance!
|
|||||||
|
|
||||||
## Author's remarks:
|
## Author's remarks:
|
||||||
|
|
||||||
OTCC is an Obfuscated Tiny C Compiler for i386-linux. It generates
|
`OTCC` is an Obfuscated Tiny C Compiler for i386-linux. It generates
|
||||||
FAST! i386 32 bit code (no bytecode) and it is powerful enough to
|
FAST! i386 32 bit code (no bytecode) and it is powerful enough to
|
||||||
compile itself. OTCC supports a strict subset of C. This subset is
|
compile itself. `OTCC` supports a strict subset of C. This subset is
|
||||||
compilable by a standard ANSI C compiler. OTCC compiles,
|
compilable by a standard ANSI C compiler. `OTCC` compiles,
|
||||||
assembles, links and runs C code without the need of any other
|
assembles, links and runs C code without the need of any other
|
||||||
program.
|
program.
|
||||||
|
|
||||||
You can use it by typing:
|
You can use it by typing:
|
||||||
|
|
||||||
./bellard bellard.c [args]...
|
```sh
|
||||||
|
./bellard bellard.c [args]...
|
||||||
|
```
|
||||||
|
|
||||||
or by giving the C source to its standard input.
|
or by giving the C source to its standard input.
|
||||||
|
|
||||||
'args' are given to the 'main' function of bellard.c (argv[0] is
|
`args` are given to the `main` function of `bellard.c` (`argv[0]` is
|
||||||
bellard.c).
|
[bellard.c](bellard.c)).
|
||||||
|
|
||||||
Examples:
|
### Examples:
|
||||||
|
|
||||||
- Sample compilation and execution:
|
- Sample compilation and execution:
|
||||||
|
|
||||||
|
```sh
|
||||||
./bellard bellard.otccex.c 10
|
./bellard bellard.otccex.c 10
|
||||||
|
```
|
||||||
|
|
||||||
- Self compilation:
|
- Self compilation:
|
||||||
|
|
||||||
|
```sh
|
||||||
./bellard bellard.c bellard.otccex.c 10
|
./bellard bellard.c bellard.otccex.c 10
|
||||||
|
```
|
||||||
|
|
||||||
- Self compilation iterated...
|
- Self compilation iterated...
|
||||||
|
|
||||||
|
```sh
|
||||||
./bellard bellard.c bellard.c bellard.otccex.c 10
|
./bellard bellard.c bellard.c bellard.otccex.c 10
|
||||||
|
```
|
||||||
An alternate syntax is to use it as a script interpreter: you can
|
An alternate syntax is to use it as a script interpreter: you can
|
||||||
put '#!/usr/local/bin/otcc' at the beginning of your C source if
|
put `#!/usr/local/bin/otcc` at the beginning of your C source if
|
||||||
you installed otcc at this place.
|
you installed `otcc` at this place.
|
||||||
|
|
||||||
Supported C language subset (read joint example 'otccex.c' to have
|
### Supported C language subset (read joint example [bellard.otccex.c](bellard.otccex.c) to have an introduction to `OTCC` dialect)
|
||||||
an introduction to OTCC dialect):
|
|
||||||
|
|
||||||
- Expressions:
|
#### Expressions:
|
||||||
|
|
||||||
* binary operators, by decreasing priority order: '*' '/' '%',
|
* binary operators, by decreasing priority order: `*` `/` `%`,
|
||||||
'+' '-', '>>' '<<', '<' '<=' '>' '>=', '==' '!=', '&',
|
`+` `-`, `>>` `<<`, `<` `<=` `>` `>=`, `==` `!=`, `&`,
|
||||||
'^', '|', '=', '&&', '||'.
|
`^`, `|`, `=`, `&&`, `||`.
|
||||||
|
|
||||||
* '&&' and '||' have the same semantics as C : left to right
|
* `&&` and `||` have the same semantics as in C: left to right
|
||||||
evaluation and early exit.
|
evaluation and early exit.
|
||||||
|
|
||||||
* Parenthesis are supported.
|
* Parenthesis are supported.
|
||||||
|
|
||||||
* Unary operators: '&', '*' (pointer indirection), '-'
|
* Unary operators: `&`, `*` (pointer indirection), `-`
|
||||||
(negation), '+', '!', '~', post fixed '++' and '--'.
|
(negation), `+`, `!`, `~`, post fixed `++` and `--`.
|
||||||
|
|
||||||
* Pointer indirection ('*') only works with explicit cast to
|
* Pointer indirection (`*`) only works with explicit cast to
|
||||||
'char *', 'int *' or 'int (*)()' (function pointer).
|
`char *`, `int *` or `int (*)()` (function pointer).
|
||||||
|
|
||||||
* '++', '--', and unary '&' can only be used with variable
|
* `++`, `--`, and unary `&` can only be used with variable
|
||||||
lvalue (left value).
|
lvalue (left value).
|
||||||
|
|
||||||
* '=' can only be used with variable or '*' (pointer
|
* `=` can only be used with variable or `*` (pointer
|
||||||
indirection) lvalue.
|
indirection) lvalue.
|
||||||
|
|
||||||
* Function calls are supported with standard i386 calling
|
* Function calls are supported _with standard **i386** calling
|
||||||
convention. Function pointers are supported with explicit
|
convention_. Function pointers are supported _with explicit
|
||||||
cast. Functions can be used before being declared.
|
cast_. Functions can be used before being declared.
|
||||||
|
|
||||||
- Types: only signed integer ('int') variables and functions can
|
- Types: only signed integer (`int`) variables and functions can
|
||||||
be declared. Variables cannot be initialized in
|
be declared. Variables cannot be initialized in
|
||||||
declarations. Only old K&R function declarations are parsed
|
declarations. _Only old K&R function declarations are parsed
|
||||||
(implicit integer return value and no types on arguments).
|
(implicit integer return value and no types on arguments)_.
|
||||||
|
|
||||||
- Any function or variable from the libc can be used because OTCC
|
- Any function or variable from the libc can be used because `OTCC`
|
||||||
uses the libc dynamic linker to resolve undefined symbols.
|
uses the libc dynamic linker to resolve undefined symbols.
|
||||||
|
|
||||||
- Instructions: blocks ('{' '}') are supported as in C. 'if' and
|
- Instructions: blocks (`{` `}`) are supported as in C. `if` and
|
||||||
'else' can be used for tests. The 'while' and 'for' C constructs
|
`else` can be used for tests. The `while` and `for` C looks are supported.
|
||||||
are supported for loops. 'break' can be used to exit
|
`break` can be used to exit loops. `return` is used for the return value of a
|
||||||
loops. 'return' is used for the return value of a function.
|
function.
|
||||||
|
|
||||||
- Identifiers are parsed the same way as C. Local variables are
|
- Identifiers are parsed the same way as C. Local variables are
|
||||||
handled, but there is no local name space (not a problem if
|
handled, but there is no local name space (not a problem if
|
||||||
different names are used for local and global variables).
|
different names are used for local and global variables).
|
||||||
|
|
||||||
- Numbers can be entered in decimal, hexadecimal ('0x' or '0X'
|
- Numbers can be entered in decimal, hexadecimal (`0x` or `0X`
|
||||||
prefix), or octal ('0' prefix).
|
prefix), or octal (`0` prefix).
|
||||||
|
|
||||||
- '#define' is supported without function like arguments. No macro
|
- `#define` is supported without function like arguments. _No macro
|
||||||
recursion is tolerated. Other preprocessor directives are
|
recursion is tolerated_; _other preprocessor directives are
|
||||||
ignored.
|
ignored_.
|
||||||
|
|
||||||
- C Strings and C character constants are supported. Only '\n',
|
- C Strings and C character constants are supported. Only `\n`,
|
||||||
'\"', '\'' and '\\' escapes are recognized.
|
`\"`, `\'` and `\\` escapes are recognized.
|
||||||
|
|
||||||
- C Comments can be used (but no C++ comments).
|
- C Comments can be used (but no C++ comments).
|
||||||
|
|
||||||
- No error is displayed if an incorrect program is given.
|
- No error is displayed if an incorrect program is given.
|
||||||
|
|
||||||
- Memory: the code, data, and symbol sizes are limited to 100KB
|
- Memory: the code, data, and symbol sizes are limited to 100KB
|
||||||
(it can be changed in the source code).
|
(it can be changed in the source code).
|
||||||
|
|
||||||
Obfuscation:
|
### Obfuscation:
|
||||||
|
|
||||||
No special effort was needed because obfuscation is almost
|
No special effort was needed because obfuscation is almost
|
||||||
unavoidable for such a program :-) Defines must be used to
|
unavoidable for such a program :-) Defines must be used to
|
||||||
compress the code, and integrated i386 code generator leads to non
|
compress the code, and integrated i386 code generator leads to non
|
||||||
obvious code.
|
obvious code.
|
||||||
|
|
||||||
Portability:
|
### Portability:
|
||||||
|
|
||||||
OTCC only works on i386 linux because it generates i386 code. OTCC
|
`OTCC` only works on i386 linux because it generates i386 code. `OTCC`
|
||||||
also relies on little endianness, unaligned memory accesses and
|
also relies on little endianness, unaligned memory accesses and
|
||||||
ASCII representation of characters. It also supposes that no valid
|
ASCII representation of characters. It also supposes that no valid
|
||||||
pointers are less than 512. If all those constraints are met, then
|
pointers are less than 512. If all those constraints are met, then
|
||||||
OTCC could be theoretically used to "cross compile", although no
|
`OTCC` could be theoretically used to "cross compile", although no
|
||||||
such support is currently integrated.
|
such support is currently integrated.
|
||||||
|
|
||||||
It was successfully compiled with gcc version 2.95.2. You get some
|
It was successfully compiled with gcc version 2.95.2. You get some
|
||||||
warnings because old K&R protos are used, some casts are implicit
|
warnings because old K&R prototypes are used, some casts are implicit
|
||||||
and some functions are used before being defined. OTCC uses the
|
and some functions are used before being defined. `OTCC` uses the
|
||||||
dynamic linker to resolve symbols with 'dlsym()', so '-ldl' must
|
dynamic linker to resolve symbols with `dlsym()`, so `-ldl` must
|
||||||
be used as library when you compile it.
|
be used when you compile and link it.
|
||||||
|
|
||||||
## Copyright and CC BY-SA 4.0 License:
|
## Copyright and CC BY-SA 4.0 License:
|
||||||
|
|
||||||
|
|||||||
@@ -918,6 +918,11 @@ would greatly appreciate anyone's help! It appears that this entry will require
|
|||||||
major debugging and to make it work one might need to have a deep understanding
|
major debugging and to make it work one might need to have a deep understanding
|
||||||
of the ELF format.
|
of the ELF format.
|
||||||
|
|
||||||
|
The author said that they compiled it with [gcc version
|
||||||
|
2.95.2](https://ftp.gnu.org/gnu/gcc/gcc-2.95.2/gcc-everything-2.95.2.tar.gz). We don't know if
|
||||||
|
a certain gcc version is necessary but it might be helpful to download and
|
||||||
|
compile that version to test it.
|
||||||
|
|
||||||
# 2002
|
# 2002
|
||||||
|
|
||||||
There was no IOCCC in 2002.
|
There was no IOCCC in 2002.
|
||||||
|
|||||||
Reference in new issue
Block a user