gcc: Use ld -r when checking for HAVE_LD_RO_RW_SECTION_MIXING

Message ID 20221128135914.4068410-1-joakim@nohlgard.se
State Accepted
Headers
Series gcc: Use ld -r when checking for HAVE_LD_RO_RW_SECTION_MIXING |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Joakim Nohlgård Nov. 28, 2022, 1:59 p.m. UTC
  The check for HAVE_LD_RO_RW_SECTION_MIXING fails on targets where ld
does not support shared objects, even though the answer to the test
should be 'read-write'. One such target is riscv64-unknown-elf. Failing
this test results in a libgcc crtbegin.o which has a writable .eh_frame
section leading to the default linker scripts placing the .eh_frame
section in a writable memory segment, or a linker warning about writable
sections in a read-only segment when using ld scripts that place
.eh_frame unconditionally in ROM.

gcc/ChangeLog:

	* configure: Regenerate.
	* configure.ac: Use ld -r in the check for HAVE_LD_RO_RW_SECTION_MIXING

Signed-off-by: Joakim Nohlgård <joakim@nohlgard.se>
---
 gcc/configure.ac | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
  

Comments

Jeff Law Nov. 28, 2022, 4:53 p.m. UTC | #1
On 11/28/22 06:59, Joakim Nohlgård wrote:
> The check for HAVE_LD_RO_RW_SECTION_MIXING fails on targets where ld
> does not support shared objects, even though the answer to the test
> should be 'read-write'. One such target is riscv64-unknown-elf. Failing
> this test results in a libgcc crtbegin.o which has a writable .eh_frame
> section leading to the default linker scripts placing the .eh_frame
> section in a writable memory segment, or a linker warning about writable
> sections in a read-only segment when using ld scripts that place
> .eh_frame unconditionally in ROM.
>
> gcc/ChangeLog:
>
> 	* configure: Regenerate.
> 	* configure.ac: Use ld -r in the check for HAVE_LD_RO_RW_SECTION_MIXING

I'm not sure that simply replacing -shared with -r is the right fix 
here.  ISTM that if the -shared tests fails, then we can/should try the 
-r variant.    Am I missing something here?


jeff
  
Joakim Nohlgård Dec. 5, 2022, 1:46 p.m. UTC | #2
On Mon, Nov 28, 2022 at 5:53 PM Jeff Law <jeffreyalaw@gmail.com> wrote:
>
>
> On 11/28/22 06:59, Joakim Nohlgård wrote:
> > The check for HAVE_LD_RO_RW_SECTION_MIXING fails on targets where ld
> > does not support shared objects, even though the answer to the test
> > should be 'read-write'. One such target is riscv64-unknown-elf. Failing
> > this test results in a libgcc crtbegin.o which has a writable .eh_frame
> > section leading to the default linker scripts placing the .eh_frame
> > section in a writable memory segment, or a linker warning about writable
> > sections in a read-only segment when using ld scripts that place
> > .eh_frame unconditionally in ROM.
> >
> > gcc/ChangeLog:
> >
> >       * configure: Regenerate.
> >       * configure.ac: Use ld -r in the check for HAVE_LD_RO_RW_SECTION_MIXING
>
> I'm not sure that simply replacing -shared with -r is the right fix
> here.  ISTM that if the -shared tests fails, then we can/should try the
> -r variant.    Am I missing something here?
>
I have posted a v2 patch. The new patch tries ld -shared first and
falling back to ld -r if that fails.

I believe the original reason for using ld -shared in the first place
was that it was a convenient way to let the conftest1,2,3 code be as
simple as possible. Using ld without any flags would require a program
entry point (_start) at the very minimum. Using ld -r has the same
effect as the ld -shared link in this case, where we just want to
merge sections with the same name from different input files and check
what section flags were propagated to the output file.
  

Patch

diff --git a/gcc/configure.ac b/gcc/configure.ac
index 7c55bff6cb0..4f36ed4aff3 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -3153,9 +3153,9 @@  elif test x$gcc_cv_as != x -a x$gcc_cv_ld != x -a x$gcc_cv_objdump != x ; then
   if $gcc_cv_as -o conftest1.o conftest1.s > /dev/null 2>&1 \
      && $gcc_cv_as -o conftest2.o conftest2.s > /dev/null 2>&1 \
      && $gcc_cv_as -o conftest3.o conftest3.s > /dev/null 2>&1 \
-     && $gcc_cv_ld -shared -o conftest1.so conftest1.o \
+     && $gcc_cv_ld -r -o conftest.o conftest1.o \
 	conftest2.o conftest3.o > /dev/null 2>&1; then
-    gcc_cv_ld_ro_rw_mix=`$gcc_cv_objdump -h conftest1.so \
+    gcc_cv_ld_ro_rw_mix=`$gcc_cv_objdump -h conftest.o \
 			 | sed -e '/myfoosect/!d' -e N`
     if echo "$gcc_cv_ld_ro_rw_mix" | grep CONTENTS > /dev/null; then
       if echo "$gcc_cv_ld_ro_rw_mix" | grep READONLY > /dev/null; then