/* * 600_6l — linker smoke. Drive w6c → w6a → w6l on a tiny program, * confirm the result is a static ELF executable with no PT_INTERP. */ #include #include #include #include int main(void) { const char *bin = getenv("BIN"); if (!bin) bin = "out/bin"; char src[64], asmf[64], obj[64], exe[64]; snprintf(src, sizeof src, "/tmp/wwt_%d.ww", getpid()); snprintf(asmf, sizeof asmf, "/tmp/wwt_%d.s", getpid()); snprintf(obj, sizeof obj, "/tmp/wwt_%d.o", getpid()); snprintf(exe, sizeof exe, "/tmp/wwt_%d.x", getpid()); FILE *f = fopen(src, "wb"); fputs("fn main() i32 = { return 42; };", f); fclose(f); char cmd[1024]; snprintf(cmd, sizeof cmd, "%s/w6c -o %s %s", bin, asmf, src); if (system(cmd) != 0) { fprintf(stderr, "w6c failed\n"); return 1; } snprintf(cmd, sizeof cmd, "%s/w6a -o %s %s", bin, obj, asmf); if (system(cmd) != 0) { fprintf(stderr, "w6a failed\n"); return 1; } snprintf(cmd, sizeof cmd, "%s/w6l -o %s %s", bin, exe, obj); if (system(cmd) != 0) { fprintf(stderr, "w6l failed\n"); return 1; } /* validate ELF magic + e_type=EXEC */ FILE *of = fopen(exe, "rb"); if (of == NULL) { fprintf(stderr, "exe missing\n"); return 1; } unsigned char hdr[20]; if (fread(hdr, 1, sizeof hdr, of) != sizeof hdr) { fprintf(stderr, "short exe\n"); fclose(of); return 1; } fclose(of); if (memcmp(hdr, "\x7f""ELF", 4) != 0 || hdr[4] != 2) { fprintf(stderr, "not an ELF64\n"); return 1; } /* e_type at offset 16, little-endian u16; ET_EXEC = 2 */ unsigned short etype = (unsigned short)hdr[16] | ((unsigned short)hdr[17] << 8); if (etype != 2) { fprintf(stderr, "not ET_EXEC, got %u\n", etype); return 1; } /* ldd "not a dynamic executable" — proxy: check that file is not * dynamic by looking for PT_INTERP. We have none, so ldd reports * "not a dynamic executable" or similar. */ snprintf(cmd, sizeof cmd, "ldd %s 2>&1", exe); FILE *p = popen(cmd, "r"); char buf[256] = {0}; fread(buf, 1, sizeof buf - 1, p); pclose(p); if (strstr(buf, "not a dynamic executable") == NULL && strstr(buf, "statically linked") == NULL) { fprintf(stderr, "ldd says not static: %s\n", buf); return 1; } unlink(src); unlink(asmf); unlink(obj); unlink(exe); printf("w6l: ok\n"); return 0; }