Problem with D_PAGED handling for ELF

Daniel Jacobowitz drow@false.org
Wed Jan 26 16:27:00 GMT 2005


On Wed, Jan 26, 2005 at 10:50:31AM +1030, Alan Modra wrote:
> On Tue, Jan 25, 2005 at 04:46:25PM -0500, Daniel Jacobowitz wrote:
> >   - Add a "minimum page size" to the ELF backend, and use that instead for
> >     this check.  Generate binaries that will work up to MAX, accept binaries
> >     designed for at least MIN.
> 
> Sounds reasonable.

How's this?  This patch allows ARM and PPC toolchains to support
binaries linked for 4K pages.

-- 
Daniel Jacobowitz

2005-01-26  Daniel Jacobowitz  <dan@codesourcery.com>

	* elf-bfd.h (struct elf_backend_data): Add minpagesize.
	* elf32-arm.c (ELF_MINPAGESIZE): Define.
	* elf32-ppc.c (ELF_MINPAGESIZE): Define.
	* elfcode.h (elf_object_p): Use minpagesize instead of
	maxpagesize.
	* elfxx-target.h (ELF_MINPAGESIZE): Default to ELF_MAXPAGESIZE.
	(elfNN_bed): Include ELF_MINPAGESIZE.

Index: bfd/elf-bfd.h
===================================================================
RCS file: /big/fsf/rsync/src-cvs/src/bfd/elf-bfd.h,v
retrieving revision 1.166
diff -u -p -r1.166 elf-bfd.h
--- bfd/elf-bfd.h	10 Dec 2004 14:04:56 -0000	1.166
+++ bfd/elf-bfd.h	26 Jan 2005 15:42:17 -0000
@@ -1,6 +1,6 @@
 /* BFD back-end data structures for ELF files.
    Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004 Free Software Foundation, Inc.
+   2002, 2003, 2004, 2005 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -551,6 +551,11 @@ struct elf_backend_data
   /* The maximum page size for this backend.  */
   bfd_vma maxpagesize;
 
+  /* The minimum page size for this backend.  An input object will not be
+     considered page aligned unless its sections are correctly aligned for
+     pages at least this large.  May be smaller than maxpagesize.  */
+  bfd_vma minpagesize;
+
   /* The BFD flags applied to sections created for dynamic linking.  */
   flagword dynamic_sec_flags;
 
Index: bfd/elf32-arm.c
===================================================================
RCS file: /big/fsf/rsync/src-cvs/src/bfd/elf32-arm.c,v
retrieving revision 1.14
diff -u -p -r1.14 elf32-arm.c
--- bfd/elf32-arm.c	31 Dec 2004 16:22:25 -0000	1.14
+++ bfd/elf32-arm.c	26 Jan 2005 15:42:19 -0000
@@ -1,5 +1,5 @@
 /* 32-bit ELF support for ARM
-   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -5695,6 +5695,7 @@ const struct elf_size_info elf32_arm_siz
 #else
 #define ELF_MAXPAGESIZE			0x8000
 #endif
+#define ELF_MINPAGESIZE			0x1000
 
 #define bfd_elf32_bfd_copy_private_bfd_data	elf32_arm_copy_private_bfd_data
 #define bfd_elf32_bfd_merge_private_bfd_data	elf32_arm_merge_private_bfd_data
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /big/fsf/rsync/src-cvs/src/bfd/elf32-ppc.c,v
retrieving revision 1.131
diff -u -p -r1.131 elf32-ppc.c
--- bfd/elf32-ppc.c	10 Dec 2004 14:04:56 -0000	1.131
+++ bfd/elf32-ppc.c	26 Jan 2005 15:42:22 -0000
@@ -1,6 +1,6 @@
 /* PowerPC-specific support for 32-bit ELF
    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004 Free Software Foundation, Inc.
+   2004, 2005 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -6176,6 +6176,7 @@ static struct bfd_elf_special_section co
 #else
 #define ELF_MAXPAGESIZE		0x10000
 #endif
+#define ELF_MINPAGESIZE		0x1000
 #define elf_info_to_howto	ppc_elf_info_to_howto
 
 #ifdef  EM_CYGNUS_POWERPC
Index: bfd/elfcode.h
===================================================================
RCS file: /big/fsf/rsync/src-cvs/src/bfd/elfcode.h,v
retrieving revision 1.61
diff -u -p -r1.61 elfcode.h
--- bfd/elfcode.h	11 Dec 2004 04:32:35 -0000	1.61
+++ bfd/elfcode.h	26 Jan 2005 15:42:25 -0000
@@ -1,6 +1,6 @@
 /* ELF executable support for BFD.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
    Written by Fred Fish @ Cygnus Support, from information published
    in "UNIX System V Release 4, Programmers Guide: ANSI C and
@@ -680,7 +680,7 @@ elf_object_p (bfd *abfd)
 	      && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
 	      && i_shdrp[shindex].sh_type != SHT_NOBITS
 	      && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
-		   % ebd->maxpagesize)
+		   % ebd->minpagesize)
 		  != 0))
 	    abfd->flags &= ~D_PAGED;
 	}
Index: bfd/elfxx-target.h
===================================================================
RCS file: /big/fsf/rsync/src-cvs/src/bfd/elfxx-target.h,v
retrieving revision 1.73
diff -u -p -r1.73 elfxx-target.h
--- bfd/elfxx-target.h	8 Oct 2004 14:53:59 -0000	1.73
+++ bfd/elfxx-target.h	26 Jan 2005 15:42:37 -0000
@@ -1,6 +1,6 @@
 /* Target definitions for NN-bit ELF
    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004 Free Software Foundation, Inc.
+   2003, 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -283,6 +283,10 @@
 #define ELF_MAXPAGESIZE 1
 #endif
 
+#ifndef ELF_MINPAGESIZE
+#define ELF_MINPAGESIZE ELF_MAXPAGESIZE
+#endif
+
 #ifndef ELF_DYNAMIC_SEC_FLAGS
 /* Note that we set the SEC_IN_MEMORY flag for these sections.  */
 #define ELF_DYNAMIC_SEC_FLAGS			\
@@ -519,6 +523,7 @@ static const struct elf_backend_data elf
   ELF_ARCH,			/* arch */
   ELF_MACHINE_CODE,		/* elf_machine_code */
   ELF_MAXPAGESIZE,		/* maxpagesize */
+  ELF_MINPAGESIZE,		/* minpagesize */
   ELF_DYNAMIC_SEC_FLAGS,        /* dynamic_sec_flags */
   elf_info_to_howto,
   elf_info_to_howto_rel,



More information about the Binutils mailing list