commit 450932a7f5e0e0761dc08925946be44abf47f0fd
parent 3e182313eb72b66426a814c3d1d8725165a26f83
Author: bsandro <email@bsandro.tech>
Date: Tue, 7 Oct 2025 01:31:38 +0300
main2 no longer leaks; added main3 with super nice compression hacks
Diffstat:
| M | Makefile | | | 9 | ++++++++- |
| A | main3.c | | | 143 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
2 files changed, 151 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
@@ -6,7 +6,14 @@ min: all
upx -9 ./test1
clean:
- rm ./test1
+ rm -f ./test1 ./main3
+
+main3: clean
+ ${CC} -Os -s -fomit-frame-pointer -nostdlib main3.c -o main3o -Wl,-dynamic-linker,/usr/lib64/ld-linux-x86-64.so.2 -Wl,--no-as-needed /usr/lib64/libdl.so.2 /usr/lib64/libc.so
+ strip -S --strip-unneeded --remove-section=.note.gnu.gold-version --remove-section=.comment --remove-section=.note --remove-section=.note.gnu.build-id --remove-section=.note.ABI-tag main3o
+ echo "a=/tmp/I;tail -n+2 \$$0|unxz>\$$a;chmod +x \$$a;\$$a;exit" > main3
+ xz -zce -9 main3o >> main3
+ chmod +x main3
run: min
./test1
diff --git a/main3.c b/main3.c
@@ -0,0 +1,143 @@
+#include <stdint.h>
+
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#include <GL/glx.h>
+#include <GL/gl.h>
+#include <dlfcn.h>
+#include <stdio.h>
+#include <sys/syscall.h>
+#include <time.h>
+
+#define SCRW 800
+#define SCRH 600
+
+static __inline long __syscall2(long n, long a1, long a2)
+{
+ unsigned long ret;
+ __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n), "D"(a1), "S"(a2)
+ : "rcx", "r11", "memory");
+ return ret;
+}
+
+static __inline uint64_t time_monotonic(void)
+{
+ struct timespec now;
+ __syscall2(SYS_clock_gettime, CLOCK_MONOTONIC_RAW, (long)&now);
+ return now.tv_sec * 1000000 + now.tv_nsec / 1000;
+}
+
+static int visual_hints[] = {
+ GLX_RGBA,
+ GLX_DEPTH_SIZE, 24,
+ GLX_DOUBLEBUFFER,
+ None
+};
+
+static const char *sym_names =
+"libX11.so\0"
+"XOpenDisplay\0"
+"XCreateSimpleWindow\0"
+"XSelectInput\0"
+"XMapWindow\0"
+"XPending\0"
+"XNextEvent\0"
+"XkbKeycodeToKeysym\0"
+"\0"
+"libGL.so\0"
+"glXChooseVisual\0"
+"glXCreateContext\0"
+"glXMakeCurrent\0"
+"glXSwapBuffers\0"
+"glClear\0\0\0";
+
+static void *syms[12];
+
+#define _XOpenDisplay ((Display *(*)(const char *))syms[0])
+#define _XCreateSimpleWindow ((Window (*)(Display *, Window, int, int, unsigned, unsigned, unsigned, unsigned long, unsigned long))syms[1])
+#define _XSelectInput ((int (*)(Display *, Window, long))syms[2])
+#define _XMapWindow ((int (*)(Display *, Window))syms[3])
+#define _XPending ((int (*)(Display *))syms[4])
+#define _XNextEvent ((int (*)(Display *, XEvent *))syms[5])
+#define _XkbKeycodeToKeysym ((KeySym (*)(Display *, KeyCode, int, int))syms[6])
+
+#define _glXChooseVisual ((XVisualInfo *(*)(Display *, int, int *))syms[7])
+#define _glXCreateContext ((GLXContext (*)(Display *, XVisualInfo *, GLXContext, Bool))syms[8])
+#define _glXMakeCurrent ((Bool (*)(Display *, GLXDrawable, GLXContext))syms[9])
+#define _glXSwapBuffers ((void (*)(Display *, GLXDrawable))syms[10])
+
+#define _glClear ((void (*)(GLbitfield))syms[11])
+
+static void dl_load(void)
+{
+ const char *name = sym_names;
+ void **sym = syms;
+
+ do
+ {
+ void *dl = dlopen(name, RTLD_LAZY | RTLD_GLOBAL);
+ for(;;)
+ {
+ while(*name++);
+ if(*name == 0) break;
+ *sym++ = dlsym(dl, name);
+ }
+ } while(*++name);
+}
+
+void my_main(int argc, const char **argv)
+{
+ dl_load();
+
+ Display *display = _XOpenDisplay(NULL);
+ int screen = DefaultScreen(display);
+ Window window = _XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, SCRW, SCRH, 0, 0, 0);
+ _XSelectInput(display, window, KeyPressMask | KeyReleaseMask);
+ XVisualInfo *visual_info = _glXChooseVisual(display, screen, visual_hints);
+ GLXContext context = _glXCreateContext(display, visual_info, NULL, True);
+ _glXMakeCurrent(display, window, context);
+
+ _XMapWindow(display, window);
+
+ uint64_t prev = time_monotonic();
+ uint64_t t = 0;
+ for(;;)
+ {
+ XEvent event;
+ while(_XPending(display))
+ {
+ _XNextEvent(display, &event);
+ if(event.type == KeyPress)
+ {
+ switch(_XkbKeycodeToKeysym(display, event.xkey.keycode, 0, 0))
+ {
+ case XK_Escape: goto shutdown;
+ }
+ }
+ }
+ // draw demo
+
+ _glClear(GL_COLOR_BUFFER_BIT);
+
+ _glXSwapBuffers(display, window);
+
+ t += time_monotonic() - prev;
+ }
+
+shutdown:
+ return;
+}
+
+asm (
+ ".text\n"
+ ".global _start\n"
+ "_start:\n"
+ "xor %rbp,%rbp\n"
+ "pop %rdi\n"
+ "mov %rsp,%rsi\n"
+ "andq $-16,%rsp\n"
+ "call my_main\n"
+ "movq $60,%rax\n"
+ "xor %rdi,%rdi\n"
+ "syscall\n"
+);