[PATCH] ld.so: Always use MAP_COPY to map the first segment [BZ #28656]
Sergey Bugaev
bugaevc@gmail.com
Thu Jun 15 15:42:46 GMT 2023
On Thu, Jun 15, 2023 at 6:23 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Wed, Jun 14, 2023 at 1:32 AM Sergey Bugaev <bugaevc@gmail.com> wrote:
> >
> > Hello,
> >
> > On Tue, June 13, 2023 at 8:19 PM H.J. Lu <hjl.tools@gmail.com> wrote:
> > > To support LD_PREFER_MAP_32BIT_EXEC, we pass MAP_32BIT to mmap when the
> > > first segment in a shared library is mapped with MAP_DENYWRITE. But if
> > > the segment alignment is greater than the page size, MAP_DENYWRITE isn't
> > > used to map the first segment. In this case, we should map the first
> > > segment with MAP_COPY, instead of MAP_PRIVATE, which is defined as
> > >
> > > # define MAP_COPY (MAP_PRIVATE | MAP_DENYWRITE)
> >
> > isn't MAP_DENYWRITE ignored by Linux? So this change wouldn't make any
> > difference on Linux, would it?
>
> MAP_DENYWRITE is ignored by Linux kernel. Glibc for Linux checks
> MAP_DENYWRITE to decide if MAP_32BIT should be used.
Ahh, I see, thanks. That wasn't clear from the commit message,
although now I see where it says that.
Something like this would have been clear to me:
"When prefer_map_32bit_exec is enabled, mmap determines whether to use
MAP_32BIT by checking for (prot & PROT_EXEC) and also for
(flags & MAP_DENYWRITE). The latter is needed to also set MAP_32BIT for
the first segment in a shared library in case it's not marked executable
due to -z separate-code. But if ..."
My prefer_map_32bit_exec implementation for the Hurd only checks for
(addr == NULL) && (prot & PROT_EXEC)
should I be checking for MAP_COPY as well?
Sergey
More information about the Libc-alpha
mailing list