diff --git a/2001/anonymous/Makefile b/2001/anonymous/Makefile index 920c462fa..0b04e9a5b 100644 --- a/2001/anonymous/Makefile +++ b/2001/anonymous/Makefile @@ -145,9 +145,9 @@ ${PROG}: ${PROG}.c ${PROG}.ten: ${PROG}.ten.c - @echo "WARNING: ${PROG}.ten.c must be compiled as 32-bit to use with the entry itself;" - @echo "this is because the program works on 32-bit binaries. If you cannot use -m32 this" - @echo "will NOT work!" + @echo "WARNING: ${PROG}.ten.c must be compiled as a 32-bit ELF binary to use with" + @echo "the entry itself; this is because the program works on 32-bit ELF binaries." + @echo "If you cannot use -m32 this will NOT work!" @echo @echo "If you want to use it where this is not possible e.g. with a Mac, say to" @echo "use by itself, try:" @@ -165,9 +165,9 @@ ${PROG}.ten.64: ${PROG}.ten.c ${CC} ${CFLAGS} $< -o $@ ${LDFLAGS} ${PROG}.bed: ${PROG}.bed.c - @echo "WARNING: ${PROG}.bed.c must be compiled as 32-bit to use with the entry itself;" - @echo "this is because the program works on 32-bit binaries. If you cannot use -m32 this" - @echo "will NOT work!" + @echo "WARNING: ${PROG}.bed.c must be compiled as a 32-bit ELF binary to use with" + @echo "the entry itself; this is because the program works on 32-bit ELF binaries." + @echo "If you cannot use -m32 this will NOT work!" @echo @echo "If you want to use it where this is not possible e.g. with a Mac, say to" @echo "use by itself, try:" diff --git a/2001/anonymous/README.md b/2001/anonymous/README.md index c31601299..7e1d005a6 100644 --- a/2001/anonymous/README.md +++ b/2001/anonymous/README.md @@ -28,20 +28,21 @@ For more detailed information see [2001 anonymous in bugs.md](/bugs.md#2001-anon ```sh ./try.sh -./anonymous anonymous.bed # if able to use -m32 +./anonymous anonymous.bed # if able to compile as a 32-bit (-m32) ELF binary ``` NOTE: if the 32-bit version cannot be compiled the script will at least compile -[anonymous.ten](anonymous.ten.c) as a 64-bit program and run it directly. +[anonymous.ten](anonymous.ten.c) as a 64-bit program and run it directly. If it +can be compiled but it's not an ELF binary the program is likely to crash. For fun and so that there's another program that is a bit different (it uses a `char *[]` array for example) that this program will still work on: ```sh -make anonymous.bed # if able to use -m32 +make anonymous.bed # if able to compile as 32-bit (-m32) ELF binary ./anonymous anonymous.bed -make anonymous.bed.64 # if unable to use -m32 +make anonymous.bed.64 # if unable to compile as a 32-bit (-m32) ELF binary ./anonymous.bed.64 ``` @@ -61,7 +62,7 @@ that :-( If the program cannot be run (for instance under macOS as an ELF file) then the program will fail to execute it and might not even touch it. -This is supposed to happen. As is written in the +These are supposed to happen. As is written in the [The Jargon File](http://catb.org/jargon/html/F/feature.html): ``` @@ -79,6 +80,9 @@ no longer known exactly what is supposed to happen and possibly that the modification might not be entirely correct for that reason though it does appear to be correct. +It appears that the corruption happens only if the modification fails in the +middle of doing so so that might be why it's not yet been observed. + ## Judges' remarks: @@ -93,10 +97,13 @@ run x86 programs on any machine (x86 or otherwise). I have included a simple [10 Green Bottles](https://www.bbc.co.uk/teach/school-radio/nursery-rhymes-ten-green-bottles/zncyt39) -[program](anonymous.ten.c) (try `make anonymous.ten`), meant to be compiled in 32-bit. +[program](anonymous.ten.c) (try `make anonymous.ten`), meant to be compiled as a +32-bit ELF binary. + The program `anonymous.ten`, and its source (dull) are included as data files. + ### Warning Note that the translator screws around with the binary you run on it and *might* @@ -114,7 +121,7 @@ generates a translation for an entire basic block of subject code. Having translated a block once, the target code generated will be stored for the duration that the program is running, so as a program runs its performance will improve, as it hits cached blocks. This can be clearly observed in the example -program, [anonymous.ten](anonymous.ten.c) which must be compiled as a 32-bit +program, [anonymous.ten](anonymous.ten.c) which must be compiled as a 32-bit ELF binary. ### Target Library Linking: @@ -136,8 +143,10 @@ There are various problems raised when attempting to run little [PPC](https://en.wikipedia.org/wiki/PowerPC). These problems are dealt with in a manner that is entirely transparent to the user. + ### Configuration: + #### Warnings: By default the build script should compile the program with a set of @@ -149,6 +158,7 @@ error, or if the program generates any further error when compiled using your C compiler please remove the `-Dwarning='-Dprocessor'` line and the `$$warning` from the compiler invocation. + ### Optimization The build script contains a `-O1` switch for the compiler. Increasing @@ -156,6 +166,7 @@ the optimization level will make the program run *slower*, while compiling the program without any optimization will allow it to run *faster*. + ### Obfuscation The most obvious part of the obfuscation is probably the mess of `#define`s at the @@ -170,7 +181,7 @@ not contained within the source code but instead is passed in on the command line. Buried under all this, and the fact that the entire program is just a -call to `exit()`, there are some nice subtle little obfuscations. For +call to `exit(3)`, there are some nice subtle little obfuscations. For example, you may notice that there are a couple of macros that use the `##` preprocessor operator to build pairs of functions. One of these macros is used to build pairs of functions of which only one has @@ -179,11 +190,12 @@ global state, and the other doesn't. There is also quite a nice trick where I wave a magic wand, and a chunk of code which should only be run when the program is run for the first time (setting the -[PC / IP](https://en.wikipedia.org/wiki/Program_counter) to point at `main()`, -etc) gets turned into a `frog^M^M^M^Mstring`. The C compiler sees a string by +[PC / IP](https://en.wikipedia.org/wiki/Program_counter) to point at `main()` +etc.) gets turned into a frogstring. The C compiler sees a string by itself in the code, thinks "yup, that's a valid C expression", and quietly moves on to the next line of code. + ### Limitations Due to space limitations only a handful of instructions are supported; these @@ -200,19 +212,20 @@ turn up - yes the program is unsafe, but it's pretty cool anyway. Despite all this, the translator is not exclusively limited to running the [anonymous.ten](anonymous.ten.c) program. Other trivial **_x86_** programs may run on the translator \- and I have successfully run a wide range of "Hello -World" programs, including one of last years IOCCC winners, +World" programs, including one of last year's IOCCC winners, [tomx](/2000/tomx/tomx.c). + ### Complete Program -The fact that the program makes calls to `system()` and `execv()` may imply that +The fact that the program makes calls to `system(3)` and `execv(3)` may imply that it is not a complete program in its own right, as it relies on other programs. -The call to `system()` is a call to ask gcc to recompile the translator with a -new set of switches, and the call to `execv()` asks for the newly compiled +The call to `system(3)` is a call to ask gcc to recompile the translator with a +new set of switches, and the call to `execv(3)` asks for the newly compiled program to be executed. I would point out that almost every other entry to this competition also require a C compiler (well, the published winners at any rate, and I recognize that a few don't). There is little real difference between this -program and one like last years entry [dhyang](/2000/dhyang/dhyang.c); both are +program and one like last year's entry [dhyang](/2000/dhyang/dhyang.c); both are just C programs that generate C code as their output. Enjoy and thanks!