Bug 2315 - OpenSSH 6.7p1 on AIX 7.1 compile issue
Summary: OpenSSH 6.7p1 on AIX 7.1 compile issue
Status: CLOSED FIXED
Alias: None
Product: Portable OpenSSH
Classification: Unclassified
Component: Build system (show other bugs)
Version: 6.7p1
Hardware: PPC AIX
: P5 normal
Assignee: Assigned to nobody
URL:
Keywords:
Depends on:
Blocks: V_6_9 V_7_2
  Show dependency treegraph
 
Reported: 2014-11-15 08:26 AEDT by Yannick Bergeron
Modified: 2016-08-02 10:42 AEST (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Yannick Bergeron 2014-11-15 08:26:36 AEDT
Hi,

I'm trying to compile OpenSSH 6.7p1 on AIX 7.1 TL2 SP3 with IBM XL C/C++ 12.1.0.9, OpenSSL 1.0.1j and zlib 1.2.8
This is my compile procedure:
export PATH=$PATH:/usr/vac/bin
/usr/bin/gzip -cd openssh-6.7p1.tar.gz |/usr/bin/tar xf -
cd openssh-6.7p1
./configure --prefix=/usr/local/openssh-6.7p1 --sysconfdir=/etc/ssh --without-shadow --with-ssl-dir=/usr/local/openssl --with-zlib=/usr/local/zlib
/usr/bin/make

And I get the following error:
cc -qlanglvl=extc89 -o ssh ssh.o readconf.o clientloop.o sshtty.o  sshconnect.o sshconnect1.o sshconnect2.o mux.o  roaming_common.o roaming_client.o -L. -Lopenbsd-compat/ -L/usr/local/openssl/lib -L/usr/local/zlib/lib  -blibpath:/usr/lib:/lib -lssh -lopenbsd-compat  -lcrypto -lz  
ld: 0711-317 ERROR: Undefined symbol: .va_copy
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
make: 1254-004 The error code from the last command is 8.

Same error on AIX 5.3 TL12 SP9 with IBM XL C/C++ 11.1.0.19 and AIX 6.1 TL8 SP3 with IBM XL C/C++ 10.1.0.20
I was able to compile OpenSSH 6.6p1 with OpenSSL 1.0.1i and zlib 1.2.8 with this procedure without issue.

I've found that by adding this in sshbuf-getput-basic.c and by replacing every occurence of va_copy by VA_COPY, I'm now able to compile it.
#ifndef VA_COPY
# ifdef HAVE_VA_COPY
#  define VA_COPY(dest, src) va_copy(dest, src)
# else
#  ifdef HAVE___VA_COPY
#   define VA_COPY(dest, src) __va_copy(dest, src)
#  else
#   define VA_COPY(dest, src) (dest) = (src)
#  endif
# endif
#endif


This fix/workaround is inspired by openbsd-compat/bsd-snprintf.c
Do you believe it would be the right fix to apply?
If so, could it be done in master so that next release include it?
If it's not the right fix, anyone willing to look at this issue and suggest another fix?


Best regards,

Yannick Bergeron
Comment 1 Michael Felt 2015-03-02 06:34:03 AEDT
The much easier way is to set CC=xlc before running configure.

By default cc is much closer to c89 (or even pre-c89?) whereas xlc is much closer to c99.

The key difference, as far as va_copy is concerned is that xlc and it's derivatives redefine va_copy into a builtin function.

Test program: va_copy_test.c:
===
#include <stdarg.h>

/*
 * test va_copy changes by changing XL C compiler name (cc, c89, c99, xlc)
 * and the -E flag
 */

va_copy_test(void *a, void *b)
{

#ifdef _ANSI_C_SOURCE
#ifdef _ISOC99_SOURCE
        va_copy(a,b);
#else
        fake_ansi_copy(a,b);
#endif
#endif
#ifndef _ANSI_C_SOURCE
        fake_noansi_copy(a,b);
#endif
}
===
CC=cc
root@x064:[/data/prj/openbsd/openssh]cc -E va_copy_test.c
#line 62 "/usr/include/va_list.h"
typedef char *va_list;
#line 8 "va_copy_test.c"
va_copy_test(void *a, void *b)
{
#line 13
        va_copy(a,b);
#line 21
}
CC=c89
root@x064:[/data/prj/openbsd/openssh]c89 -E va_copy_test.c
#line 62 "/usr/include/va_list.h"
typedef char *va_list;
#line 8 "va_copy_test.c"
va_copy_test(void *a, void *b)
{
#line 15
        fake_ansi_copy(a,b);
#line 21
}
CC=c99
root@x064:[/data/prj/openbsd/openssh]c99 -E va_copy_test.c
#line 62 "/usr/include/va_list.h"
typedef char *va_list;
#line 8 "va_copy_test.c"
va_copy_test(void *a, void *b)
{
#line 13
        __builtin_va_copy(a,b);
#line 21
}
CC=xlc
root@x064:[/data/prj/openbsd/openssh]xlc -E va_copy_test.c
#line 62 "/usr/include/va_list.h"
typedef char *va_list;
#line 8 "va_copy_test.c"
va_copy_test(void *a, void *b)
{
#line 13
        __builtin_va_copy(a,b);
#line 21
}

Although c99 and xlc give the same results - for this - my preference is to use xlc. Review /etc/vac.cfg.?? and compare c99 with xlc and make your choice. Saves you a lot of code changes!
Comment 2 Darren Tucker 2015-04-15 16:32:44 AEST
At to list to look at for 6.9p1
Comment 3 Damien Miller 2015-06-05 13:55:22 AEST
Does this still need fixing? Darren committed this last year:

Author: Darren Tucker <dtucker@zip.com.au>
Date:   Thu Jun 12 05:22:49 2014 +1000

     - (dtucker) [defines.h] Add va_copy if we don't already have it, taken from
       openbsd-compat/bsd-asprintf.c

--- a/defines.h
+++ b/defines.h
...
+#ifndef HAVE_VA_COPY
+# ifdef HAVE___VA_COPY
+#  define va_copy(dest, src) __va_copy(dest, src)
+# else
+#  define va_copy(dest, src) (dest) = (src)
+# endif
+#endif
Comment 4 Michael Felt 2015-06-07 07:02:02 AEST
No, not a bug imho - just use the right compiler option - either c99 or xlc.

The key differences in what the different compiler options are - when started by a different can be found in /etc/vac.cfg.NN where NN is 53, 61, or 71 depending your current version of AIX.

For your convenience the key differences are the default options triggered:

* -qlanglvl=extc99 C compiler with common extensions, UNIX headers
xlc:    use        = DEFLT_C
	crt        = /lib/crt0.o
	mcrt       = /lib/mcrt0.o
	gcrt       = /lib/gcrt0.o
        libraries  = -L/usr/vac/lib,-lxlopt,-lxlipa,-lxl,-lc
        proflibs   = -L/lib/profiled,-L/usr/lib/profiled
        options    = -qlanglvl=extc99,-qcpluscmt,-qkeyword=inline,-qalias=ansi

* C compiler, extended mode
cc:     use        = DEFLT_C
	crt        = /lib/crt0.o
	mcrt       = /lib/mcrt0.o
	gcrt       = /lib/gcrt0.o
        libraries  = -L/usr/vac/lib,-lxlopt,-lxlipa,-lxl,-lc
        proflibs   = -L/lib/profiled,-L/usr/lib/profiled
        options    = -qlanglvl=extended,-qnoro,-qnoroconst

* Strict ANSI compiler, ANSI headers
c89:    use        = DEFLT_C
	crt        = /lib/crt0.o
	mcrt       = /lib/mcrt0.o
	gcrt       = /lib/gcrt0.o
        libraries  = -L/usr/vac/lib,-lxlopt,-lxlipa,-lxl,-lc
        proflibs   = -L/lib/profiled,-L/usr/lib/profiled
        options    = -D_ANSI_C_SOURCE,-qalias=ansi,-qnolonglong,-qstrict_induction

* Strict ANSI compiler, ANSI headers
c99:    use        = DEFLT_C
	crt        = /lib/crt0.o
	mcrt       = /lib/mcrt0.o
	gcrt       = /lib/gcrt0.o
        libraries  = -L/usr/vac/lib,-lxlopt,-lxlipa,-lxl,-lc
        proflibs   = -L/lib/profiled,-L/usr/lib/profiled
        options    = -qlanglvl=stdc99,-D_ANSI_C_SOURCE,-D_ISOC99_SOURCE,-qalias=ansi,-qstrict_induction

If you wanted to be nice you could default cc=xlc (my recommendation) when running ./configure on AIX rather than cc when CC is not defined as an environment variable. This assumes gcc is also not available.

From my examples above showing the result of different ${CC} results both c99 and xlc do va_copy as a built-in - no external reference needed. No new define needed either.

Michael
Comment 5 Damien Miller 2015-08-12 11:00:46 AEST
Move unfinished bugs from 6.9 (how did I miss these?) to 7.1
Comment 6 Darren Tucker 2016-02-26 14:41:45 AEDT
I've added comment to README.platform with this.  I would consider applying a diff to select xlc where $CC is not set however I do not have access to a system with xlc to test it myself.
Comment 7 Damien Miller 2016-08-02 10:42:56 AEST
Close all resolved bugs after 7.3p1 release