[PATCH] libffi .eh_frame tweaks

Jakub Jelinek jakub@redhat.com
Mon Apr 28 10:56:00 GMT 2003


Hi!

The following patch makes IA-32 and PPC32 libffi .eh_frame PC-relative if
-fpic/-fPIC/-mrelocatable, so that ld can create FDE lookup table in
.eh_frame_hdr section and also makes the .eh_frame section's attributes
match those emitted by gcc (so that libgcj.so's .eh_frame section can go
into read-only segment if linker supports that).
Ok to commit?

2003-04-28  Jakub Jelinek  <jakub@redhat.com>

	* configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section
	should be read-only.
	* configure: Rebuilt.
	* fficonfig.h.in: Rebuilt.
	* include/ffi.h.in (EH_FRAME_FLAGS): Define.
	* src/alpha/osf.S: Use EH_FRAME_FLAGS.
	* src/powerpc/linux64.S: Likewise.
	* src/powerpc/linux64_closure.S: Likewise.  Include ffi.h.
	* src/powerpc/sysv.S: Use EH_FRAME_FLAGS.  Use pcrel encoding
	if -fpic/-fPIC/-mrelocatable.
	* src/powerpc/powerpc_closure.S: Likewise.
	* src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include
	#write in .eh_frame flags.
	* src/sparc/v9.S: Likewise.
	* src/x86/unix64.S: Use EH_FRAME_FLAGS.
	* src/x86/sysv.S: Likewise.  Use pcrel encoding if -fpic/-fPIC.
	* src/s390/sysv.S: Use EH_FRAME_FLAGS.  Include ffi.h.

