Subject: Re: Git v2.46.0 and --allow-multiple-definition linker flag

From: Junio C Hamano <[email-masked]>
Date: Sat, 21 Dec 2024 18:47:53 -0800

Junio C Hamano <[email-masked]> writes:

> James Mills <[email-masked]> writes:
>
>> tcc: error: unsupported linker option '--allow-multiple-definition'
>>
>> I bisected the Git releases and traced the introduction of this new
>> flag to v2.46.0
>>
>> I can't find any details of this flag really or when this was
>> introduced in the GNU binutils and so far I haven't asked if the Tiny
>> C devs intend to support this option (yet).
>
> Would
>
>     $ make LINK_FUZZ_PROGRAMS=""
>
> help?
>
> The platform-specific tweak defined in config.mak.uname file assumes
> that you have glibc plus gcc or clang with usual binutils niceties
> once you claim that you are Linux.  It lumps all different variants
> of Linux into a single ball of wax and defines LINK_FUZZ_PROGRAMS
> Makefile macro, which is a bit unfortunate.

Having said that, I am not sure if the commit that introduced the
fuzz-all linkage rules, which is 8b9a42bf (fuzz: fix fuzz test build
rules, 2024-01-19), needed to do so in the first place.  With this
trivial patch at the end of the message applied on top of 8b9a42bf
(or more recent 'master', for that matter), "make fuzz-all" seems to
link things just fine.

Note that "make CC=clang fuzz-all" in the older code used to fail
due to something else from gcc+ (which recent build no longer makes
mandatory), but in today's code with gcc/clang/ld available locally,
the linker flag does not seem to be needed for "make fuzz-all".

Josh, do you offhand know what made us add the option?

Thanks.

diff --git c/Makefile w/Makefile
index c0cbed69d8..5af8935968 100644
--- c/Makefile
+++ w/Makefile
@@ -3848,7 +3848,6 @@ FUZZ_CXXFLAGS ?= $(ALL_CFLAGS)
 
 $(FUZZ_PROGRAMS): %: %.o oss-fuzz/dummy-cmd-main.o $(GITLIBS) GIT-LDFLAGS
 	$(QUIET_LINK)$(CXX) $(FUZZ_CXXFLAGS) -o $@ $(ALL_LDFLAGS) \
-		-Wl,--allow-multiple-definition \
 		$(filter %.o,$^) $(filter %.a,$^) $(LIBS) $(LIB_FUZZING_ENGINE)
 
 fuzz-all: $(FUZZ_PROGRAMS)