This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] riscv: remove DL_RO_DYN_SECTION
- From: Jim Wilson <jimw at sifive dot com>
- To: Florian Weimer <fweimer at redhat dot com>
- Cc: David Abdurachmanov <david dot abdurachmanov at gmail dot com>, GNU C Library <libc-alpha at sourceware dot org>, Jim Wilson <jimw at sifive dot com>, Palmer Dabbelt <palmer at sifive dot com>, DJ Delorie <dj at delorie dot com>
- Date: Tue, 9 Apr 2019 16:21:02 -0700
- Subject: Re: [PATCH] riscv: remove DL_RO_DYN_SECTION
- References: <20190409112529.13930-1-david.abdurachmanov@gmail.com> <87y34jjtgu.fsf@oldenburg2.str.redhat.com>
On Tue, Apr 9, 2019 at 4:42 AM Florian Weimer <fweimer@redhat.com> wrote:
> * David Abdurachmanov:
Do you or your employer have copyright assignments? For a trivial
patch like this, a copyright assignment shouldn't be necessary, but
would be necessary if you want to contribute more patches.
> > While working on enabling D front-end (GDC) in GCC we noticed that druntime
> > was segfaulting if it is linked dynamically. This was tracked to
> > DL_RO_DYN_SECTION.
My analysis of this when it first came up...
I believe this was blindly copied from MIPS, and that no one on the
RISC-V side will know why it is there, because it was blindly copied
from MIPS.
Looking at the MIPS SVR4 ABI, I see
.dynamic This is the same as the generic ABI section of the same type, but
the MIPS-specific version does not include the SHF_WRITE at-
tribute.
I don't see any other reason in the spec for this to be read-only, but
making it read-only probably improves program security. I don't see
an equivalent statement in the RISC-V ABI.
Looking at bfd/elfxx-mips.c _bfd_mips_elf_create_dynamic_sections(), we see code
flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
| SEC_LINKER_CREATED | SEC_READONLY);
/* The psABI requires a read-only .dynamic section, but the VxWorks
EABI doesn't. */
if (!htab->is_vxworks)
{
s = bfd_get_linker_section (abfd, ".dynamic");
if (s != NULL)
{
if (! bfd_set_section_flags (abfd, s, flags))
return FALSE;
}
}
that forces .dynamic to be read-only everywhere except vxworks. I
don't see equivalent code in the RISC-V bfd port.
Looking at ld, in emulparams/, there are multiple mips scripts that
set TEXT_DYNAMIC, which forces .dynamic into the text segment instead
of the data segment. This is then unset in the vxworks scripts.
Interestingly, hppa also sets TEXT_DYNAMIC, but the hppa support in
glibc is probably not well maintained. Anyways, there is no
equivalent code for RISC-V.
So it appears unnecessary for the RISC-V glibc port.
If MIPS dynamic linking support is ever added to the druntime library,
then it will need the same change that you made for RISC-V, so in that
case it would not be a RISC-V specific change. However, there aren't
a lot of people doing MIPS development work anymore, so this may never
come up.
Jim
PS Since I wrote my analysis, MIPS has been resurrected, so maybe
someone will care about that again.