Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AIX: gcc upgrade requirement #925

Closed
gibfahn opened this issue Oct 19, 2017 · 40 comments
Closed

AIX: gcc upgrade requirement #925

gibfahn opened this issue Oct 19, 2017 · 40 comments
Assignees

Comments

@gibfahn
Copy link
Member

gibfahn commented Oct 19, 2017

As a result of nodejs/node#14785 and nodejs/help#784 we have discovered that a backwards incompatible change was made in libstdc++ AIX between gcc 4.8 and gcc 4.9. This means that the requirement for GCC 4.9.3 for Node 8 requires that we raise the minimum gcc/libstdc++ version for that platform. Ideally we should do this before Node 8 goes LTS, or stick with gcc 4.8.4 for 8.x.

AIX is a special case here, because it doesn't come with libstdc++ or gcc by default, so everyone running on the platform needs to install gcc in order to run Node. There are two places to get gcc versions, the AIX Toolbox and Bull Freeware. Currently the AIX toolbox only has GCC 6.3.0 available, and Bull Freeware has 7.2.0, 6.4.0, and 5.5.0 (and older minor versions).

It's worth noting at this point that gcc changed their versioning scheme after 4.9, so 4.10 became 5.0, and 4.11 became 6.0. So the gap between 4.9 and 7.0 is not as large as it seems.

