summaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md55
1 files changed, 55 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..11f7ae7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,55 @@
+# tinyld
+
+a linker for making tiny 32-bit linux executables.
+
+*Just after* making this, I found out that something similar already existed here:
+https://github.com/Shizmob/smol/ -- although smold's executables are giving me segfaults
+for some reason.
+This linker is worse in terms of output size, but the executables are more standard-compliant
+and don't rely on undocumented ELF magic. The difference isn't even that big (in the 10s of bytes)
+after compressing with `xz` -- so if you're using [this handy executable unpacker](https://gitlab.com/PoroCYon/vondehi),
+you'll get about the same output size.
+
+## Executable sizes
+
+Exit using inline assembly (tests/tiny.c): **93 bytes**
+
+Hello world: **369 bytes** (252 bytes `xz`-compressed)
+
+Open a window, get a GL context, and call `glClearColor`, `glClear` each frame (tests/sdl.c): **881 bytes**
+(532 bytes `xz`-compressed)
+
+## Installation
+
+You will need a [rust installation](https://www.rust-lang.org/tools/install).
+
+```
+cargo install --path .
+```
+
+## Usage
+
+`gcc-multilib`/`g++-multilib` are needed for 32-bit headers for C/C++.
+
+Example: create a file called `hello.c` containing
+```
+#include <stdio.h>
+#include <stdlib.h>
+
+void entry(void) {
+ printf("Hello, world!\n");
+ exit(0);
+}
+```
+
+then run `tinyld hello.c -o hello`. You now have an executable called `hello` which prints `Hello, world!`.
+
+To add libaries, use e.g. `tinyld my_sdl_program.c libSDL2.so`.
+
+You can use C++, but exceptions probably won't work, and `cout`/`cin` don't seem to work either
+(you should be using `printf` anyways if you want a smaller executable).
+
+Only 32-bit x86 ELF is supported. If you give tinyld a 64-bit executable it will die.
+If you're compiling your own object files, you need to add `-fno-pic` otherwise tinyld will die.
+
+For more information, see `tinyld --help`.