On Mon, Nov 28, 2022 at 08:47:40PM +0100, Markus Wichmann wrote: > Hi all, > > __dls2 calls kernel_mapped_dso(), and that one uses the PAGE_SIZE macro. > Whenever does not define PAGESIZE, PAGE_SIZE is defined > as libc.page_size. That variable is only initialized at the start of > __dls3, so the DSO descriptor for libc ends up being wrong. > > Since the libc object has static storage duration, page_size is > initialized with zero. So at least nothing undefined happens. The impact > is, it will calculate the relro pointers as being zero, so no relro will > happen, and it will calculate maximum and minimum addresses as being > zero, therefore setting map to base and map_len to zero. This will cause > dladdr() not to find the libc. Yeah, not the biggest of impacts. > > This, again, affects all architectures that don't define PAGESIZE, so at > this time those are > > aarch64 > arm > m68k > microblaze > mips > mips64 > mipsn32 > powerpc > powerpc64 > riscv64 > > I don't know whether references to libc are even valid in __dls2, but it > is defined as "hidden", so that ought to be good enough. In that case it > may be enough to just move the initialization. Otherwise it may be > necessary to add page size as parameter to kernel_mapped_dso(). Then > __dls2 can look it up in the aux vector at its leisure. Nice catch. The references to libc are not valid in __dls2. If they were, I would just re-run kernel_mapped_dso() from __dls2b or something to get the right relro map, but I think instead we should do something like the attached. Rich