Intel® C++ Compiler
Community support and assistance for creating C++ code that runs on platforms based on Intel® processors.

With Intel Composer 2013 SP1 and GCC 4.8, program segfaults when linking to libstc++.

Nicholas_S_Intel
Employee
381 Views

I am having a difficult time trying to compile a trivial c++ program that containing a stdlib call.

I have narrowed down the problem with trying to statically or dynamically link the latest version of gcc’s libraries (static examples shown below.)

If I were to dynamically link the library, I had to make sure that my LD_LIBRARY_PATH is set correctly.  Linking to an older version works fine (example is shown at the bottom)

Any ideas what I could be doing wrong?  I am trying to upgrade our compilers to the latest and this is blocking me.

Thanks,

Nick

a.cpp:
#include <iostream>
int main(int argc, char *argv[])
{              
    int foo = 5;
    foo += 5;
    int bar = foo;

    std::cout <<"Hello World!" << std::endl;  //segfaults here
}


Using ICC 14.0 with multiple GCC versions:

machine> /<path>/14.0.1/bin/icpc -gxx-name=/<path>/gcc/4.8.0/bin/g++ a.cpp -m32 -static && a.out
Segmentation fault

machine> /<path>/14.0.1/bin/icpc -gxx-name=/<path>/gcc/4.7.2/bin/g++ a.cpp -m32 -static && a.out
Segmentation fault

machine> /<path>/14.0.1/bin/icpc -gxx-name=/<path>/gcc/4.7.0/bin/g++ a.cpp -m32 -static && a.out
Segmentation fault

machine> /<path>/14.0.1/bin/icpc -gxx-name=/<path>/gcc/4.6.2/bin/g++ a.cpp -m32 -static && a.out
Hello World!

machine> /<path>/14.0.1/bin/icpc -gxx-name=/<path>/gcc/4.4.2/bin/g++ a.cpp -m32 -static && a.out
Hello World!

 

Using ICC 13.0 with multiple GCC versions:

machine> /<path>/13.0.0/composer_xe_2013.0.079/bin/ia32/icpc -gxx-name=/<path>/gcc/4.8.0/bin/g++ a.cpp -static && a.out
Segmentation fault

machine> /<path>/13.0.0/composer_xe_2013.0.079/bin/ia32/icpc -gxx-name=/<path>/gcc/4.7.2/bin/g++ a.cpp -static && a.out
Segmentation fault

machine> /<path>/13.0.0/composer_xe_2013.0.079/bin/ia32/icpc -gxx-name=/<path>/gcc/4.7.0/bin/g++ a.cpp -static && a.out
Segmentation fault

machine> /<path>/13.0.0/composer_xe_2013.0.079/bin/ia32/icpc -gxx-name=/<path>/gcc/4.6.2/bin/g++ a.cpp -static && a.out
Hello World!

machine> /<path>/13.0.0/composer_xe_2013.0.079/bin/ia32/icpc -gxx-name=/<path>/gcc/4.4.2/bin/g++ a.cpp -static && a.out
Hello World!

 

Using ICC 12.0  and gcc 4.6.2 (Our current compiler configuration):

machine> /<path>/12.1.3/composer_xe_2011_sp1.9.293/bin/ia32/icpc -gxx-name=/<path>/gcc/4.6.2/bin/g++ a.cpp -static  && a.out
Hello World!

 

Dynamic link example:

machine> /<path>/icc/14.0.0/bin/icpc -gxx-name=/<path>/gcc/4.8.0/bin/g++ a.cpp -m32
machine> ldd a.out
        linux-gate.so.1 =>  (0xffffe000)
        libm.so.6 => /lib/libm.so.6 (0xf7fb9000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xf7ed5000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf7eca000)
        libc.so.6 => /lib/libc.so.6 (0xf7d88000)
        libdl.so.2 => /lib/libdl.so.2 (0xf7d82000)
        /lib/ld-linux.so.2 (0x56555000)
        
machine> a.out
Hello World!

machine> setenv LD_LIBRARY_PATH /<path>/gcc/4.8.0/lib
machine> ldd a.out
        linux-gate.so.1 =>  (0xffffe000)
        libm.so.6 => /lib/libm.so.6 (0xf7fb9000)
        libstdc++.so.6 => /<path>/gcc/4.8.0/lib/libstdc++.so.6 (0xf7ed0000)
        libgcc_s.so.1 => /<path>/gcc/4.8.0/lib/libgcc_s.so.1 (0xf7eb5000)
        libc.so.6 => /lib/libc.so.6 (0xf7d73000)
        libdl.so.2 => /lib/libdl.so.2 (0xf7d6d000)
        /lib/ld-linux.so.2 (0x56555000)
        
machine> a.out
Segmentation fault

0 Kudos
8 Replies
QIAOMIN_Q_
New Contributor I
381 Views

$ icpc q039659.cpp -static -gxx-name=/opt/gcc/gcc-4.8.1/bin/g++ -m32 -L/opt/intel/composer_xe_2013_sp1.1.106/compiler/lib/ia32/

