aboutsummaryrefslogtreecommitdiff
path: root/mk/libraries.mk
diff options
context:
space:
mode:
authorMatthew Bauer <mjbauer95@gmail.com>2020-06-09 23:35:38 -0500
committerMatthew Bauer <mjbauer95@gmail.com>2020-06-09 23:35:38 -0500
commit7eca8a16eaf74bc15a816e24005a65e5480d2a79 (patch)
treeff9e353a5b9221efc8e8c83db69389be6b9487b0 /mk/libraries.mk
parentb2c8061b44b01a39d953d75db30e39bd8f300021 (diff)
Prelink static libraries into an object file
This combines the *.o into a big .o producing one translation unit. This preserve our unused static initializers, as specified in the C++ standard: If no variable or function is odr-used from a given translation unit, the non-local variables defined in that translation unit may never be initialized (this models the behavior of an on-demand dynamic library). Note that this is very similar to how the --whole-archive flag works. One advantage of this is that users of the final .a library don’t have to worry about specifying --whole-archive, or that we have unused static initializers at all!
Diffstat (limited to 'mk/libraries.mk')
-rw-r--r--mk/libraries.mk3
1 files changed, 2 insertions, 1 deletions
diff --git a/mk/libraries.mk b/mk/libraries.mk
index 307e29b9d..e6ef2e3ec 100644
--- a/mk/libraries.mk
+++ b/mk/libraries.mk
@@ -125,7 +125,8 @@ define build-library
$(1)_PATH := $$(_d)/$$($(1)_NAME).a
$$($(1)_PATH): $$($(1)_OBJS) | $$(_d)/
- $(trace-ar) $(AR) crs $$@ $$?
+ $(trace-ld) $(LD) -Ur -o $$(_d)/$$($(1)_NAME).o $$?
+ $(trace-ar) $(AR) crs $$@ $$(_d)/$$($(1)_NAME).o
$(1)_LDFLAGS_USE += $$($(1)_PATH) $$($(1)_LDFLAGS)