--- libffi/include/ffi.h.in.jj	2003-04-23 11:07:50.000000000 -0400
+++ libffi/include/ffi.h.in	2003-04-23 12:16:28.000000000 -0400
@@ -183,7 +183,15 @@ extern "C" {
 #endif
 #endif
 
-#ifndef LIBFFI_ASM
+#ifdef LIBFFI_ASM
+
+#ifdef HAVE_RO_EH_FRAME
+#define EH_FRAME_FLAGS "a"
+#else
+#define EH_FRAME_FLAGS "aw"
+#endif
+
+#else
 
 /* ---- Generic type definitions ----------------------------------------- */
 
--- libffi/src/alpha/osf.S.jj	2001-07-22 15:35:10.000000000 -0400
+++ libffi/src/alpha/osf.S	2003-04-23 12:16:28.000000000 -0400
@@ -292,7 +292,7 @@ $load_table:
 #endif
 
 #ifdef __ELF__
-	.section	.eh_frame,"aw",@progbits
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
 __FRAME_BEGIN__:
 	.4byte	$LECIE1-$LSCIE1	 # Length of Common Information Entry
 $LSCIE1:
--- libffi/src/powerpc/sysv.S.jj	2003-04-23 11:07:50.000000000 -0400
+++ libffi/src/powerpc/sysv.S	2003-04-23 12:36:27.000000000 -0400
@@ -128,48 +128,63 @@ L(float_return_value):
 .LFE1:
 END(ffi_call_SYSV)
 
-      .section  ".eh_frame","aw"
-__FRAME_BEGIN__:
+      .section	".eh_frame",EH_FRAME_FLAGS,@progbits
+.Lframe1:
       .4byte    .LECIE1-.LSCIE1  /*  Length of Common Information Entry */
 .LSCIE1:
       .4byte    0x0      /*  CIE Identifier Tag */
       .byte     0x1      /*  CIE Version */
-      .ascii "\0"        /*  CIE Augmentation */
-      .byte     0x1      /*  uleb128 0x1; CIE Code Alignment Factor */
-      .byte     0x7c     /*  sleb128 -4; CIE Data Alignment Factor */
+#if defined _RELOCATABLE || defined __PIC__
+      .ascii	"zR\0"   /*  CIE Augmentation */
+#else
+      .ascii	"\0"	 /*  CIE Augmentation */
+#endif
+      .uleb128  0x1      /*  CIE Code Alignment Factor */
+      .sleb128  -4	 /*  CIE Data Alignment Factor */
       .byte     0x41     /*  CIE RA Column */
+#if defined _RELOCATABLE || defined __PIC__
+      .uleb128  0x1      /*  Augmentation size */
+      .byte	0x1b	 /*  FDE Encoding (pcrel sdata4) */
+#endif
       .byte     0xc      /*  DW_CFA_def_cfa */
-      .byte     0x1      /*  uleb128 0x1 */
-      .byte     0x0      /*  uleb128 0x0 */
+      .uleb128  0x1
+      .uleb128  0x0
       .align 2
 .LECIE1:
 .LSFDE1:
       .4byte    .LEFDE1-.LASFDE1         /*  FDE Length */
 .LASFDE1:
-      .4byte    .LASFDE1-__FRAME_BEGIN__         /*  FDE CIE offset */
+      .4byte    .LASFDE1-.Lframe1         /*  FDE CIE offset */
+#if defined _RELOCATABLE || defined __PIC__
+      .4byte    .LFB1-.  /*  FDE initial location */
+#else
       .4byte    .LFB1    /*  FDE initial location */
+#endif
       .4byte    .LFE1-.LFB1      /*  FDE address range */
+#if defined _RELOCATABLE || defined __PIC__
+      .uleb128  0x0	 /*  Augmentation size */
+#endif
       .byte     0x4      /*  DW_CFA_advance_loc4 */
       .4byte    .LCFI0-.LFB1
       .byte     0xd      /*  DW_CFA_def_cfa_register */
-      .byte     0x08     /*  uleb128 0x08 */
+      .uleb128  0x08
       .byte     0x4      /*  DW_CFA_advance_loc4 */
       .4byte    .LCFI5-.LCFI0
       .byte     0x2f     /*  DW_CFA_GNU_negative_offset_extended */
-      .byte     0x41     /*  uleb128 0x41 */
-      .byte     0x1      /*  uleb128 0x1 */
+      .uleb128  0x41
+      .uleb128  0x1
       .byte     0x9f     /*  DW_CFA_offset, column 0x1f */
-      .byte     0x1      /*  uleb128 0x1 */
+      .uleb128  0x1
       .byte     0x9e     /*  DW_CFA_offset, column 0x1e */
-      .byte     0x2      /*  uleb128 0x2 */
+      .uleb128  0x2
       .byte     0x9d     /*  DW_CFA_offset, column 0x1d */
-      .byte     0x3      /*  uleb128 0x3 */
+      .uleb128  0x3
       .byte     0x9c     /*  DW_CFA_offset, column 0x1c */
-      .byte     0x4      /*  uleb128 0x4 */
+      .uleb128  0x4
       .byte     0x4      /*  DW_CFA_advance_loc4 */
       .4byte    .LCFI6-.LCFI5
       .byte     0xd      /*  DW_CFA_def_cfa_register */
-      .byte     0x1c     /*  uleb128 0x1c */
+      .uleb128  0x1c
       .align 2
 .LEFDE1:
 #endif
--- libffi/src/powerpc/ppc_closure.S.jj	2003-04-08 08:24:22.000000000 -0400
+++ libffi/src/powerpc/ppc_closure.S	2003-04-23 12:37:37.000000000 -0400
@@ -197,36 +197,51 @@ ENTRY(ffi_closure_SYSV)
 	blr
 END(ffi_closure_SYSV)
 
-	.section	".eh_frame","aw"
-__FRAME_BEGIN__:
+	.section	".eh_frame",EH_FRAME_FLAGS,@progbits
+.Lframe1:
 	.4byte	.LECIE1-.LSCIE1	 # Length of Common Information Entry
 .LSCIE1:
 	.4byte	0x0	 # CIE Identifier Tag
 	.byte	0x1	 # CIE Version
+#if defined _RELOCATABLE || defined __PIC__
+	.ascii "zR\0"	 # CIE Augmentation
+#else
 	.ascii "\0"	 # CIE Augmentation
-	.byte	0x1	 # uleb128 0x1; CIE Code Alignment Factor
-	.byte	0x7c	 # sleb128 -4; CIE Data Alignment Factor
+#endif
+	.uleb128 0x1	 # CIE Code Alignment Factor
+	.sleb128 -4	 # CIE Data Alignment Factor
 	.byte	0x41	 # CIE RA Column
+#if defined _RELOCATABLE || defined __PIC__
+	.uleb128 0x1	 # Augmentation size
+	.byte	0x1b	 # FDE Encoding (pcrel sdata4)
+#endif
 	.byte	0xc	 # DW_CFA_def_cfa
-	.byte	0x1	 # uleb128 0x1
-	.byte	0x0	 # uleb128 0x0
+	.uleb128 0x1
+	.uleb128 0x0
 	.align 2
 .LECIE1:
 .LSFDE1:
 	.4byte	.LEFDE1-.LASFDE1	 # FDE Length
 .LASFDE1:
-	.4byte	.LASFDE1-__FRAME_BEGIN__	 # FDE CIE offset
+	.4byte	.LASFDE1-.Lframe1	 # FDE CIE offset
+#if defined _RELOCATABLE || defined __PIC__
+	.4byte	.LFB1-.	 # FDE initial location
+#else
 	.4byte	.LFB1	 # FDE initial location
+#endif
 	.4byte	.LFE1-.LFB1	 # FDE address range
+#if defined _RELOCATABLE || defined __PIC__
+	.uleb128 0x0	 # Augmentation size
+#endif
 	.byte	0x4	 # DW_CFA_advance_loc4
 	.4byte	.LCFI0-.LFB1
 	.byte	0xe	 # DW_CFA_def_cfa_offset
-	.byte	144,1	 # uleb128 144
+	.uleb128 144
 	.byte	0x4	 # DW_CFA_advance_loc4
 	.4byte	.LCFI1-.LCFI0
 	.byte	0x2f	 # DW_CFA_GNU_negative_offset_extended
-	.byte	0x41	 # uleb128 0x41
-	.byte	0x1	 # uleb128 0x1
+	.uleb128 0x41
+	.uleb128 0x1
 	.align 2
 .LEFDE1:
 
--- libffi/src/powerpc/linux64_closure.S.jj	2003-04-23 11:07:50.000000000 -0400
+++ libffi/src/powerpc/linux64_closure.S	2003-04-23 12:16:28.000000000 -0400
@@ -1,3 +1,6 @@
+#define LIBFFI_ASM
+#include <ffi.h>
+
 	.file	"linux64_closure.S"
 
 #ifdef __powerpc64__
@@ -174,7 +177,7 @@ ffi_closure_LINUX64:
 	.byte	0,12,0,1,128,0,0,0
 	.size	.ffi_closure_LINUX64,.-.ffi_closure_LINUX64
 
-	.section	.eh_frame,"aw",@progbits
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
 .Lframe1:
 	.4byte	.LECIE1-.LSCIE1	 # Length of Common Information Entry
 .LSCIE1:
--- libffi/src/powerpc/linux64.S.jj	2003-04-23 11:07:50.000000000 -0400
+++ libffi/src/powerpc/linux64.S	2003-04-23 12:16:28.000000000 -0400
@@ -141,7 +141,7 @@ ffi_call_LINUX64:
 	.byte	0,12,0,1,128,4,0,0
 	.size	.ffi_call_LINUX64,.-.ffi_call_LINUX64
 
-	.section	.eh_frame,"aw",@progbits
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
 .Lframe1:
 	.4byte	.LECIE1-.LSCIE1	 # Length of Common Information Entry
 .LSCIE1:
--- libffi/src/sparc/v8.S.jj	2003-01-17 13:20:16.000000000 -0500
+++ libffi/src/sparc/v8.S	2003-04-23 12:16:28.000000000 -0400
@@ -170,7 +170,11 @@ done1:
 #define uanword	uaword
 #endif
 
+#ifdef HAVE_RO_EH_FRAME
+	.section	".eh_frame",#alloc
+#else
 	.section	".eh_frame",#alloc,#write
+#endif
 .LLframe1:
 	.uaword	.LLECIE1-.LLSCIE1	! Length of Common Information Entry
 .LLSCIE1:
--- libffi/src/sparc/v9.S.jj	2003-01-17 13:20:16.000000000 -0500
+++ libffi/src/sparc/v9.S	2003-04-23 12:16:28.000000000 -0400
@@ -207,7 +207,11 @@ longdouble1:
 .ffi_closure_v9_end:
 	.size	ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9
 
+#ifdef HAVE_RO_EH_FRAME
+	.section	".eh_frame",#alloc
+#else
 	.section	".eh_frame",#alloc,#write
+#endif
 .LLframe1:
 	.uaword	.LLECIE1-.LLSCIE1	! Length of Common Information Entry
 .LLSCIE1:
--- libffi/src/x86/unix64.S.jj	2003-04-08 08:24:22.000000000 -0400
+++ libffi/src/x86/unix64.S	2003-04-23 12:16:28.000000000 -0400
@@ -237,7 +237,7 @@ ffi_closure_UNIX64:
 	ret
 .LFE2:	
 		
-        .section        .eh_frame,"a",@progbits
+        .section        .eh_frame,EH_FRAME_FLAGS,@progbits
 .Lframe0:
         .long   .LECIE1-.LSCIE1
 .LSCIE1:
--- libffi/src/x86/sysv.S.jj	2002-10-05 16:14:07.000000000 -0400
+++ libffi/src/x86/sysv.S	2003-04-23 12:39:35.000000000 -0400
@@ -129,41 +129,55 @@ epilogue:
 .ffi_call_SYSV_end:
         .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
 
-.section	.eh_frame,"aw",@progbits
-__FRAME_BEGIN__:
-	.4byte	.LLCIE1
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
+.Lframe1:
+	.long	.LECIE1-.LSCIE1	# Length of Common Information Entry
 .LSCIE1:
-	.4byte	0x0
-	.byte	0x1
-	.byte	0x0
-	.byte	0x1
-	.byte	0x7c
-	.byte	0x8
-	.byte	0xc
-	.byte	0x4
-	.byte	0x4
-	.byte	0x88
-	.byte	0x1
+	.long	0x0	# CIE Identifier Tag
+	.byte	0x1	# CIE Version
+#ifdef __PIC__
+	.ascii "zR\0"	# CIE Augmentation
+#else
+	.ascii "\0"	# CIE Augmentation
+#endif
+	.uleb128 0x1	# CIE Code Alignment Factor
+	.sleb128 -4	# CIE Data Alignment Factor
+	.byte	0x8	# CIE RA Column
+#ifdef __PIC__
+	.uleb128 0x1	# Augmentation size
+	.byte	0x1b	# FDE Encoding (pcrel sdata4)
+#endif
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0x4
+	.uleb128 0x4
+	.byte	0x88	# DW_CFA_offset, column 0x8
+	.uleb128 0x1
 	.align 4
 .LECIE1:
-	.set	.LLCIE1,.LECIE1-.LSCIE1
-	.4byte	.LLFDE1
 .LSFDE1:
-	.4byte	.LSFDE1-__FRAME_BEGIN__
-	.4byte	.LFB1
-	.4byte	.LFE1-.LFB1
-	.byte	0x4
-	.4byte	.LCFI0-.LFB1
-	.byte	0xe
-	.byte	0x8
-	.byte	0x85
-	.byte	0x2
-	.byte	0x4
-	.4byte	.LCFI1-.LCFI0
-	.byte	0xd
-	.byte	0x5
+	.long	.LEFDE1-.LASFDE1	# FDE Length
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1	# FDE CIE offset
+#ifdef __PIC__
+	.long	.LFB1-.	# FDE initial location
+#else
+	.long	.LFB1	# FDE initial location
+#endif
+	.long	.LFE1-.LFB1	# FDE address range
+#ifdef __PIC__
+	.uleb128 0x0	# Augmentation size
+#endif
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI0-.LFB1
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI1-.LCFI0
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
 	.align 4
 .LEFDE1:
-	.set	.LLFDE1,.LEFDE1-.LSFDE1
 
 #endif /* ifndef __x86_64__ */
--- libffi/src/s390/sysv.S.jj	2003-01-17 13:06:38.000000000 -0500
+++ libffi/src/s390/sysv.S	2003-04-23 12:16:28.000000000 -0400
@@ -23,6 +23,9 @@
    OTHER DEALINGS IN THE SOFTWARE.
    ----------------------------------------------------------------------- */
 
+#define LIBFFI_ASM
+#include <ffi.h>
+
 #ifndef __s390x__
  
 .text
@@ -146,7 +149,7 @@ ffi_closure_SYSV:
 	.size	 ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
 
 
-	.section	.eh_frame,"a",@progbits
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
 .Lframe1:
 	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
 .LSCIE1:
@@ -345,7 +348,7 @@ ffi_closure_SYSV:
 
 
 
-	.section	.eh_frame,"a",@progbits
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
 .Lframe1:
 	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
 .LSCIE1:
--- libffi/configure.in.jj	2003-04-08 08:24:22.000000000 -0400
+++ libffi/configure.in	2003-04-23 12:16:28.000000000 -0400
@@ -125,6 +125,25 @@ if test x$TARGET = xSPARC; then
     fi
 fi
 
+AC_CACHE_CHECK([whether .eh_frame section should be read-only],
+    libffi_cv_ro_eh_frame, [
+	libffi_cv_ro_eh_frame=no
+	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
+	if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
+	    if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
+		libffi_cv_ro_eh_frame=yes
+	    elif grep '.section.*eh_frame.*#alloc' conftest.c \
+		 | grep -v '#write' > /dev/null; then
+		libffi_cv_ro_eh_frame=yes
+	    fi
+	fi
+	rm -f conftest.*
+    ])
+if test "x$libffi_cv_ro_eh_frame" = xyes; then
+    AC_DEFINE(HAVE_RO_EH_FRAME, 1,
+	      [Define if .eh_frame sections should be read-only.])
+fi
+
 AC_SUBST(TARGET)
 AC_SUBST(TARGETDIR)
 
--- libffi/configure.jj	2003-04-08 08:24:22.000000000 -0400
+++ libffi/configure	2003-04-23 12:16:28.000000000 -0400
@@ -3490,6 +3490,34 @@ EOF
     fi
 fi
 
+echo $ac_n "checking whether .eh_frame section should be read-only""... $ac_c" 1>&6
+echo "configure:3495: checking whether .eh_frame section should be read-only" >&5
+if eval "test \"`echo '$''{'libffi_cv_ro_eh_frame'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+	libffi_cv_ro_eh_frame=no
+	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
+	if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
+	    if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
+		libffi_cv_ro_eh_frame=yes
+	    elif grep '.section.*eh_frame.*#alloc' conftest.c \
+		 | grep -v '#write' > /dev/null; then
+		libffi_cv_ro_eh_frame=yes
+	    fi
+	fi
+	rm -f conftest.*
+    
+fi
+
+echo "$ac_t""$libffi_cv_ro_eh_frame" 1>&6
+if test "x$libffi_cv_ro_eh_frame" = xyes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_RO_EH_FRAME 1
+EOF
+
+fi
+
 
 
 
--- libffi/fficonfig.h.in.jj	2002-04-28 16:23:45.000000000 -0400
+++ libffi/fficonfig.h.in	2003-04-23 12:16:28.000000000 -0400
@@ -71,3 +71,6 @@
 
 /* Define if your assembler and linker support unaligned PC relative relocs.  */
 #undef HAVE_AS_SPARC_UA_PCREL
+
+/* Define if .eh_frame sections should be read-only. */
+#undef HAVE_RO_EH_FRAME

	Jakub



More information about the Java-patches mailing list