linker error with gcc flag -mfunction-return=thunk

Corinna Vinschen
Mon Jun 25 14:25:00 GMT 2018

On Jun 25 14:16, Corinna Vinschen wrote:
> On Jun 25 14:08, Michael Haubenwallner wrote:
> > Hi,
> > 
> > I'm encountering a package's configure script (openssh-7.7p1) that
> > successfully tests for the compiler flag "-mfunction-return=thunk",
> > which causes subsequent linker errors (and fails to identify zlib):
> >  relocation truncated to fit: R_X86_64_32S against `.text'
> > 
> > The compiler used is gcc-7.3.0 with binutils- (current),
> > and the easiest test case here is:
> > 
> > $ echo 'int main() { return 0; }' > conftest.c
> > $ gcc -mfunction-return=thunk conftest.c
> > /tmp/ccv1Ird0.o:conftest.c:(.text+0x1a): relocation truncated to fit: R_X86_64_32S against `.text'
> > collect2: error: ld returned 1 exit status
> > 
> > Not sure though where to finally report this problem:
> > * openssh, as they should do a link-test rather than compile-test
> > * gcc, as their generated code is wrong for cygwin
> > * binutils, as their ld is unable to link that code
> > * cygwin, as the maintainers of cygwin support in binutils+gcc
> > 
> > After all, openssh-7.7p1-1.src cygwin package currently fails to compile.
> configure with --without-hardening for the time being.

First of all, I think this needs fixing in gcc/binutils.

However, interesting problem!  I just tested this with your above
testcase and it failed, as expected.  Then I tweaked the openssh file to use OSSH_CHECK_CFLAG_LINK rather than
OSSH_CHECK_CFLAG_COMPILE and to my surprise the link stage
succeeded!  So I tried this again with the conftest.c file used
by the OpenSSH and yes, it works!

$ cat > conftest.c <<EOF
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv) {
      /* Some math to catch -ftrapv problems in the toolchain */
      int i = 123 * argc, j = 456 + argc, k = 789 - argc;
      float l = i * 2.1;
      double m = l / 0.5;
      long long int n = argc * 12345LL, o = 12345LL * (long long int)argc;
      printf("%d %d %d %f %f %lld %lld\n", i, j, k, l, m, n, o);
$ gcc -o conftest.exe -ggdb -O2 -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector-strong --param=ssp-buffer-size=4 -fdebug-prefix-map=/cygwin/src/openssh/openssh-7.7p1/openssh-7.7p1-1.x86_64/build=/usr/src/debug/openssh-7.7p1-1 -fdebug-prefix-map=/cygwin/src/openssh/openssh-7.7p1/openssh-7.7p1-1.x86_64/src/openssh-7.7p1=/usr/src/debug/openssh-7.7p1-1 -pipe -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -fno-strict-aliasing -Werror -mfunction-return=thunk conftest.c

Yes, no error.  The reason is that the code never returns due to calling
exit(0), rather than return 0.  Given that exit is a noreturn function,
the thunking doesn't take place in the testcase.

I check with OpenSSH upstream if this cqan be fixed from their side
as well somehow.


Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Maintainer                 cygwin AT cygwin DOT com
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <>

More information about the Cygwin mailing list