Re: undefined symbol: shm_open (ppc64le and aarch64)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



* Tom Callaway:

> One of my packages failed the mass rebuild, but only on ppc64le and
> aarch64. The error they both hit is this:
>
> Error: package or namespace load failed for 'BiocParallel' in
> dyn.load(file, DLLpath = DLLpath, ...):
>  unable to load shared object
> '/builddir/build/BUILDROOT/R-BiocParallel-1.16.5-1.fc30.ppc64le/usr/lib64/R/library/BiocParallel/libs/BiocParallel.so':
>
> /builddir/build/BUILDROOT/R-BiocParallel-1.16.5-1.fc30.ppc64le/usr/lib64/R/library/BiocParallel/libs/BiocParallel.so:
> undefined symbol: shm_open
> Error: loading failed

Is this an error message from the R interpreter?

On x86-64, the R interpreter already loads librt:

7f0f2635a000-7f0f2635c000 r--p 00000000 fd:01 402963247                  /usr/lib64/librt-2.29.so
7f0f2635c000-7f0f26360000 r-xp 00002000 fd:01 402963247                  /usr/lib64/librt-2.29.so
7f0f26360000-7f0f26362000 r--p 00006000 fd:01 402963247                  /usr/lib64/librt-2.29.so
7f0f26362000-7f0f26363000 r--p 00007000 fd:01 402963247                  /usr/lib64/librt-2.29.so
7f0f26363000-7f0f26364000 rw-p 00008000 fd:01 402963247                  /usr/lib64/librt-2.29.so

That's because libR loads it:

$ readelf -d /usr/lib64/R/lib/libR.so
…
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
…

The way dynamic linking works is that it searches for symbols in the
caller's namespace, and not just what's referenced by DT_NEEDED.

> Here's the linker invocation:
>
> g++ -m64 -std=gnu++11 -shared -L/usr/lib64/R/lib -Wl,-z,relro
> -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld
> -o BiocParallel.so ipcmutex.o -L/usr/lib64/R/lib -lR
>
> Now, google says this might be due to a lack of -lrt, but what's not
> clear to me is why it only fails on these two architectures (I've
> confirmed that none of the others have -lrt either).

In general, underlinking can be very problematic because it causes the
base symbol version to be used at run time, even if your program
actually requires a newer symbol version (for example, due to the
headers used at build time).  Here it does not matter (today) because we
only have one symbol version for shm_open.  But you do get interesting
effects with timer_create.

Thanks,
Florian
_______________________________________________
devel mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: https://lists.fedoraproject.org/archives/list/devel@xxxxxxxxxxxxxxxxxxxxxxx




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Users]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]

  Powered by Linux