[libc-dev] ppc64le and 32-bit LE userland compatibility
Daniel Kolesa via libc-dev
libc-dev at lists.llvm.org
Mon Jun 1 17:11:03 PDT 2020
On Tue, Jun 2, 2020, at 01:45, Joseph Myers wrote:
> On Tue, 2 Jun 2020, Daniel Kolesa wrote:
> > Are you sure this would be a new port? Glibc already works in this
> > combination, as it seems to me it'd be best if it was just a variant of
> > the existing 32-bit PowerPC port, sharing most conventions besides
> > endianness with the BE port.
> The supported glibc ABIs are listed at
> <https://sourceware.org/glibc/wiki/ABIList>. This would be a new ABI,
> which should have a new ABI-and-architecture-specific dynamic linker name
> (all new ports are expected to have a unique dynamic linker name for each
> ABI, to support systems using multiarch directory arrangements), new
> symbol versions and avoid legacy features such as 32-bit time or offsets
> or IBM long double.
> > 128-bit IEEE long double would not work, since that relies on VSX being
> > present (gcc will explicitly complain if it's not). I'd be all for using
> The minimum supported architecture for powerpc64le (POWER8) has VSX. My
> understanding was that the suggestion was for 32-bit userspace to run
> under powerpc64le kernels running on POWER8 or later, meaning that such a
> 32-bit LE port, and any ABI designed for such a port, can assume VSX is
> available. Or does VSX not work, at the hardware level, for 32-bit
> POWER8? (In which case you could pick another ABI for binary128 argument
> passing and return.)
POWER8 may have VSX (well, actually POWER7 and newer has VSX and can run LE, but glibc does not support this, musl potentially does), but the overall assumption here is that the resulting binaries should eventually not be limited to being just userspace under ppc64le, but should be runnable on a native kernel as well, which should not be limited to any particular baseline other than just PowerPC.
While it should in theory be possible to do IEEE ldbl128 using a different ABI, I don't really see any benefit in this - for one, the baseline hardware doesn't support on any level, it would mean further complicating the ABI, and it would require explicit support in the compiler, which currently doesn't exist. Using 64-bit long doubles sounds like a much better way out to me.
> > There is also one more thing while we're at this. The 64-bit big endian
> > Void port uses the ELFv2 ABI, even on glibc. This is not officially
> > supported on glibc as far as I can tell, but it does work out of box,
> > without any patching (things in general match little endian then, i.e.
> > ld64.so.2 etc, but they're big endian). Is there any chance of making
> > that support official?
> If you want to support ELFv2 for 64-bit big endian in glibc, again that
> should have a unique dynamic linker name, new symbol versions, only
> binary128 long double, etc. - avoid all the legacy aspects of the existing
> ELFv1 port rather than selectively saying that "ELFv1" itself is the only
> legacy aspect and keeping the others (when it's the others that are
> actually more problematic in glibc).
Again, the BE port cannot use binary128 long double, at least not with the same ABI as on POWER8, since it runs on all 64-bit PowerPC systems starting with 970 (G5, and potentially even POWER4 if built without AltiVec). Unique dynamic linker names are complicated, since as it is, glibc uses ld64.so.1 for ELFv1, and ld64.so.2 for ELFv2. (on 32-bit PowerPC, it's ld.so.1, and uses the SVR4 ABI which is not related to either the AIX/ELFv1 nor the ELFv2 ABIs) If we were to introduce new ports, what would those use? ld64.so.3 for BE/v2? ld.so.2 for LE/32-bit? I can see the reason for a new dynamic linker name though (multi-arch setups).
However, the effective difference between the ports would be rather minimal, if any, as far as I can see. As I already said, we have a whole glibc/ELFv2/BE system, with nearly all of the existing Linux userland covered by the distro, and there haven't been any issues whatsoever.
> Joseph S. Myers
> joseph at codesourcery.com
More information about the libc-dev