Hello all,

the conda packages from conda-forge use gcc and libstdc++ 7.3, i.e. are a major 
version newer than the ones that come with Matlab. Thus the missing symbols and 
the need for LD_PRELOAD. As long as Matlab is using an older version of 
gcc/libstdc++, the missing symbols will continue to pop up. Thanks to symbol 
versioning in libstdc++ it should be save though to preload a newer libstdc++.

Uwe

On Wed, Mar 13, 2019, at 11:35 AM, Hatem Helal wrote:
> Hi Joris,
> 
> Nice to hear from you! I'd like the understand the need to use 
> LD_PRELOAD for picking up a different libstdc++.   In case haven't 
> found this already, MATLAB even vendors a libstdc++ as per:
> 
> (pwd = matlabroot)
> % more sys/os/glnxa64/README.libstdc++
> 
> The GCC runtime libraries included here:
> 
>     libstdc++.so.6.0.22 libgcc_s.so.1 libgfortran.so.3.0.0 
> libquadmath.so.0.0.0
> 
> and associated symlinks are part of gcc-6.3.0,
> available from ftp.gnu.org.  They are included with MATLAB
> in the event that your distribution does not provide them.
> 
> This corresponds to the toolchain we use to compile MATLAB as well as 
> the supported compiler for MEX.  
> 
> Could you share with us the details of your compiler / system?  I think 
> if you use gcc 6.3 for building both gsa-arrow-cpp and arrow-matlab we 
> might be able to eliminate the LD_PRELOAD, which I think should be 
> nicer for your end-users.  What was the error you saw without 
> LD_PRELOAD?
> 
> Hatem
> 
> On 13/03/2019, 09:59, "Joris Peeters" <joris.mg.peet...@gmail.com> wrote:
> 
>     Hello Uwe,
>     
>     Yes, it would appear that was the case. Aggregating yours and Wes'
>     suggestions, I'm now:
>     
>     - Compiling arrow-cpp myself, explicitly with the new ABI, and publishing
>     this on our internal conda channel (as gsa-arrow-cpp, so it can be
>     explicitly depended upon). Did this by tweaking
>     https://github.com/conda-forge/arrow-cpp-feedstock/tree/master/recipe a
>     little bit.
>     - Compiling arrow-matlab (which has fromArrowStream and fromArrowFile) 
> also
>     explicitly with the new ABI, depending on the aforementioned gsa-arrow-cpp
>     - Launch MATLAB with an explicit LD_PRELOAD for a sufficiently modern
>     libstdc++ (also from Anaconda)
>     
>     And now it all works fine!
>     I'm not sure if this is the most elegant solution - it does feel a bit
>     awkward - but it does allow us to make progress.
>     
>     Thanks,
>     -J
>     
>     On Tue, Mar 12, 2019 at 8:49 PM Uwe L. Korn <uw...@xhochy.com> wrote:
>     
>     > Hello Joris,
>     >
>     >
>     > 
> '/data/home/jpeeter/apps/anaconda3/envs/testarrow/lib/fromArrowStream.mexa64':
>     >
>     > 
> /data/home/jpeeter/apps/anaconda3/envs/testarrow/lib/fromArrowStream.mexa64:
>     > undefined symbol: _ZNK5arrow6Status8ToStringEv.
>     >
>     > sounds like fromArrowStream.mexa64 was still compiled using
>     > -D_GLIBCXX_USE_CXX11_ABI=0, you might try to explicitly pass
>     > -D_GLIBCXX_USE_CXX11_ABI=1 or when building an conda environment, 
> be sure
>     > to have the compilers package installed and use the $CC and $CXX
>     > environment variables to pick the right compilers. You may also 
> need to
>     > LD_PRELOAD the libstdc++.so that is coming with conda and not the 
> one
>     > coming from the system.
>     >
>     > Anaconda/defaults and conda-forge based Arrow packages are both 
> nowadays
>     > built with the new ABI. But they are built with slightly different
>     > toolchains, so it is best to only install packages from one of 
> the two
>     > repositories and don't mix them.
>     >
>     > Uwe
>     >
>     >
>     > On Tue, Mar 12, 2019, at 5:32 PM, Wes McKinney wrote:
>     > > hi Joris,
>     > >
>     > > You probably ran into the conda-forge compiler migration. I'm 
> not sure
>     > > about Anaconda's Apache Arrow libraries since they maintain 
> those
>     > > recipes.
>     > >
>     > > If you need shared libaries using the gcc 4.x ABI you may have 
> to
>     > > build them yourself right, or use the Linux packages for the 
> platform
>     > > where you are working. It would be useful to have a Dockerfile 
> that
>     > > produces "portable" shared libraries with the RedHat 
> devtoolset-2
>     > > compiler
>     > >
>     > > - Wes
>     > >
>     > > On Tue, Mar 12, 2019 at 11:22 AM Joris Peeters
>     > > <joris.mg.peet...@gmail.com> wrote:
>     > > >
>     > > > [A] Short background:
>     > > >
>     > > > We are working on a MEX library that converts a binary array
>     > (representing
>     > > > an Arrow stream or file) into MATLAB structs. This is in
>     > > > parallel/complement to what already exists in the main Arrow 
> project,
>     > which
>     > > > focuses on feather, but the hope is certainly to contribute 
> back some
>     > of
>     > > > this work. We talked to MathWorks about this already (as GSA 
> Capital).
>     > > >
>     > > > The library (e.g. fromArrowStream.mexa64) gets published on
>     > > > (company-internal) Anaconda, and upon installation the 
> dependencies on
>     > > > arrow-cpp, boost-cpp etc are resolved (from remote channels). 
> All
>     > .so's end
>     > > > up in a user-local conda environment's ../lib, which in 
> MATLAB we make
>     > > > available through addpath. Compilation uses
>     > -D_GLIBCXX_USE_CXX11_ABI=0.
>     > > >
>     > > > [B] The issue I'm facing ...
>     > > >
>     > > > For quite a while (when we depended on arrow-cpp=0.10 from 
> conda-forge)
>     > > > this has worked fine, but lately I've encountered increasing 
> issues
>     > wrt ABI
>     > > > compatibility, amongst arrow, gtest (both at build time) and 
> MATLAB (at
>     > > > run-time).
>     > > >
>     > > > Is arrow-cpp 0.11 only built with the new ABI? I loaded it 
> from both
>     > > > defaults and conda-forge channel, and it seems different in 
> this regard
>     > > > than conda-forge's 0.10. Either way, I'm now attempting to 
> built my
>     > library
>     > > > without the -D_GLIBCXX_USE_CXX11_ABI=0 compile flag, as that 
> seems to
>     > be
>     > > > the more sustainable way forward.
>     > > >
>     > > > Question: is it possible to load a MEX library that has been 
> compiled
>     > with
>     > > > the new ABI? When doing this naively, I get an error like:
>     > > >
>     > > > Invalid MEX-file
>     > > >
>     > 
> '/data/home/jpeeter/apps/anaconda3/envs/testarrow/lib/fromArrowStream.mexa64':
>     > > >
>     > 
> /data/home/jpeeter/apps/matlab/MATLAB/R2018a/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6:
>     > > > version `CXXABI_1.3.11' not found (required by
>     > > > 
> /data/home/jpeeter/apps/anaconda3/envs/testarrow/lib/libarrow.so.11).
>     > > >
>     > > > which is fair enough.
>     > > >
>     > > > Alternatively, though, when loading MATLAB with an 
> LD_PRELOAD, like
>     > > > LD_PRELOAD=/usr/lib64/libstdc++.so.6
>     > ~/apps/matlab/MATLAB/R2018a/bin/matlab
>     > > >
>     > > > I get this error:
>     > > > Invalid MEX-file
>     > > >
>     > 
> '/data/home/jpeeter/apps/anaconda3/envs/testarrow/lib/fromArrowStream.mexa64':
>     > > >
>     > 
> /data/home/jpeeter/apps/anaconda3/envs/testarrow/lib/fromArrowStream.mexa64:
>     > > > undefined symbol: _ZNK5arrow6Status8ToStringEv.
>     > > >
>     > > > If this isn't possible, is there a reliable/recommended 
> Anaconda-way to
>     > > > only bring in libraries that have been compiled with the old 
> ABI? My
>     > > > impression was that conda-forge libraries satisfied that, but
>     > > > - This no longer seems to be true for arrow-cpp=0.11? I might 
> be
>     > mistaken
>     > > > here.
>     > > > - We are resolving our dependencies through Anaconda, so it 
> could be
>     > quite
>     > > > brittle for users to explicitly have to specify a channel for 
> certain
>     > > > libraries. There are further subtleties wrt resolving boost & 
> arrow
>     > from
>     > > > different channels etc. Ideally - but not necessarily - users 
> don't
>     > depend
>     > > > on conda-forge at all, but only on the default channels (as 
> an aside:
>     > we
>     > > > use Artifactory internally).
>     > > >
>     > > > Essentially, I'm happy with either,
>     > > > - having a way for MATLAB to load MEX with the new ABI, or,
>     > > > - reliably depending on libraries compiled with the old ABI
>     > > >
>     > > > but I've been struggling for a while now to achieve either 
> one of
>     > those.
>     > > > Any pointers would be most welcome!
>     > > >
>     > > > (For once, this turned out to be easier on Windows than 
> Linux!)
>     > > >
>     > > > Best,
>     > > > -Joris.
>     > >
>     >
>     
> 
>

Reply via email to