Intel® oneAPI Base Toolkit
Support for core tools and libraries to build and deploy high-performance data-centric applications
273 Discussions

Is it possible to create a dynamic shared object (DSO) with no dependencies on libimf.so

Richard_P_1
Beginner
578 Views

I was using the classic Intel compiler (icc and icpc) to create a “standalone” dynamic shared object (DSO). In short these link-time flags did the trick: "-shared -static-intel -static" to create a standalone shared library (mylib-icc.so) that I was able to distribute to my clients without having to distribute any Intel's DSO.

Dependencies:
[rp]$ ldd mylib-icc.so
                linux-vdso.so.1 (0x00007ffd94bb4000)
                librt.so.1 => /lib64/librt.so.1 (0x00007f0d78127000)
                libm.so.6 => /lib64/libm.so.6 (0x00007f0d77da5000)
                libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f0d77a10000)
                libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f0d777f8000)
                libc.so.6 => /lib64/libc.so.6 (0x00007f0d77435000)
                libdl.so.2 => /lib64/libdl.so.2 (0x00007f0d77231000)
                libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0d77011000)
                /lib64/ld-linux-x86-64.so.2 (0x00007f0d78956000)

I am now updating to the new oneAPI base kit but I'm not able to achieve the same result. That is to create a standalone shared library for Linux to be linked and used with an application that is built using GCC.

[rp]$ icx -dumpversion
result is 12.0.0
[rp]$ icpx -dumpversion
result is 12.0.0

I compile my C source files using the following command line:
[rp] icx -fvisibility=hidden -march=corei7 -fPIC -c myfilex.c

Linking with the following:
[rp]$ icpx -o mylib.so -shared myfile1.o myfile2.o allmyotherfiles.o

I get the following dependencies:
[rp]$ ldd mylib.so
   linux-vdso.so.1 (0x00007ffdbe51d000)
                libsvml.so => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libsvml.so (0x00007f6399c5f000)
                libirng.so => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libirng.so (0x00007f63998f5000)
                libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f6399560000)
                libimf.so => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libimf.so (0x00007f6398ed8000)
                libm.so.6 => /lib64/libm.so.6 (0x00007f6398b56000)
                libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f639893e000)
                libintlc.so.5 => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007f63986c6000)
                libdl.so.2 => /lib64/libdl.so.2 (0x00007f63984c2000)
                libc.so.6 => /lib64/libc.so.6 (0x00007f63980ff000)
                /lib64/ld-linux-x86-64.so.2 (0x00007f639bbf7000)

Adding the "-static-intel" option I still get dependencies on Intel's libimf.so and libintlc.so although libirng.so and libsmvl.so have disappeared

[rp]$ icpx -o mylib.so -shared -static-intel myfile1.o myfile2.o myotherfiles.o
[rp]$ ldd mylib.so
                linux-vdso.so.1 (0x00007fff457ca000)
                libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f9538ef5000)
                libimf.so => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libimf.so (0x00007f953886d000)
                libm.so.6 => /lib64/libm.so.6 (0x00007f95384eb000)
                libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f95382d3000)
                libdl.so.2 => /lib64/libdl.so.2 (0x00007f95380cf000)
                libc.so.6 => /lib64/libc.so.6 (0x00007f9537d0c000)
                /lib64/ld-linux-x86-64.so.2 (0x00007f9539786000)
                libintlc.so.5 => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007f9537a94000)

Adding the "--as-needed" option I still get dependencies on Intel's libimf.so and libintlc.so
[rp]$ icpx -o mylib.so -shared -static-intel Wl,--as-needed myfile1.o myfile2.o myotherfiles.o
[rp]$ ldd mylib.so
                linux-vdso.so.1 (0x00007fff1b76d000)
                libimf.so => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libimf.so (0x00007fc3e24d7000)
                libc.so.6 => /lib64/libc.so.6 (0x00007fc3e2114000)
                libintlc.so.5 => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007fc3e1e9c000)
                /lib64/ld-linux-x86-64.so.2 (0x00007fc3e305b000)

[rp]$ ldd -u mylib.so
Unused direct dependencies:
                /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libimf.so

