libatomic IFUNC question (arm & libat_have_strexbhd)

Richard Henderson rth@redhat.com
Wed Jun 7 20:52:00 GMT 2017


On 06/07/2017 01:31 PM, Florian Weimer wrote:
>> With lazy binding, the constructors of libraries should run in graph
>> dependency order, which means this constructor should run before any
>> users.
> 
> Except when another shared object uses the function from its own ELF
> constructor, and the libatomic constructor has not yet run.  This
> should not happen if the object has a proper DT_NEEDED reference on
> libatomic, but strange things happen once LD_PRELOAD is involved.

True, but that's relatively rare.

> (There might also exist relocations which cannot be lazily bound, even
> if the object wasn't linked with BIND_NOW.)
> 
>> Once upon a time, we didn't really have a way to get at either
>> AT_HWCAP or AT_PLATFORM from here.  Since then, glibc has grown the
>> getauxval function.
> 
> getauxval does not work from IFUNC handlers because it itself requires
> a relocation (which may not have been processed at this point), and it
> relies on global data which might not have been initialized.

Which is why I didn't actually call getauxval from the IFUNC resolver, but rely 
on a data member being initialized.

And when the data member isn't initialized, for the various ordering issues 
described above, the only consequence is that we use a less efficient (but not 
incorrect) mechanism for the atomic.

It's possible we could do slightly better vs ordering with DT_PREINIT, but far 
more common is DF_BIND_NOW, and no form of constructor helps with that.

> I think we would have to pass ways to reach the relevant data as IFUNC
> resolver arguments, and in addition fix the relocation processing in
> ld.so to delay IFUNC resolution after all other relocation processing.
> (I have an unfinished patch for the latter; I posted it to libc-alpha
> a while back.)

That would be an improvement, yes.


r~



More information about the Gcc mailing list