Given that AIX users have to download gcc anyway, and given that they will have to update their gcc levels for this release, I think we should bump to a relatively new version (so they don't have to upgrade again for as long as possible). I'd suggest using 6.3.0, GCC 7 came out this year, so might be too new to move to.

@mhdawson
Copy link
Member

We'll need to have both the existing version of gcc (to build older node versions) as well as the newer version and figure out how to make them co-exist.

I'm +1 for going with 6.3.0

@seishun
Copy link
Contributor

seishun commented Dec 1, 2017

@gibfahn Any progress on this? Any way I can help?

We'll need to have both the existing version of gcc (to build older node versions) as well as the newer version and figure out how to make them co-exist.

Is it not possible to run node built with gcc 4.9 on AIX with gcc 4.8 installed?

@gibfahn gibfahn self-assigned this Dec 1, 2017
@gibfahn
Copy link
Member Author

gibfahn commented Dec 14, 2017

Is it not possible to run node built with gcc 4.9 on AIX with gcc 4.8 installed?

Unfortunately not, you need the right version of libstdc++.

@seawatcher2011
Copy link

I am receiving the same error on AIX 7.1 while while verifying node ibm-8.9.4.0-node-v8.9.4-aix-ppc64.bin installation. Is there now a fix for the problem? Thanks.

oracle@stpisa02sa:/opt/freeware/lib/pthread/ppc64/ [] node --version
exec(): 0509-036 Cannot load program node because of the following errors:
0509-130 Symbol resolution failed for node because:
0509-136 Symbol ZNKSt9type_infoeqERKS (number 359) is not exported from
dependent module /opt/freeware/lib/pthread/ppc64/libstdc++.a[libstdc++.so.6].
0509-192 Examine .loader section symbols with the
'dump -Tv' command.

@gibfahn
Copy link
Member Author

gibfahn commented Feb 8, 2018

@seawatcher2011 do you have gcc 4.8 installed? See nodejs/node#14785 for more info.

@seawatcher2011
Copy link

seawatcher2011 commented Feb 8, 2018

@gibfahn - no, not gcc 4.8. I have gcc 6.3.0. What is the suggestion workaround? Deinstall gcc6.3.0 and install gcc 4.8?

oracle@stpisa02sa:/opt/freeware/lib/pthread/ppc64/ []  gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/freeware/libexec/gcc/powerpc-ibm-aix7.1.0.0/6.3.0/lto-wrapper
Target: powerpc-ibm-aix7.1.0.0
Configured with: ../gcc-6.3.0/configure --prefix=/opt/freeware --mandir=/opt/freeware/man --infodir=/opt/freeware/info --with-local-prefix=/opt/freeware --with-as=/usr/bin/as --with-ld=/usr/bin/ld --enable-languages=c,c++,fortran,objc,obj-c++ --enable-version-specific-runtime-libs --disable-nls --enable-decimal-float=dpd --with-cloog=no --with-ppl=no --disable-libstdcxx-pch --enable-__cxa_atexit --host=powerpc-ibm-aix7.1.0.0
Thread model: aix
gcc version 6.3.0 (GCC)
oracle@stpisa02sa:/opt/freeware/lib/pthread/ppc64/ [] lslpp -Lq | grep c++
  libstdc++                  6.3.0-1    C     R    GNU Standard C++ Library
oracle@stpisa02sa:/opt/freeware/lib/pthread/ppc64/ []  lslpp -Lq | grep gcc
  gcc                        6.3.0-1    C     R    GNU Compiler Collection
  gcc-cpp                    6.3.0-1    C     R    The C Preprocessor (/bin/rpm)
  libgcc                     6.3.0-1    C     R    GCC version 6.3.0 shared

@gibfahn
Copy link
Member Author

gibfahn commented Feb 11, 2018

@gibfahn - no, not gcc 4.8. I have gcc 6.3.0. What is the suggestion workaround? Deinstall gcc6.3.0 and install gcc 4.8?

Unfortunately you will need 4.8. However you should be able to have them both installed side-by-side. I've heard this is possible but haven't confirmed it myself, that's in fact the point of this issue.

@gibfahn
Copy link
Member Author

gibfahn commented Apr 12, 2018

I have now managed to get this working, but there was one pain point.

On one machine I tested on I got this error persistently, implying that the LIBPATH wasn't being passed down to the g++ call.

  LD_LIBRARY_PATH=/home/gib/node/out/Release/lib.host:/home/gib/node/out/Release/lib.target:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd ../.; mkdir -p /home/gib/node/out/Release/obj/gen; python tools/js2c.py "/home/gib/node/out/Release/obj/gen/node_javascript.cc" lib/internal/bootstrap/loaders.js lib/internal/bootstrap/node.js lib/async_hooks.js lib/assert.js lib/buffer.js lib/child_process.js lib/console.js lib/constants.js lib/crypto.js lib/cluster.js lib/dgram.js lib/dns.js lib/domain.js lib/events.js lib/fs.js lib/fs/promises.js lib/http.js lib/http2.js lib/_http_agent.js lib/_http_client.js lib/_http_common.js lib/_http_incoming.js lib/_http_outgoing.js lib/_http_server.js lib/https.js lib/inspector.js lib/module.js lib/net.js lib/os.js lib/path.js lib/perf_hooks.js lib/process.js lib/punycode.js lib/querystring.js lib/readline.js lib/repl.js lib/stream.js lib/_stream_readable.js lib/_stream_writable.js lib/_stream_duplex.js lib/_stream_transform.js lib/_stream_passthrough.js lib/_stream_wrap.js lib/string_decoder.js lib/sys.js lib/timers.js lib/tls.js lib/_tls_common.js lib/_tls_wrap.js lib/tty.js lib/url.js lib/util.js lib/v8.js lib/vm.js lib/zlib.js lib/internal/async_hooks.js lib/internal/buffer.js lib/internal/cli_table.js lib/internal/child_process.js lib/internal/cluster/child.js lib/internal/cluster/master.js lib/internal/cluster/round_robin_handle.js lib/internal/cluster/shared_handle.js lib/internal/cluster/utils.js lib/internal/cluster/worker.js lib/internal/crypto/certificate.js lib/internal/crypto/cipher.js lib/internal/crypto/diffiehellman.js lib/internal/crypto/hash.js lib/internal/crypto/pbkdf2.js lib/internal/crypto/random.js lib/internal/crypto/sig.js lib/internal/crypto/util.js lib/internal/constants.js lib/internal/encoding.js lib/internal/errors.js lib/internal/freelist.js lib/internal/fs.js lib/internal/http.js lib/internal/inspector_async_hook.js lib/internal/linkedlist.js lib/internal/modules/cjs/helpers.js lib/internal/modules/cjs/loader.js lib/internal/modules/esm/loader.js lib/internal/modules/esm/create_dynamic_module.js lib/internal/modules/esm/default_resolve.js lib/internal/modules/esm/module_job.js lib/internal/modules/esm/module_map.js lib/internal/modules/esm/translators.js lib/internal/safe_globals.js lib/internal/net.js lib/internal/os.js lib/internal/process/esm_loader.js lib/internal/process/next_tick.js lib/internal/process/promises.js lib/internal/process/stdio.js lib/internal/process/warning.js lib/internal/process.js lib/internal/querystring.js lib/internal/process/write-coverage.js lib/internal/readline.js lib/internal/repl.js lib/internal/repl/await.js lib/internal/socket_list.js lib/internal/test/binding.js lib/internal/test/unicode.js lib/internal/timers.js lib/internal/tls.js lib/internal/trace_events_async_hooks.js lib/internal/tty.js lib/internal/url.js lib/internal/util.js lib/internal/util/comparisons.js lib/internal/util/inspector.js lib/internal/util/types.js lib/internal/http2/core.js lib/internal/http2/compat.js lib/internal/http2/util.js lib/internal/v8.js lib/internal/v8_prof_polyfill.js lib/internal/v8_prof_processor.js lib/internal/stream_base_commons.js lib/internal/vm/module.js lib/internal/streams/lazy_transform.js lib/internal/streams/async_iterator.js lib/internal/streams/buffer_list.js lib/internal/streams/duplexpair.js lib/internal/streams/legacy.js lib/internal/streams/destroy.js lib/internal/streams/state.js lib/internal/wrap_js_stream.js deps/v8/tools/splaytree.js deps/v8/tools/codemap.js deps/v8/tools/consarray.js deps/v8/tools/csvparser.js deps/v8/tools/profile.js deps/v8/tools/profile_view.js deps/v8/tools/logreader.js deps/v8/tools/arguments.js deps/v8/tools/tickprocessor.js deps/v8/tools/SourceMap.js deps/v8/tools/tickprocessor-driver.js deps/node-inspect/lib/_inspect.js deps/node-inspect/lib/internal/inspect_client.js deps/node-inspect/lib/internal/inspect_repl.js deps/acorn/dist/acorn.js deps/acorn/dist/walk.js ./config.gypi tools/check_macros.py src/notrace_macros.py src/noperfctr_macros.py tools/nodcheck_macros.py
  touch e54431f42526df1774c55ade864265c11db54855.intermediate
  LD_LIBRARY_PATH=/home/gib/node/out/Release/lib.host:/home/gib/node/out/Release/lib.target:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd ../deps/v8/gypfiles; mkdir -p /home/gib/node/out/Release/obj/gen/src/inspector/protocol /home/gib/node/out/Release/obj/gen/include/inspector; python ../third_party/inspector_protocol/CodeGenerator.py --jinja_dir ../third_party --output_base "/home/gib/node/out/Release/obj/gen/src/inspector" --config ../src/inspector/inspector_protocol_config.json
  /home/gib/tmp/gcc-6.3.0-1/opt/freeware/bin/g++ '-DU_COMMON_IMPLEMENTATION=1' '-DU_ATTRIBUTE_DEPRECATED=' '-D_CRT_SECURE_NO_DEPRECATE=' '-DU_STATIC_IMPLEMENTATION=1' '-DUCONFIG_NO_SERVICE=1' '-DUCONFIG_NO_REGULAR_EXPRESSIONS=1' '-DU_ENABLE_DYLOAD=0' '-DU_HAVE_STD_STRING=1' '-DUCONFIG_NO_BREAK_ITERATION=0' -I../deps/icu-small/source/common  -pthread -Wall -Wextra -Wno-unused-parameter -maix64 -Wno-deprecated-declarations -O3 -fno-omit-frame-pointer -fno-exceptions -std=gnu++1y -frtti -MMD -MF /home/gib/node/out/Release/.deps//home/gib/node/out/Release/obj.target/icuucx/deps/icu-small/source/common/appendable.o.d.raw   -c -o /home/gib/node/out/Release/obj.target/icuucx/deps/icu-small/source/common/appendable.o ../deps/icu-small/source/common/appendable.cpp
exec(): 0509-036 Cannot load program /home/gib/tmp/gcc-6.3.0-1/opt/freeware/bin/../libexec/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/cc1plus because of the following errors:
	0509-150   Dependent module /opt/freeware/lib/libmpc.a(libmpc.so.3) could not be loaded.
	0509-152   Member libmpc.so.3 is not found in archive 
gmake[1]: *** [/home/gib/node/out/Release/obj.target/icuucx/deps/icu-small/source/common/appendable.o] Error 1
gmake[1]: Leaving directory `/home/gib/node/out'
gmake: *** [node] Error 2

With @refack's help I eventually tracked this down to this mailing list discussion:
https://lists.gnu.org/archive/html/bug-make/2001-03/msg00067.html

$ ls -l `which gmake`
lrwxrwxrwx    1 root     system           27 Jul 25 2013  /usr/bin/gmake -> ../../opt/freeware/bin/make
                                                                                 
$ ls -l /opt/freeware/bin/make
-rwxr-sr-x    1 root     system       280288 Sep 22 2011  /opt/freeware/bin/make

Running sudo chmod 755 /opt/freeware/bin/make did indeed resolve the issue.

The setuid bit is not set in the test or release machines (although it was on the machine I was using to test).

@gibfahn
Copy link
Member Author

gibfahn commented Apr 13, 2018

@seawatcher2011 your mileage may vary, but what worked for me is to extract the contents of the libstdc++ rpm into a directory, then set the LIBPATH to point to that directory.

I used rpm2cpio to extract the rpm, which isn't available on AIX (I got it from a RHEL box, but I think it's available on Ubuntu).

So first you need to download the rpm from wherever you got gcc from, either AIX Toolbox or Bull Freeware. Either should work, but you can't mix and match.

AIX Toolbox: ftp://public.dhe.ibm.com/aix/freeSoftware/aixtoolbox/RPMS/ppc-6.1/gcc/libstdcplusplus-4.8.5-1.aix6.1.ppc.rpm
Bull Freeware: I can't get a direct link, but for AIX 6.1 the file is libstdc++-4.8.4-6.aix6.1.ppc.rpm

You extract the file (on a different machine) with:

rpm2cpio libstdcplusplus-4.8.5-1.aix6.1.ppc.rpm | cpio -idmv

Then zip it up and scp it to the machine. Unzip it, and then add the opt/freeware/lib/pthread/ppc64 subdirectory to your LIBPATH

export LIBPATH="$PWD/opt/freeware/lib/pthread/ppc64:$LIBPATH"

You should then be able to do ldd ./node and ./node and it should all work.

Note that Node 10 is expected to be built with gcc 6.3, so you won't need this workaround once you upgrade to that version.

For info, the reason this is necessary is because there was a breaking change in libstdc++ on AIX between gcc 4.8 and 4.9.

Let me know if it works!

@gibfahn
Copy link
Member Author

gibfahn commented Apr 13, 2018

I have generated a zip file containing gcc and dependencies, by downloading the zip from Bull Freeware. For some reason the dependency resolver on Bull Freeware downloaded the wrong version of libstdc++ (7.1 instead of 6.1) so I had to manually fix up the with-deps zip.

#!/bin/bash -ex

# Builds a zip file containing gcc and dependencies, installed from Bull Freeware rpms.


rm -rf rpms gcc-6.3.0-1
rm -f gcc-6.3.0-1.zip
mkdir rpms gcc-6.3.0-1

cp gcc-c++-6.3.0-1.aix6.1.ppc.rpm-with-deps.zip rpms
(cd rpms && unzip gcc-c++-6.3.0-1.aix6.1.ppc.rpm-with-deps.zip)

for rpm in rpms/*.rpm; do
  (cd gcc-6.3.0-1 && rpm2cpio ../$rpm | cpio -idmv)
done

zip -r gcc-6.3.0-1.zip gcc-6.3.0-1/

Once you have the zip on the system, it's just a matter of unzipping it somewhere, and then setting up the paths correctly, so:

# Setting the LIBPATH doesn't seem to be necessary.
# export LIBPATH="$PWD/gcc-6.3.0-1/opt/freeware/lib/pthread/ppc64:$PWD/gcc-6.3.0-1/opt/freeware/lib"
export PATH="$PWD/gcc-6.3.0-1/opt/freeware/bin:$PATH"
cd ~/node
export CC=`which gcc` CXX=`which g++` CXX_host=`which g++`
./configure --dest-cpu=ppc64 && gmake -j4

The version I generated is stored at https://ci.nodejs.org/downloads/aix/ (see #871 (comment)), there's a zip and an md5sum for checking that everything downloads correctly.

@gibfahn
Copy link
Member Author

gibfahn commented Apr 13, 2018

I also ran with C++ 14 enabled to make sure that worked, by applying this diff:

diff --git a/common.gypi b/common.gypi
index 6d83d8a..dcbb2a0 100644
--- a/common.gypi
+++ b/common.gypi
@@ -321,7 +321,7 @@
       }],
       [ 'OS in "linux freebsd openbsd solaris android aix cloudabi"', {
         'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', ],
-        'cflags_cc': [ '-fno-rtti', '-fno-exceptions', '-std=gnu++1y' ],
+        'cflags_cc': [ '-fno-rtti', '-fno-exceptions', '-std=gnu++14' ],
         'ldflags': [ '-rdynamic' ],
         'target_conditions': [
           # The 1990s toolchain on SmartOS can't handle thin archives.

@seishun
Copy link
Contributor

seishun commented Apr 13, 2018

'-std=gnu++1y' and '-std=gnu++14' are synonyms.

@gibfahn
Copy link
Member Author

gibfahn commented Apr 13, 2018

'-std=gnu++1y' and '-std=gnu++14' are synonyms.

Ahh, so how would I enable gcc 14 features (to check that it works)? I want to get something that fails on 4.8.4 and passes on 6.3.0.

@seishun
Copy link
Contributor

seishun commented Apr 13, 2018

You could try to build this PR: nodejs/node#13676

@mhdawson
Copy link
Member

Other platforms seem to need to export LDFLAGS, sounds like that is not required on AIX for your testing?

@mhdawson
Copy link
Member

Seems to fail on community machine with:

compiler set to 6.3
+ gmake run-ci -j 5
+ NODE_TEST_DIR=/home/iojs/node-tmp PYTHON=python FLAKY_TESTS=dontcare CONFIG_FLAGS= --dest-cpu=ppc64
python ./configure  --dest-cpu=ppc64
exec(): 0509-036 Cannot load program /home/iojs/gcc-6.3.0-1/opt/freeware/bin/../libexec/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/cc1plus because of the following errors:
	0509-150   Dependent module /opt/freeware/lib/libmpc.a(libmpc.so.3) could not be loaded.
	0509-152   Member libmpc.so.3 is not found in archive 
exec(): 0509-036 Cannot load program /home/iojs/gcc-6.3.0-1/opt/freeware/bin/../libexec/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/cc1 because of the following errors:
	0509-150   Dependent module /opt/freeware/lib/libmpc.a(libmpc.so.3) could not be loaded.
	0509-152   Member libmpc.so.3 is not found in archive 
WARNING: C++ compiler too old, need g++ 4.9.4 or clang++ 3.4.2 (CXX=ccache /home/iojs/gcc-6.3.0-1/opt/freeware/bin/g++)
WARNING: C compiler too old, need gcc 4.2 or clang 3.2 (CC=ccache /home/iojs/gcc-6.3.0-1/opt/freeware/bin/gcc)

Will try to set LIBPATH

@mhdawson
Copy link
Member

LIBPATH does not seem to help and just causes other problems.

@mhdawson
Copy link
Member

Despite it not looking like the bit was set on the test machine, this was still required:

sudo chmod 755 /opt/freeware/bin/make

@mhdawson
Copy link
Member

mhdawson commented Apr 13, 2018

That seems to start building(That was incorrect, was running with old compiler, fails locally as well) when run locally through the console,but still fails when run through the CI with:

python ./configure  --dest-cpu=ppc64
exec(): 0509-036 Cannot load program /home/iojs/gcc-6.3.0-1/opt/freeware/bin/../libexec/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/cc1plus because of the following errors:
	0509-150   Dependent module /opt/freeware/lib/libmpc.a(libmpc.so.3) could not be loaded.
	0509-152   Member libmpc.so.3 is not found in archive 
exec(): 0509-036 Cannot load program /home/iojs/gcc-6.3.0-1/opt/freeware/bin/../libexec/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/cc1 because of the following errors:
	0509-150   Dependent module /opt/freeware/lib/libmpc.a(libmpc.so.3) could not be loaded.
	0509-152   Member libmpc.so.3 is not found in archive 

@refack
Copy link
Contributor

refack commented Apr 13, 2018

@mhdawson watch out for the following in the Jenkins config...
image

BTW: I've found that the following enables building (and apparently the order in important):

export LIBPATH=/opt/freeware/lib:/home/iojs/gcc-6.3.0-1/opt/freeware/lib

@mhdawson
Copy link
Member

@refack Thanks ! trying that now.

@mhdawson
Copy link
Member

Still failing in CI

Setting compiler for Node version 10 on AIX
+ [ 10 -gt 9 ]
+ export LIBPATH=/opt/freeware/lib:/home/iojs/gcc-6.3.0-1/opt/freeware/lib
+ export PATH=/home/iojs/gcc-6.3.0-1/opt/freeware/bin:/opt/freeware/bin/ccache:/home/iojs/jdk8/jre/bin:/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java6/jre/bin:/usr/java6/bin
+ which gcc
+ which g++
+ which g++
+ export CC=ccache /home/iojs/gcc-6.3.0-1/opt/freeware/bin/gcc CXX=ccache /home/iojs/gcc-6.3.0-1/opt/freeware/bin/g++ CXX_host=ccache /home/iojs/gcc-6.3.0-1/opt/freeware/bin/g++
+ echo Compiler set to 6.3
Compiler set to 6.3
+ gmake run-ci -j 5
+ NODE_TEST_DIR=/home/iojs/node-tmp PYTHON=python FLAKY_TESTS=dontcare CONFIG_FLAGS= --dest-cpu=ppc64
python ./configure  --dest-cpu=ppc64
exec(): 0509-036 Cannot load program /home/iojs/gcc-6.3.0-1/opt/freeware/bin/../libexec/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/cc1plus because of the following errors:
	0509-150   Dependent module /opt/freeware/lib/libmpc.a(libmpc.so.3) could not be loaded.
	0509-152   Member libmpc.so.3 is not found in archive 
exec(): 0509-036 Cannot load program /home/iojs/gcc-6.3.0-1/opt/freeware/bin/../libexec/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/cc1 because of the following errors:
	0509-150   Dependent module /opt/freeware/lib/libmpc.a(libmpc.so.3) could not be loaded.
	0509-152   Member libmpc.so.3 is not found in archive 
WARNING: C++ compiler too old, need g++ 4.9.4 or clang++ 3.4.2 (CXX=ccache /home/iojs/gcc-6.3.0-1/opt/freeware/bin/g++)
WARNING: C compiler too old, need gcc 4.2 or clang 3.2 (CC=ccache /home/iojs/gcc-6.3.0-1/opt/freeware/bin/gcc)

probably unrelated but the compiler detection is also failing:

WARNING: C++ compiler too old, need g++ 4.9.4 or clang++ 3.4.2 (CXX=ccache /home/iojs/gcc-6.3.0-1/opt/freeware/bin/g++)
WARNING: C compiler too old, need gcc 4.2 or clang 3.2 (CC=ccache /home/iojs/gcc-6.3.0-1/opt/freeware/bin/gcc)

@refack
Copy link
Contributor

refack commented Apr 13, 2018

So it's more delicate:
GCC need LIBPATH to be export LIBPATH=/home/iojs/gcc-6.3.0-1/opt/freeware/lib:/opt/freeware/lib

-bash-4.3$ export LIBPATH=/home/iojs/gcc-6.3.0-1/opt/freeware/lib:/opt/freeware/lib
-bash-4.3$ ./configure --dest-cpu=ppc64
WARNING: openssl_no_asm is enabled due to missed or old assembler.
            Please refer BUILDING.md
creating icu_config.gypi
* Using ICU in deps/icu-small
creating icu_config.gypi

gmake need it the other way:

-bash-4.3$ gmake
exec(): 0509-036 Cannot load program gmake because of the following errors:
        0509-022 Cannot load module /opt/freeware/lib/libintl.a(libintl.so.1).
        0509-150   Dependent module /home/iojs/gcc-6.3.0-1/opt/freeware/lib/libiconv.a(shr4.o) could not be loaded.
        0509-152   Member shr4.o is not found in archive
        0509-022 Cannot load module make.
        0509-150   Dependent module /opt/freeware/lib/libintl.a(libintl.so.1) could not be loaded.
        0509-022 Cannot load module .
-bash-4.3$ export LIBPATH=/opt/freeware/lib:/home/iojs/gcc-6.3.0-1/opt/freeware/lib
-bash-4.3$ gmake
gmake -C out BUILDTYPE=Release V=1
gmake[1]: Entering directory `/home/iojs/build/workspace/node-test-commit-aix/nodes/aix61-ppc64/out'
node.target.mk:13: warning: overriding recipe for target `/home/iojs/build/workspace/node-test-commit-aix/nodes/aix61-ppc64/out/Release/node.exp'
cctest.target.mk:13: warning: ignoring old recipe for target `/home/iojs/build/workspace/node-test-commit-aix/nodes/aix61-ppc64/out/Release/node.exp'
♥gmake: *** [node] Interrupt

@mhdawson
Copy link
Member

Looks to me that there is a circular issue, gmake requires LIBPATH in particular order and CC in a different order:

bash-4.3$ sh doit.sh
exec(): 0509-036 Cannot load program gmake because of the following errors:
        0509-022 Cannot load module /opt/freeware/lib/libintl.a(libintl.so.1).
        0509-150   Dependent module /home/iojs/gcc-6.3.0-1/opt/freeware/lib/libiconv.a(shr4.o) could not be loaded.
        0509-152   Member shr4.o is not found in archive 
        0509-022 Cannot load module make.
        0509-150   Dependent module /opt/freeware/lib/libintl.a(libintl.so.1) could not be loaded.
        0509-022 Cannot load module .
bash-4.3$ export LIBPATH=/opt/freeware/lib/home/iojs/gcc-6.3.0-1/opt/freeware/lib                        
bash-4.3$ export LIBPATH=/opt/freeware/lib:/opt/freeware/lib/home/iojs/gcc-6.3.0-1/opt/freeware/lib
bash-4.3$ sh doit.sh
python ./configure --dest-cpu=ppc64
exec(): 0509-036 Cannot load program /home/iojs/gcc-6.3.0-1/opt/freeware/bin/../libexec/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/cc1plus because of the following errors:
        0509-150   Dependent module /opt/freeware/lib/libmpc.a(libmpc.so.3) could not be loaded.
        0509-152   Member libmpc.so.3 is not found in archive 
Traceback (most recent call last):
  File "./configure", line 1472, in <module>
    check_compiler(output)
  File "./configure", line 716, in check_compiler
    ok, is_clang, clang_version, gcc_version = try_check_compiler(CXX, 'c++')
  File "./configure", line 615, in try_check_compiler
    proc.stdin.write('__clang__ __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ '
IOError: [Errno 32] Broken pipe
gmake: *** [build-ci] Error 1

@mhdawson
Copy link
Member

mhdawson commented Apr 13, 2018

Ok, ignore the previous comment. I see that I have at least one of the paths wrong
trying again.

@mhdawson
Copy link
Member

Or maybe I had things right after all as @refack just said the same thing.

@mhdawson
Copy link
Member

Tried taking the gmake from one of our internal machines that might have worked with @gibfahn tests. And tried it on the CI machine, still fails with the same problem :(

The message was only slightly different:

bash-4.3$ export LIBPATH=/home/iojs/gcc-6.3.0-1/opt/freeware/lib
-bash-4.3$ gmake
exec(): 0509-036 Cannot load program gmake because of the following errors:
        0509-022 Cannot load module /opt/freeware/lib/libintl.a(libintl.so.8).
        0509-150   Dependent module /home/iojs/gcc-6.3.0-1/opt/freeware/lib/libiconv.a(shr4_64.o) could not be loaded.
        0509-152   Member shr4_64.o is not found in archive 
        0509-022 Cannot load module gmake.
        0509-150   Dependent module /opt/freeware/lib/libintl.a(libintl.so.8) could not be loaded.
        0509-022 Cannot load module .
-bash-4.3$ 
```1
with the difference being libintl.so.8 instead of libintl.so.1

@gibfahn
Copy link
Member Author

gibfahn commented Apr 14, 2018

Tried taking the gmake from one of our internal machines that might have worked with @gibfahn tests. And tried it on the CI machine, still fails with the same problem :(

Assuming you're talking about dal-pax, then it worked fine (feel free to test on that machine). Given that they're both AIX 6 boxes with Bull Freeware rpms and gcc 4.8 (I didn't update any of the packages on that machine) it should be pretty simple to work out what the difference between them is.

@mhdawson
Copy link
Member

I finally found something that works. Still want to get some feedback from the internal AIX team to see if it makes sense.

The environment is set as follows:

 export LIBPATH=/home/iojs/gmake/opt/freeware/lib:/home/iojs/gcc-6.3.0-1/opt/freeware/lib
 export PATH="/home/iojs/gcc-6.3.0-1/opt/freeware/bin:$PATH"
 export CC="ccache `which gcc`" CXX="ccache `which g++`" CXX_host="ccache `which g++`"

with the difference from before being the addition of /home/iojs/gmake/opt/freeware/lib where I've copied the libiconv.a from the local system. The net is that we use the libiconv.a that gmake needs as opposed to the one that comes from the bundle build for gcc.

Have tested from command line, next is to see if it works from the CI.

@mhdawson
Copy link
Member

@gibfahn
Copy link
Member Author

gibfahn commented Apr 17, 2018

The net is that we use the libiconv.a that gmake needs as opposed to the one that comes from the bundle build for gcc.

Do you know why the gmake on the test machines is different to the one on dal-pax?

@mhdawson
Copy link
Member

No idea and in fact even copying over the gmake to the community machine did not help as I tried that first. It is different though based on the output from dump -H

@BethGriggs
Copy link
Member

BethGriggs commented Apr 19, 2018

@gibfahn, dal-pax is 6100-07, IIRC the community CI AIX machines (https://ci.nodejs.org/label/aix61-ppc64/) are both 6100-09. Maybe that is why we're seeing differences?

@mhdawson
Copy link
Member

The upgrade has now been rolled out to test and release machines. Things seem to be building ok.
Have a suggestion from AIX team on how to improve the config, will do that but likely after 10.x goes out.

mhdawson added a commit to mhdawson/io.js that referenced this issue Apr 19, 2018
Compilers were updated for 10.X as per
discussion in: nodejs/build#925
mhdawson added a commit to nodejs/node that referenced this issue Apr 19, 2018
Compilers were updated for 10.X as per
discussion in: nodejs/build#925

PR-URL: #20153
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com>
jasnell pushed a commit to nodejs/node that referenced this issue Apr 19, 2018
Compilers were updated for 10.X as per
discussion in: nodejs/build#925

PR-URL: #20153
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com>
@mhdawson
Copy link
Member

mhdawson commented May 10, 2018

We ran into one more problem. Turns out there were a few non-relative symbolic links and the process documented above resulted in those being missing in the deployed compilers.

We've talked to the AIX teams about fixing them so they are relative and have fixed up the links on the community machines with:

cp opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/libatomic.a opt/freeware/li
b/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/ppc64/libatomic.a
cp opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/libgcc_s.a opt/freeware/lib
/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/ppc64/libgcc_s.a
cp opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/libstdc++.a opt/freeware/li
b/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/ppc64/libstdc++.a
cp opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/libsupc++.a opt/freeware/li
b/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/ppc64/libsupc++.a

cp opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/pthread/libatomic.a opt/fre
eware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/pthread/ppc64/libatomic.a
cp opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/pthread/libgcc_s.a opt/free
ware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/pthread/ppc64/libgcc_s.a
cp opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/pthread/libstdc++.a opt/fre
eware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/pthread/ppc64/libstdc++.a
cp opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/pthread/libsupc++.a opt/fre
eware/lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/pthread/ppc64/libsupc++.a

cp opt/freeware/lib/libmpc.a opt/freeware/lib64/libmpc.a
cp opt/freeware/lib/libxml2.a opt/freeware/lib64/libxml2.a
cp opt/freeware/lib/libz.a opt/freeware/lib64/libz.a

The updated fixed binary is in the downloads directory on the ci machine as: V2-gcc-6.3.0-1.tar.gz

The next step is to update the manual install steps for AIX.

@Trott
Copy link
Member

Trott commented Apr 25, 2019

This is almost a year inactive at this point. Is it still a thing or has this been addressed and can be closed? @mhdawson @nodejs/platform-aix

@sam-github
Copy link
Contributor

I think its still a thing. I've notes somewhere, I think we are still working on it, slowly. I'll check with @mhdawson again when he's back from vacation.

@mhdawson
Copy link
Member

The remaining stuff I think is to update the manual install steps for AIX and then it can be closed.

@AshCripps
Copy link
Member

@mhdawson is this the updated install steps you mentioned - https://github.com/nodejs/help/wiki/Installation#how-to-install-nodejs-via-binary-archive-on-aix.

If so, can this issue be closed?

@mhdawson
Copy link
Member

I'm ok with closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

10 participants