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,
you'll get about the same output size.
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)
You will need a rust installation.
cargo install --path .
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.