Re: ld.so/sparc64: fix UA64 relocation mask selection and byte order

Kirill A. Korinsky <[email protected]>
Newsgroups gmane.os.openbsd.tech
Message-ID <[email protected]>
On Thu, 09 Jul 2026 17:01:34 +0200,
Mark Kettenis <[email protected]> wrote:
> 
> > Date: Thu, 09 Jul 2026 15:30:52 +0200
> > From: Kirill A. Korinsky <[email protected]>
> > 
> > On Thu, 09 Jul 2026 14:55:45 +0200,
> > Mark Kettenis <[email protected]> wrote:
> > > 
> > > I think we do.  These "unaligned" relocations might not work in a
> > > multi-threaded context as threads may observed a partially updated
> > > state.
> > 
> > Make sense. This, actually, not that hard to change.
> > 
> > Something like that should do it.
> 
> And what about the UA32 and UA16 relocations?
>

As far as I see the code of lld it do not allow UA32 and UA16 for dynamic reallocations.

> 
> > I will include it into my large llvm-toolchain diff and into PR for llvm-upstream.
> > 
> > diff --git gnu/llvm/lld/ELF/SyntheticSections.cpp gnu/llvm/lld/ELF/SyntheticSections.cpp
> > index 57fcfc4cf3a..14ef5ed3c5b 100644
> > --- gnu/llvm/lld/ELF/SyntheticSections.cpp
> > +++ gnu/llvm/lld/ELF/SyntheticSections.cpp
> > @@ -1734,18 +1734,22 @@ void RelocationBaseSection::finalizeContents() {
> >  
> >  void DynamicReloc::finalize(Ctx &ctx, SymbolTableBaseSection *symt) {
> >    r_offset = getOffset();
> > -  if (ctx.arg.emachine == EM_SPARCV9 && type == R_SPARC_UA64 &&
> > -      needsDynSymIndex() && !sym->isPreemptible) {
> > -    if (r_offset % 8 != 0) {
> > +  bool wasSparcUA64 = ctx.arg.emachine == EM_SPARCV9 && type == R_SPARC_UA64;
> > +  if (wasSparcUA64) {
> > +    if (r_offset % 8 == 0) {
> > +      type = R_SPARC_64;
> > +    } else if (needsDynSymIndex() && !sym->isPreemptible) {
> >        Err(ctx) << "R_SPARC_UA64 relocation at offset " << r_offset
> >                 << " against non-preemptible symbol " << sym
> >                 << " is not 8-byte aligned";
> > -    } else {
> > -      type = ctx.target->relativeRel;
> > -      isAgainstSymbol = false;
> > -      expr = R_ABS;
> >      }
> >    }
> > +  if (wasSparcUA64 && type == R_SPARC_64 && needsDynSymIndex() &&
> > +      !sym->isPreemptible) {
> > +    type = ctx.target->relativeRel;
> > +    isAgainstSymbol = false;
> > +    expr = R_ABS;
> > +  }
> >    r_sym = getSymIndex(symt);
> >    addend = computeAddend(ctx);
> >    isFinal = true; // Catch errors
> > 
> > 
> > -- 
> > wbr, Kirill
> > 

-- 
wbr, Kirill
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.