#!/usr/bin/env sh # Invoke mold, then strip junk sections from the output binary with objcopy. # This (more or less) removes sections that mold cannot discard itself, suck as: # - .eh_frame / .eh_frame_hdr - unwind tables from compiler_builtins # - .dynstr - mold emits this, even for fully static binaries # - .comment - compiler version string # # We forward everything to mold via -fuse-ld, then post-process the output in place. set -eu # Locate the output file and detect static linking IS_STATIC=0 OUTPUT="" prev="" for arg in "$@"; do case "$arg" in -static) IS_STATIC=1 ;; esac if [ "$prev" = "-o" ]; then OUTPUT="$arg" fi prev="$arg" done # Invoke mold via the cc driver, forward all original arguments cc -fuse-ld=mold "$@" # Only strip sections from fully static binaries. # Dynamic executables (i.e. build scripts, proc-macros) need .dynstr at runtime. if [ "$IS_STATIC" = 1 ] && [ -n "$OUTPUT" ] && [ -f "$OUTPUT" ]; then objcopy \ --remove-section=.eh_frame \ --remove-section=.eh_frame_hdr \ --remove-section=.dynstr \ --remove-section=.comment \ "$OUTPUT" fi