+endif # USER_RULE_TEMPLATES
+
+.PHONY: link
+link:
+ $(Q)$(MAKE) $(NO_PRINT_DIRECTORY) -C $(LINK_BUILD_DIR) -f $(SOURCESDIR_MAKEFILE) link-pseudo-pass
+
+ifeq ($(MAKECMDGOALS),link-pseudo-pass)
+
+# Syntax: $(call solib_link_template,<library-name>)
+define solib_link_template
+$(1)_shared_libs = $$(patsubst %,$(USER_LIB_DIR)/lib%.$(SOLIB_EXT),$$(filter $$(shared_libs),$$($(1)_libs)))
+#$$(warning $(1)_shared_libs = $$($(1)_shared_libs))
+$(USER_LIB_DIR)/lib$(1).$(SOLIB_EXT): $$($(1)_shared_libs) $$($(1)_objslo)
+ @$(QUIET_CMD_ECHO) " LINK $$@"
+ $(Q)$(CC) --shared -Xlinker -soname=lib$(1).$(SOLIB_EXT) -o $$@ $$($(1)_objslo) $$(LOADLIBES) $$($(1)_libs:%=-l%)
+endef
+
+# Syntax: $(call program_link_template,<executable-name>,<dest-dir>)
+define program_link_template
+$(2)/$(1)$(EXE_SUFFIX): dir=$(LINK_BUILD_DIR)/$$(notdir $(2))
+$(2)/$(1)$(EXE_SUFFIX): $$($(1)_objs)
+ @$(QUIET_CMD_ECHO) " LINK $$@"
+ $(Q) $$($(1)_linker) \
+ $$($(1)_objs) $$($(1)_libs:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-Map,$$(dir)/$(1).exe.map -o $$@
+ @echo "$$@: \\" >$$(dir)/$(1).exe.d
+ @sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $$(dir)/$(1).exe.map|tr '&' '\134' >>$$(dir)/$(1).exe.d
+ @echo >>$$(dir)/$(1).exe.d
+endef
+
+-include $(shell find $(USER_BUILD_DIR) -name '*.omkvar')
+#$(warning $(shared_libs))
+$(foreach lib,$(shared_libs),$(eval $(call solib_link_template,$(lib))))
+$(foreach prg,$(bin_programs),$(eval $(call program_link_template,$(prg),$(USER_BIN_DIR))))
+$(foreach prg,$(utils_programs),$(eval $(call program_link_template,$(prg),$(USER_UTILS_DIR))))
+$(foreach prg,$(test_programs),$(eval $(call program_link_template,$(prg),$(USER_TESTS_DIR))))
+
+.PHONY: link-pseudo-pass
+link-pseudo-pass: $(shared_libs:%=$(USER_LIB_DIR)/lib%.$(SOLIB_EXT)) \
+ $(bin_programs:%=$(USER_BIN_DIR)/%$(EXE_SUFFIX)) \
+ $(utils_programs:%=$(USER_UTILS_DIR)/%$(EXE_SUFFIX)) \
+ $(tests_programs:%=$(USER_TESTS_DIR)/%$(EXE_SUFFIX))
+endif # link-shared-libs