#if 0 /*─────────────────────────────────────────────────────────────────╗ │ To the extent possible under law, Justine Tunney has waived │ │ all copyright and related or neighboring rights to this file, │ │ as it is written in the following disclaimers: │ │ • http://unlicense.org/ │ │ • http://creativecommons.org/publicdomain/zero/1.0/ │ ╚─────────────────────────────────────────────────────────────────*/ #endif #include "libc/calls/calls.h" #include "libc/dlopen/dlfcn.h" #include "libc/fmt/itoa.h" #include "libc/nt/thunk/msabi.h" #include "libc/runtime/runtime.h" /** * @fileoverview cosmopolitan dynamic runtime linking demo * * Our cosmo_dlopen() interface currently supports: * * - x86-64 Linux w/ Glibc * - x86-64 Linux w/ Musl Libc * - x86-64 FreeBSD * - x86-64 Windows * - x86-64 NetBSD * - aarch64 Linux w/ Glibc * - aarch64 Linux w/ Musl Libc * - aarch64 MacOS * */ int main(int argc, char **argv, char **envp) { // open the host system's zlib library void *libc = cosmo_dlopen("libz.so", RTLD_LAZY); if (!libc) { tinyprint(2, cosmo_dlerror(), "\n", NULL); exit(1); } // load crc() function address unsigned (*crc32)(unsigned, void *, int) = cosmo_dlsym(libc, "crc32"); if (!crc32) { tinyprint(2, cosmo_dlerror(), "\n", NULL); exit(1); } // compute a checksum and print the result char ibuf[12]; FormatInt32(ibuf, crc32(0, "hi", 2)); tinyprint(1, "crc(hi) = ", ibuf, "\n", NULL); // mop up cosmo_dlclose(libc); exit(0); }