linker (binutils ld) is unable to resolve weak symbol, depends on object file order

Michael Haubenwallner
Fri Jun 7 10:04:00 GMT 2019


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

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 script that does perform these commands.

-------------- next part --------------
A non-text attachment was scrubbed...
Type: application/x-shellscript
Size: 373 bytes
Desc: not available
URL: <>
-------------- next part --------------

Problem reports:
Unsubscribe info:

More information about the Cygwin mailing list