Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Portable, fully-static release executables on Linux #1351

Merged
merged 10 commits into from
Feb 27, 2024

Commits on Feb 26, 2024

  1. feat: Portable, fully-static release executables on Linux

    This adds the option FULLY_STATIC to create fully-static executables.
    
    To create portable, fully-static release executables on Linux, we need
    to use musl instead of glibc.  Static executables from glibc are not
    portable.
    
    The popular musl-gcc wrapper does not support C++, so instead we use a
    full musl cross-compiler toolchain in the build workflow.
    
    To build FULLY_STATIC, the user must point to the appropriate
    cross-compiler, as we do in the workflow.  On systems where musl is
    the native libc (such as Alpine Linux), this is not necessary.
    
    I have also read that musl's allocator is not very fast in
    multi-threaded applications.  So when FULLY_STATIC is enabled, we will
    also enable mimalloc, a replacement allocator that is very fast.
    
    I tested a very basic packaging command to compare speeds of dynamic
    glibc, static musl, and static musl+mimalloc:
    
    dynamic glibc:
    runs: 2.527, 2.798, 2.703, 2.756, 2.959
    avg = 2.749, std dev = 0.156s
    
    static musl:
    runs: 2.813, 2.920, 3.129, 3.003, 2.738
    avg = 2.921s, std dev = 0.154s
    
    static musl+mimalloc:
    runs: 2.291, 2.034, 2.415, 2.303, 2.265
    avg = 2.262s, std dev = 0.140s
    
    The mimalloc build is 82% faster than musl default allocator, 77%
    faster than glibc, and has more consistent runtime characteristics
    (lower standard deviation).
    joeyparrish committed Feb 26, 2024
    Configuration menu
    Copy the full SHA
    6981ecb View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    798e676 View commit details
    Browse the repository at this point in the history

Commits on Feb 27, 2024

  1. Configuration menu
    Copy the full SHA
    6afcff6 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    c095b69 View commit details
    Browse the repository at this point in the history
  3. Debug arm64 failure

    joeyparrish committed Feb 27, 2024
    Configuration menu
    Copy the full SHA
    61a31a0 View commit details
    Browse the repository at this point in the history
  4. Fix arm builds

    joeyparrish committed Feb 27, 2024
    Configuration menu
    Copy the full SHA
    7494440 View commit details
    Browse the repository at this point in the history
  5. Configuration menu
    Copy the full SHA
    e81bab7 View commit details
    Browse the repository at this point in the history
  6. Configuration menu
    Copy the full SHA
    4f708e7 View commit details
    Browse the repository at this point in the history
  7. Configuration menu
    Copy the full SHA
    fa6ee34 View commit details
    Browse the repository at this point in the history
  8. Another attempt to verify static executables

    ldd does not return exit code of 1 any more for static, and "file" reports dynamic on arm64 even when it is not.  So now we look at the output of ldd instead.
    joeyparrish committed Feb 27, 2024
    Configuration menu
    Copy the full SHA
    cda33a1 View commit details
    Browse the repository at this point in the history