[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