Don't add underscore prefix to amd64 symbols
[reactos.git] / reactos / tools / rbuild / backend / mingw / linkers / ld.mak
index 4640904..88da818 100644 (file)
@@ -1 +1,90 @@
-# TODO
+# -exclude-all-symbols disables autoexporting all symbols *if none were found* (either in a DEF file or using __declspec(dllexport)
+LDFLAG_DLL:=-shared -exclude-all-symbols
+LDFLAG_DRIVER:=-shared --subsystem=native -exclude-all-symbols
+LDFLAG_NOSTDLIB:=-nostartfiles -nostdlib
+LDFLAG_CONSOLE:=--subsystem=console
+LDFLAG_WINDOWS:=--subsystem=windows
+LDFLAG_NATIVE:=--subsystem=native
+
+LDFLAG_EXCLUDE_ALL_SYMBOLS=-exclude-all-symbols
+DLLTOOL_FLAGS=--kill-at
+ifeq ($(ARCH),amd64)
+    DLLTOOL_FLAGS= --no-leading-underscore
+endif
+
+#~ #(module, objs, deps, ldflags, output, def, libs, entry, base)
+#(module, objs, deps, ldflags, output, def, libs, entry, base, extralibs)
+define RBUILD_LINK
+
+ifneq ($(6),)
+${call RBUILD_intermediate_dir,$(5)}$$(SEP)lib${call RBUILD_name,$(5)}.a: $(6) | ${call RBUILD_intermediate_path,$(5)}
+       $$(ECHO_IMPLIB)
+       $${dlltool} --def $(6) $(DLLTOOL_FLAGS) --output-lib=$$@
+
+${call RBUILD_intermediate_dir,$(5)}$$(SEP)lib${call RBUILD_name,$(5)}.delayimp.a: $(6) | ${call RBUILD_intermediate_path,$(5)}
+       $$(ECHO_IMPLIB)
+       $${dlltool} --def $(6) $(DLLTOOL_FLAGS) --output-delaylib=$$@
+
+${call RBUILD_intermediate_path_noext,$(5)}.exp: $(6) | ${call RBUILD_intermediate_path,$(5)}
+       $$(ECHO_IMPLIB)
+       $${dlltool} --def $(6) $(DLLTOOL_FLAGS) --output-exp=$$@
+
+$(1)_CLEANFILES+=\
+       ${call RBUILD_intermediate_dir,$(5)}$$(SEP)lib$(notdir $(5)).a \
+       ${call RBUILD_intermediate_dir,$(5)}$$(SEP)lib$(notdir $(5)).delayimp.a \
+       ${call RBUILD_intermediate_path_noext,$(5)}.exp
+endif
+
+# TODO: refactor this out of here and into rules.mak
+${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp: $(2) $$(if $(6),${call RBUILD_intermediate_path_noext,$(5)}.exp) $(3) | ${call RBUILD_intermediate_dir,$(5)}
+       $$(ECHO_RSP)
+       -@$${rm} $$@ 2>$$(NUL)
+       $${cp} $$(NUL) $$@ >$$(NUL)
+       $$(foreach obj,$(2) $$(if $(6),${call RBUILD_intermediate_path_noext,$(5)}.exp),$$(Q)echo $$(QUOTE)$$(subst \,\\,$$(obj))$$(QUOTE)>>$$@$$(NL))
+
+$(1)_CLEANFILES+=${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp
+
+$(5): ${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp $(7) $(3) $$(RSYM_TARGET) $$(PEFIXUP_TARGET) | ${call RBUILD_dir,$(5)}
+       $$(ECHO_LD)
+#~     $${ld} --entry=$(8) --image-base=$(9) @${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp $(7) ${call RBUILD_ldflags,$(1),$(4)} -o $$@
+       $${ld} --entry=$(8) --image-base=$(9) @${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp --start-group $(10) $(7) --end-group ${call RBUILD_ldflags,$(1),$(4)} -o $$@
+ifneq ($(or $(6),$$(MODULETYPE$$($(1)_TYPE)_KMODE)),)
+       $$(ECHO_PEFIXUP)
+       $$(Q)$$(PEFIXUP_TARGET) $$@ $(if $(6),-exports) $$(if $$(MODULETYPE$($(1)_TYPE)_KMODE),-sections)
+endif
+ifeq ($(ROS_BUILDMAP),full)
+       $$(ECHO_OBJDUMP)
+       $${objdump} -d -S $$@ > ${call RBUILD_output_path_noext,$(5)}.map
+else
+ifeq ($(ROS_BUILDMAP),yes)
+       $$(ECHO_NM)
+       $${nm} --numeric-sort $$@ > ${call RBUILD_output_path_noext,$(5)}.map
+endif
+endif
+ifeq ($(ROS_BUILDNOSTRIP),yes)
+       $$(ECHO_CP)
+       $${cp} $(5) $(basename $(5)).nostrip$(suffix $(5)) 1>$(NUL)
+endif
+ifneq ($(ROS_GENERATE_RSYM),no)
+       $$(ECHO_RSYM)
+       $$(Q)$$(RSYM_TARGET) $$@ $$@
+endif
+ifeq ($(ROS_LEAN_AND_MEAN),yes)
+       $$(ECHO_STRIP)
+       $${strip} -s -x -X $$@
+endif
+
+ifneq ($(ROS_BUILDMAP),)
+$(1)_CLEANFILES+=${call RBUILD_output_path_noext,$(5)}.map
+endif
+
+ifeq ($(ROS_BUILDNOSTRIP),yes)
+$(1)_CLEANFILES+=$(basename $(5)).nostrip$(suffix $(5))
+endif
+
+endef
+
+#~ #(module, def, deps, ldflags, libs, entry, base)
+#~ RBUILD_LINK_RULE=${call RBUILD_LINK,$(1),$(value $(1)_OBJS),$(3),$(4),$(value $(1)_TARGET),$(2),$(5) $(value $(1)_LIBS) $(5),$(6),$(7)}
+#(module, def, deps, ldflags, libs, entry, base, extralibs)
+RBUILD_LINK_RULE=${call RBUILD_LINK,$(1),$(value $(1)_OBJS),$(3),$(4),$(value $(1)_TARGET),$(2),$(value $(1)_LIBS),$(6),$(7),$(5)}
\ No newline at end of file