$ ./a.out
Hello World!

you can add '-v' to make sure linking right .

 

Thank you.
--
QIAOMIN.Q
Intel Developer Support
Please participate in our redesigned community support web site:

User forums:                   http://software.intel.com/en-us/forums/

0 Kudos
Nicholas_S_Intel
Employee
381 Views

I still am getting a seg fault:

 

machine> /path/icc/14.0.0/bin/icpc -gxx-name=/path/gcc/4.8.0/bin/g++ a.cpp -m32 -static -L/path/icc/14.0.0/composer_xe_2013_sp1.1.106/compiler/lib/ia32/ 

 

machine>a.out
Segmentation fault

 

-v shows: ld /usr/lib/../lib/crt1.o /usr/lib/../lib/crti.o /path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/x86_64-suse-linux/4.8.0/32/crtbeginT.o -static -m elf_i386 -L/path/icc/14.0.0/composer_xe_2013_sp1.1.106/compiler/lib/ia32/ -o a.out -L/path/tools/icc/14.0.0/composer_xe_2013_sp1.1.106/compiler/lib/ia32 -L/path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/x86_64-suse-linux/4.8.0/32/ -L/path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/x86_64-suse-linux/4.8.0/../../../../x86_64-suse-linux/lib/../lib/ -L/path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/x86_64-suse-linux/4.8.0/../../../../lib/ -L/lib/../lib/ -L/usr/lib/../lib/ -L/path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/x86_64-suse-linux/4.8.0/32 -L/path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/x86_64-suse-linux/4.8.0/ -L/path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/ -L/path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/x86_64-suse-linux/4.8.0/../../../../x86_64-suse-linux/lib/ -L/path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/x86_64-suse-linux/4.8.0/../../../ -L/lib/ -L/usr/lib /tmp/icpcpzuMcx.o -limf -lsvml -lirng -lm -lipgo -ldecimal -lstdc++ -lgcc -lgcc_eh -lirc -lsvml -lc -lgcc -lgcc_eh -lirc_s -ldl -lc /path/em64t_SLES10/pkgs/gcc/4.8.0/.bin/../lib64/gcc/x86_64-suse-linux/4.8.0/32/crtend.o /usr/lib/../lib/crtn.o

 

perhaps there is a problem with the installation of icc14 or gcc4.8? Are there any diagnostics I can do?

0 Kudos
TimP
Honored Contributor III
381 Views

You should run with icpc installed in original position (matching its libraries), with paths determined at install time, sourceing the installed compilervars script.

Then you should be able do do

icpc -V

and see the correct version.

Also, I think it's better to set up so that e.g.

g++ -v -m32 empty.cpp

g++ -m32 --print-search-dirs

give the expected results, rather than depending on not-so-well-tested options.

0 Kudos
SergeyKostrov
Valued Contributor II
381 Views
>>Also, I think it's better to set up so that e.g. >> >>g++ -v -m32 empty.cpp >> >>g++ -m32 --print-search-dirs >>... I've been using 4.8.1 version for a couple of months already and it is hard to believe that GCC software developers missed some trivial error. I could only suggest to verify that 32-bit libraries are used in 32-bit application and, 64-bit libraries are used in 64-bit application.
0 Kudos
Nicholas_S_Intel
Employee
381 Views

turns out icpc was using the default "ld", which is an older version (2.16.91)

"/..path../pkgs/gcc/4.8.1/bin/ld" is version (2.23.2)

specifying "-Qlocation,ld,/..path../pkgs/gcc/4.8.1/bin/" achieved correct behavior, at least for the trivial test

/..path../icc/14.0.1/bin/icpc a.cpp -static -v -m32 -gxx-name=/..path..s/gcc/4.8.1/bin/g++ -Qlocation,ld,/..path../gcc/4.8.1/bin/ && a.out 

Hello World!

are there any other tools I should specify the correct location?

0 Kudos
QIAOMIN_Q_
New Contributor I
381 Views

And as i observed that without adding the -L/opt/intel/composer_xe_2013_sp1.1.106/compiler/lib/ia32/ ,linker would always try to link with intel64 libraries ,also caused linking errors.

$ icpc q039659.cpp -static -gxx-name=/opt/gcc/gcc-4.8.1/bin/g++ -m32 -L/opt/intel/composer_xe_2013_sp1.1.106/compiler/lib/ia32/

$ ./a.out
Hello World!

Ths is the one with success without specifying the ld location.

0 Kudos
Nicholas_S_Intel
Employee
381 Views

You are correct Qiaomin, I went back and again tried adding the option -L/opt/intel/composer_xe_2013_sp1.1.106/compiler/lib/ia32/ , it does work without specifying the ld location.  I'm not sure why it didn't work for me the first time I tried.

Thanks to all who helped,

Nick

0 Kudos
Joost_G_
Beginner
381 Views

This thread helped me solve crazy errors. I think if you're using  "-gxx-name" you should get a warning if you're not also changing the linker that you might end up in funky situations.

0 Kudos
Reply