The strange thing here is that libimf doesn't seem to be used (see above ldd -u result) but it is needed when linking my test app using GCC otherwise it complains.  When I give access to only libimf.so GCC tells me that libintlc.so.5 is needed by libimf.so. All works fine when I gave GCC access to both libs.

Any help here would be greatly appreciated. Thanks.

0 Kudos
7 Replies
RahulV_intel
Moderator
558 Views

Hi,

 

Could you please attach a small reproducer code if possible?

Also specify your OS, oneAPI version.

 

Thanks,

Rahul

RahulV_intel
Moderator
549 Views

Hi,


Just a quick reminder to share your reproducer code.


Thanks,

Rahul


Richard_P_1
Beginner
542 Views

Hi Rahul, sorry for  the delay. Here’s a short piece of code that reproduces the situation:

/*
                icxTest4so.c
*/

#include <math.h>
#include <float.h>

float externFunc( float *dn0, float *dn1 );

void test_function( float dn[] )
{
   float k_cn, k_dn, sum;

   sum = 0.01F;
   k_cn = ( float )( 1 / sqrt( sum ) );
   sum += externFunc( dn, dn );
   k_dn = ( float )( 1 / sqrt( sum ) );
}

[rp]$ icx -fPIC -c icxTest4so.c -o icxTest4so.o
[rp]$ icx -o test_shared.so -shared -static-intel -Wl,--as-needed icxTest4so.o
[rp]$ ldd test_shared.so
                linux-vdso.so.1 (0x00007ffe490e1000)
                libimf.so => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libimf.so (0x00007f1aa8448000)
                libdl.so.2 => /lib64/libdl.so.2 (0x00007f1aa8244000)
                libc.so.6 => /lib64/libc.so.6 (0x00007f1aa7e81000)
                libintlc.so.5 => /opt/intel/oneapi/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007f1aa7c09000)
                /lib64/ld-linux-x86-64.so.2 (0x00007f1aa8cdd000)
[rp]$

Thanks.

RahulV_intel
Moderator
532 Views

Hi Richard,

 

You're right. Nextgen compilers(ICX/ICPX) does seem to have a dependency on libimf.so when following your steps.

 

However, there seems to be no dependency on libimf.so with the classic compilers (ICC/ICPC).

 

ldd test_shared.so

    linux-vdso.so.1 (0x00007fffff9c2000)

    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f735f538000)

    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f735f346000)

    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f735f340000)

    /lib64/ld-linux-x86-64.so.2 (0x00007f735f56b000)

 

 

Intel classic compilers(ICC/ICPC) comes along with the HPC toolkit. Please find the download link below:

https://software.intel.com/content/www/us/en/develop/tools/oneapi/hpc-toolkit/download.html

 

 

Thanks,

Rahul

 

Richard_P_1
Beginner
522 Views

Many thanks Rahul for confirming that it is not possible to create a dynamic shared object (DSO) with no dependencies on libimf.so when the math lib is used. At the end it is not so big of an issue, we would just have to distribute the necessary Intel's DSO with along with our own DSO. However with all these tests I came to an unfortunate conclusion. It may not be the right place to discuss this but my preliminary tests show that gcc 8.3 is more efficient on an corei7. I tried icx 2021.1, icc 2021.1 and icc 19.0.0.117. We were using icc because it was significantly more efficient than gcc 4.x and older.

One more thing that I would need clarification on if I may. I was under the impression that icc 19.0.0.117 created DSOs that are universal and could run on virtually any cpu and that it would select the specific math routine depending on the cpu it was running on. Is this true? I wasn't able to confirm the prior by searching through the documentation. If it is true, is it also true for icc 2021.1 and icx 2021.1?

Thanks and regards,

Richard

 

RahulV_intel
Moderator
505 Views

Hi Richard,

 

Thanks for providing your inputs. I have forwarded your query to the subject matter experts. They will let you know if there is any way to bypass libimf.so with ICX/ICPX and also clarify your other queries.

 

Thanks and regards,

Rahul

Anoop_M_Intel
Employee
343 Views

ICPX compiler is linking with libimf dynamically unlike the ICPC behavior of static linking. Using -static-intel is not making that behavior change with ICPX. Have escalated this case to Compiler Development.


Reply