public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] sparc: Set noexecstack on mulsi3, divsi3, and modsi3
@ 2017-05-10 20:27 Adhemerval Zanella
  2017-05-15  7:51 ` Eric Botcazou
  0 siblings, 1 reply; 2+ messages in thread
From: Adhemerval Zanella @ 2017-05-10 20:27 UTC (permalink / raw)
  To: gcc-patches

A recent GLIBC fix for sparc [1] made some configuration to show
an executable stack on ld.so (shown on elf/check-execstack testcase
failure).

It is because with generated sparc toolchain from build-many-glibcs.py
(a GLIBC script to produce cross-compiling toolchains) the minimum
supported sparc32 version is pre-v9 and it requires a software
implementation of '.udiv'.  Since now we are using libgcc.a one instead,
it must have the '.note.GNU-stack' so linker can properly set the stack non
executable.

From a build using a toolchain from build-many-glibcs.py:

elf/librtld.os.map

[...]
.../sparc64-glibc-linux-gnu/6.2.1/32/libgcc.a(_divsi3.o)
                              .../sparc64-glibc-linux-gnu/6.2.1/32/libgcc.a(_udivdi3.o) (.udiv)
.../sparc64-glibc-linux-gnu/6.2.1/32/libgcc.a(_clz.o)
                              .../lib/gcc/sparc64-glibc-linux-gnu/6.2.1/32/libgcc.a(_udivdi3.o) (__clz_tab)
[...]

And dumping _udivdi3.o section headers:

  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00000000 000034 0002b0 00  AX  0   0  4
  [ 2] .data             PROGBITS        00000000 0002e4 000000 00  WA  0   0  1
  [ 3] .bss              NOBITS          00000000 0002e4 000000 00  WA  0   0  1
  [ 4] .debug_line       PROGBITS        00000000 0002e4 00010d 00      0   0  1
  [ 5] .rela.debug_line  RELA            00000000 0007c0 00000c 0c   I 12   4  4
  [ 6] .debug_info       PROGBITS        00000000 0003f1 0000ab 00      0   0  1
  [ 7] .rela.debug_info  RELA            00000000 0007cc 000030 0c   I 12   6  4
  [ 8] .debug_abbrev     PROGBITS        00000000 00049c 000014 00      0   0  1
  [ 9] .debug_aranges    PROGBITS        00000000 0004b0 000020 00      0   0  8
  [10] .rela.debug_arang RELA            00000000 0007fc 000018 0c   I 12   9  4
  [11] .shstrtab         STRTAB          00000000 000814 000070 00      0   0  1
  [12] .symtab           SYMTAB          00000000 0004d0 000220 10     13  32  4
  [13] .strtab           STRTAB          00000000 0006f0 0000cf 00      0   0  1

I am not seeing this on a native gcc build which I configured with:

' --with-arch-directory=sparc64 --enable-multiarch --enable-targets=all
  --with-cpu-32=ultrasparc --with-long-double-128 --enable-multilib'

Both libgcc's __udivdi3 and __umoddi3 do not pull .udiv since for this libgcc build
both are using hardware instructions:

elf/librtld.os.map

/home/azanella/gcc/install/lib/gcc/sparc64-linux-gnu/6.3.1/32/libgcc.a(_udivdi3.o)
                              /home/azanella/glibc/glibc-git-build-sparcv9/elf/dl-allobjs.os (__udivdi3)
/home/azanella/gcc/install/lib/gcc/sparc64-linux-gnu/6.3.1/32/libgcc.a(_umoddi3.o)
                              /home/azanella/glibc/glibc-git-build-sparcv9/elf/dl-allobjs.os (__umoddi3)

This patch adds them missing noexectack on sparc assembly implementation.  I saw
no regression on gcc testsuite and it fixes the regression on GLIBC side.

libgcc/

	* config/sparc/lb1spc.S [__ELF__ && __linux__]: Emit .note.GNU-stack
	section for a non-executable stack.

[1] https://sourceware.org/git/?p=glibc.git;a=commit;h=bdc543e338281da051b3dc06eae96c330a485ce6
---
 libgcc/ChangeLog             | 5 +++++
 libgcc/config/sparc/lb1spc.S | 6 ++++++
 2 files changed, 11 insertions(+)

diff --git a/libgcc/config/sparc/lb1spc.S b/libgcc/config/sparc/lb1spc.S
index b60bd57..e693864 100644
--- a/libgcc/config/sparc/lb1spc.S
+++ b/libgcc/config/sparc/lb1spc.S
@@ -5,6 +5,12 @@
    slightly edited to match the desired calling convention, and also to
    optimize them for our purposes.  */
 
+/* An executable stack is *not* required for these functions.  */
+#if defined(__ELF__) && defined(__linux__)
+.section .note.GNU-stack,"",%progbits
+.previous
+#endif
+
 #ifdef L_mulsi3
 .text
 	.align 4
-- 
2.7.4

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] sparc: Set noexecstack on mulsi3, divsi3, and modsi3
  2017-05-10 20:27 [PATCH] sparc: Set noexecstack on mulsi3, divsi3, and modsi3 Adhemerval Zanella
@ 2017-05-15  7:51 ` Eric Botcazou
  0 siblings, 0 replies; 2+ messages in thread
From: Eric Botcazou @ 2017-05-15  7:51 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: gcc-patches

> This patch adds them missing noexectack on sparc assembly implementation.  I
> saw no regression on gcc testsuite and it fixes the regression on GLIBC
> side.
> 
> libgcc/
> 
> 	* config/sparc/lb1spc.S [__ELF__ && __linux__]: Emit .note.GNU-stack
> 	section for a non-executable stack.

Thanks for fixing this, applied to all active branches.

-- 
Eric Botcazou

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-05-15  7:38 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-10 20:27 [PATCH] sparc: Set noexecstack on mulsi3, divsi3, and modsi3 Adhemerval Zanella
2017-05-15  7:51 ` Eric Botcazou

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).