Technical notes


Today I learned that by default, when linking static library, linker includes whole object that contains symbol required. In other word, linker do not eliminate unused symbols, only unused objects. Also I learned that there are GCC-specific compilation flags "-ffunction-sections -fdata-sections" and "-Wl,--gc-sections" link flags that together enable per-symbol granularity.

I was very enthusiastic about this discovery, but when enabled these flags globally in "pkgs/stdenv/adapters.nix", I got error when building busybox:

    GEN     include/applet_tables.h include/NUM_APPLETS.h
    HOSTCC  applets/usage_pod
    CC      applets/applets.o
    LD      applets/built-in.o
  /nix/store/f7b0y2q80kgnqjkjmh7cng048wsy6mw9-x86_64-unknown-linux-musl-binutils-2.31.1/bin/x86_64-unknown-linux-musl-ld: gc-sections requires either an entry or an undefined symbol
  collect2: error: ld returned 1 exit status
  make[1]: *** [scripts/ applets/built-in.o] Error 1
  make: *** [Makefile:372: applets_dir] Error 2

Documentation for --gc-sections mentions that in case of partial linking, garbage collection root must be provided with either --entry or --undefined. According to same manual, partial linking is process when output of linker is passed to another invocation of linker. Why would anyone want it?