Hi, so I'm encountering a strange problem related to object file order passed to the linker, with any binutils and gcc version available to setup-x86_64.exe: $ cat weak-func.c extern void weakfunc() __attribute__((weak)); void weakfunc() {} $ cat weak-main.c extern void weakfunc() __attribute__((weak)); int main() { weakfunc(); } $ gcc -o weak.exe weak-func.c weak-main.c SUCCESS But then, changing the order of input files on the command line does break (does work on Linux of course): $ gcc -o weak.exe weak-main.c weak-func.c /usr/lib/gcc/x86_64-pc-cygwin/8.3.0/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccIthYHe.o:weak-main.c:(.text+0xe): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `weakfunc' collect2: error: ld returned 1 exit status So the difference is that the object providing weakfunc is passed to the linker after the object requiring weakfunc. Attached is the weak-func.sh script that does perform these commands. Thanks! /haubi/