This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFC: Change x86-64 maximum page size to 2MB


On Fri, May 19, 2006 at 10:12:01AM +0100, Nick Clifton wrote:
> Hi H. J.
> 
> >The current x86-64 maximum page size is 1MB. With the future
> >development, 2MB is better for performance. Using 2MB won't break
> >anything, except for up to 2MB gap in virtual address space per file,
> >instead of 1MB. x86-64 has 48 bits in virtual address space. It
> >shouldn't be an issue for most applications. I have a patch:
> >
> >http://sourceware.org/ml/binutils/2005-05/msg00644.html
> >
> >which can be used to implement "-z max-page-size=xxxx" so that people
> >can control maximum page size at the link time if they prefer different
> >maximum page size.
> 
> This seems to be perfectly reasonable.


Here is the patch to implement "-z max-page-size=xxxx" and
"-z common-page-size=xxxx".


H.J.
----
bfd/

2006-05-22  H.J. Lu  <hongjiu.lu@intel.com>

	* bfd.c (bfd_emul_get_maxpagesize): New.
	(bfd_elf_set_pagesize): Likewise.
	(bfd_emul_set_maxpagesize): Likewise.
	(bfd_emul_get_commonpagesize): Likewise.
	(bfd_emul_set_commonpagesize): Likewise.

	* elf-bfd.h (elf_backend_data): Add commonpagesize.
	(xvec_get_elf_backend_data): New.
	(get_elf_backend_data): Use xvec_get_elf_backend_data.

	* elf.c (assign_file_positions_for_load_sections): Set
	p->p_vaddr with  m->p_vaddr if it is valid. Set p->p_align with
	m->p_align if it is valid. Adjust and check p->p_vaddr and
	p->p_paddr only if needed.
	(copy_elf_program_header): Copy p_vaddr and p_align. Set
	p_vaddr_valid and p_align_valid to 1.

	* elf32-arm.c (elf32_arm_vxworks_bed): Remove const.
	* elfxx-target.h (elfNN_bed): Likewise.

	* elf32-arm.c (ELF_COMMONPAGESIZE): Defined.
	* elf32-mips.c (ELF_COMMONPAGESIZE): Likewise.
	* elf32-ppc.c (ELF_COMMONPAGESIZE): Likewise.
	* elf32-sh.c (ELF_COMMONPAGESIZE): Likewise.
	* elf32-sh64.c (ELF_COMMONPAGESIZE): Likewise.
	* elf32-sparc.c (ELF_COMMONPAGESIZE): Likewise.
	* elf64-alpha.c (ELF_COMMONPAGESIZE): Likewise.
	* elf64-ppc.c (ELF_COMMONPAGESIZE): Likewise.
	* elf64-sparc.c (ELF_COMMONPAGESIZE): Likewise.
	* elf64-x86-64.c (ELF_COMMONPAGESIZE): Likewise.
	* elfn32-mips.c (ELF_COMMONPAGESIZE): Likewise.
	* elfxx-ia64.c (ELF_COMMONPAGESIZE): Likewise.

	* elfxx-target.h (ELF_COMMONPAGESIZE): Define if not defined.
	(elfNN_bed): Initialize commonpagesize with ELF_COMMONPAGESIZE.

	* targets.c (bfd_find_target): Support NULL abfd.

include/elf/

2006-05-22  H.J. Lu  <hongjiu.lu@intel.com>

	* internal.h (elf_segment_map): Add p_vaddr, p_align,
	p_vaddr_valid and p_align_valid.

ld/

2006-05-22  H.J. Lu  <hongjiu.lu@intel.com>

	* emulparams/arcelf.sh (MAXPAGESIZE): Changed to
	"CONSTANT (MAXPAGESIZE)".
	* emulparams/armelf_nbsd.sh: Likewise.
	* emulparams/armelf_vxworks.sh: Likewise.
	* emulparams/armnto.sh: Likewise.
	* emulparams/armsymbian.sh: Likewise.
	* emulparams/crislinux.sh: Likewise.
	* emulparams/elf32_i860.sh: Likewise.
	* emulparams/elf32_i960.sh: Likewise.
	* emulparams/elf32am33lin.sh: Likewise.
	* emulparams/elf32bfinfd.sh: Likewise.
	* emulparams/elf32bmipn32-defs.sh: Likewise.
	* emulparams/elf32frvfd.sh: Likewise.
	* emulparams/elf32i370.sh: Likewise.
	* emulparams/elf32lppcnto.sh: Likewise.
	* emulparams/elf32mcore.sh: Likewise.
	* emulparams/elf32openrisc.sh: Likewise.
	* emulparams/elf32ppcnto.sh: Likewise.
	* emulparams/elf32ppcwindiss.sh: Likewise.
	* emulparams/elf32vax.sh: Likewise.
	* emulparams/elf32xc16x.sh: Likewise.
	* emulparams/elf32xc16xl.sh: Likewise.
	* emulparams/elf32xc16xs.sh: Likewise.
	* emulparams/elf64_aix.sh: Likewise.
	* emulparams/elf64hppa.sh: Likewise.
	* emulparams/elf64mmix.sh: Likewise.
	* emulparams/elf_i386_be.sh: Likewise.
	* emulparams/elf_i386_chaos.sh: Likewise.
	* emulparams/elf_i386_ldso.sh: Likewise.
	* emulparams/hppa64linux.sh: Likewise.
	* emulparams/hppalinux.sh: Likewise.
	* emulparams/hppaobsd.sh: Likewise.
	* emulparams/i386lynx.sh: Likewise.
	* emulparams/i386moss.sh: Likewise.
	* emulparams/i386nto.sh: Likewise.
	* emulparams/i386nw.sh: Likewise.
	* emulparams/m32relf_linux.sh: Likewise.
	* emulparams/m68kpsos.sh: Likewise.
	* emulparams/or32elf.sh: Likewise.
	* emulparams/pjelf.sh: Likewise.
	* emulparams/pjlelf.sh: Likewise.
	* emulparams/ppclynx.sh: Likewise.
	* emulparams/ppcnw.sh: Likewise.
	* emulparams/shelf32_nbsd.sh : Likewise.
	* emulparams/shelf_nbsd.sh: Likewise.
	* emulparams/shelf_nto.sh: Likewise.
	* emulparams/shlelf_nto.sh: Likewise.
	* emulparams/xtensa-config.sh: Likewise.

	* emulparams/armelf_linux.sh (MAXPAGESIZE): Changed to
	"CONSTANT (MAXPAGESIZE)".
	(COMMONPAGESIZE): Changed to "CONSTANT (COMMONPAGESIZE)".
	* emulparams/elf32_sparc.sh: Likewise.
	* emulparams/elf32bmip.sh: Likewise.
	* emulparams/elf32ppccommon.sh: Likewise.
	* emulparams/elf64_ia64.sh: Likewise.
	* emulparams/elf64_s390.sh: Likewise.
	* emulparams/elf64_sparc.sh: Likewise.
	* emulparams/elf64alpha.sh: Likewise.
	* emulparams/elf64ppc.sh: Likewise.
	* emulparams/elf_i386.sh: Likewise.
	* emulparams/elf_i386_vxworks.sh: Likewise.
	* emulparams/elf_s390.sh: Likewise.
	* emulparams/elf_x86_64.sh: Likewise.
	* emulparams/shlelf32_linux.sh: Likewise.
	* emulparams/shlelf_linux.sh: Likewise.

	* emulparams/elf32bmipn32.sh (COMMONPAGESIZE): Changed to
	"CONSTANT (COMMONPAGESIZE)".
	* emulparams/elf32btsmipn32.sh: Likewise.

	* emultempl/elf32.em (gld${EMULATION_NAME}_handle_option): Add
	"-z max-page-size=" and "-z common-page-size=".
	(gld${EMULATION_NAME}_list_options): Likewise.

	* ld.h (ld_config_type): Add maxpagesize and commonpagesize.

	* ld.texinfo: Document "-z max-page-size=" and
	"-z common-page-size=".

	* ldexp.c (exp_print_token): Handle CONSTANT.
	(fold_name): Likewise.
	* ldgram.y: Likewise.
	* ldlex.l: Likewise.

	* ldmain.c (main): Initiliaze config.maxpagesize and
	config.commonpagesize. Call bfd_emul_set_maxpagesize if
	config.maxpagesize isn't 0. Call bfd_emul_set_commonpagesize if
	config.commonpagesize config.maxpagesize isn't 0.

ld/testsuite/

2006-05-22  H.J. Lu  <hongjiu.lu@intel.com>

	* ld-elf/binutils.exp: New file.
	* ld-elf/maxpage.d: Likewise.
	* ld-elf/maxpage.s: Likewise.

--- binutils/bfd/bfd.c.pagesize	2006-03-16 12:37:42.000000000 -0800
+++ binutils/bfd/bfd.c	2006-05-22 12:36:40.000000000 -0700
@@ -1513,3 +1513,130 @@ bfd_preserve_finish (bfd *abfd ATTRIBUTE
      objalloc.  */
   bfd_hash_table_free (&preserve->section_htab);
 }
+
+/*
+FUNCTION
+	bfd_emul_get_maxpagesize
+
+SYNOPSIS
+ 	bfd_vma bfd_emul_get_maxpagesize (const char *);
+
+DESCRIPTION
+	Returns the maximum page size, in bytes, as determined by
+	emulation.
+
+RETURNS
+	Returns the maximum page size in bytes for ELF, abort
+	otherwise.
+*/
+
+bfd_vma
+bfd_emul_get_maxpagesize (const char *emul)
+{
+  const bfd_target *target;
+
+  target = bfd_find_target (emul, NULL);
+  if (target != NULL
+      && target->flavour == bfd_target_elf_flavour)
+    return xvec_get_elf_backend_data (target)->maxpagesize;
+
+  abort ();
+  return 0;
+}
+
+static void
+bfd_elf_set_pagesize (const bfd_target *target, bfd_vma size,
+		      int offset, const bfd_target *orig_target)
+{
+  if (target->flavour == bfd_target_elf_flavour)
+    {
+      const struct elf_backend_data *bed;
+
+      bed = xvec_get_elf_backend_data (target);
+      *((bfd_vma *) ((char *) bed + offset)) = size;
+    }
+
+  if (target->alternative_target
+      && target->alternative_target != orig_target)
+    bfd_elf_set_pagesize (target->alternative_target, size, offset,
+			  orig_target);
+}
+
+/*
+FUNCTION
+	bfd_emul_set_maxpagesize
+
+SYNOPSIS
+ 	void bfd_emul_set_maxpagesize (const char *, bfd_vma);
+
+DESCRIPTION
+	For ELF, set the maximum page size for the emulation.  It is
+	a no-op for other formats.
+
+*/
+
+void
+bfd_emul_set_maxpagesize (const char *emul, bfd_vma size)
+{
+  const bfd_target *target;
+
+  target = bfd_find_target (emul, NULL);
+  if (target)
+    bfd_elf_set_pagesize (target, size,
+			  offsetof (struct elf_backend_data,
+				    maxpagesize), target);
+}
+
+/*
+FUNCTION
+	bfd_emul_get_commonpagesize
+
+SYNOPSIS
+ 	bfd_vma bfd_emul_get_commonpagesize (const char *);
+
+DESCRIPTION
+	Returns the common page size, in bytes, as determined by
+	emulation.
+
+RETURNS
+	Returns the common page size in bytes for ELF, abort otherwise.
+*/
+
+bfd_vma
+bfd_emul_get_commonpagesize (const char *emul)
+{
+  const bfd_target *target;
+
+  target = bfd_find_target (emul, NULL);
+  if (target != NULL
+      && target->flavour == bfd_target_elf_flavour)
+    return xvec_get_elf_backend_data (target)->commonpagesize;
+
+  abort ();
+  return 0;
+}
+
+/*
+FUNCTION
+	bfd_emul_set_commonpagesize
+
+SYNOPSIS
+ 	void bfd_emul_set_commonpagesize (const char *, bfd_vma);
+
+DESCRIPTION
+	For ELF, set the common page size for the emulation.  It is
+	a no-op for other formats.
+
+*/
+
+void
+bfd_emul_set_commonpagesize (const char *emul, bfd_vma size)
+{
+  const bfd_target *target;
+
+  target = bfd_find_target (emul, NULL);
+  if (target)
+    bfd_elf_set_pagesize (target, size,
+			  offsetof (struct elf_backend_data,
+				    commonpagesize), target);
+}
--- binutils/bfd/elf-bfd.h.pagesize	2006-05-22 12:36:40.000000000 -0700
+++ binutils/bfd/elf-bfd.h	2006-05-22 12:36:40.000000000 -0700
@@ -571,6 +571,9 @@ struct elf_backend_data
      pages at least this large.  May be smaller than maxpagesize.  */
   bfd_vma minpagesize;
 
+  /* The common page size for this backend.  */
+  bfd_vma commonpagesize;
+
   /* The BFD flags applied to sections created for dynamic linking.  */
   flagword dynamic_sec_flags;
 
@@ -1193,8 +1196,11 @@ struct bfd_elf_section_data
    && (sec)->sec_info_type != ELF_INFO_TYPE_MERGE		\
    && (sec)->sec_info_type != ELF_INFO_TYPE_JUST_SYMS)
 
+#define xvec_get_elf_backend_data(xvec) \
+  ((struct elf_backend_data *) (xvec)->backend_data)
+
 #define get_elf_backend_data(abfd) \
-  ((const struct elf_backend_data *) (abfd)->xvec->backend_data)
+   xvec_get_elf_backend_data ((abfd)->xvec)
 
 /* This struct is used to pass information to routines called via
    elf_link_hash_traverse which must return failure.  */
--- binutils/bfd/elf.c.pagesize	2006-05-22 12:36:40.000000000 -0700
+++ binutils/bfd/elf.c	2006-05-22 12:45:55.000000000 -0700
@@ -4292,7 +4292,9 @@ assign_file_positions_for_load_sections 
 	  return FALSE;
 	}
 
-      if (m->count == 0)
+      if (m->p_vaddr_valid)
+	p->p_vaddr = m->p_vaddr;
+      else if (m->count == 0)
 	p->p_vaddr = 0;
       else
 	p->p_vaddr = m->sections[0]->vma;
@@ -4304,7 +4306,9 @@ assign_file_positions_for_load_sections 
       else
 	p->p_paddr = m->sections[0]->lma;
 
-      if (p->p_type == PT_LOAD
+      if (m->p_align_valid)
+	p->p_align = m->p_align;
+      else if (p->p_type == PT_LOAD
 	  && (abfd->flags & D_PAGED) != 0)
 	p->p_align = bed->maxpagesize;
       else if (m->count == 0)
@@ -4323,7 +4327,8 @@ assign_file_positions_for_load_sections 
 	  p->p_offset = 0;
 	  p->p_filesz = bed->s->sizeof_ehdr;
 	  p->p_memsz = bed->s->sizeof_ehdr;
-	  if (m->count > 0)
+	  if (m->count > 0
+	      && (!m->p_vaddr_valid || !m->p_paddr_valid))
 	    {
 	      BFD_ASSERT (p->p_type == PT_LOAD);
 
@@ -4336,7 +4341,8 @@ assign_file_positions_for_load_sections 
 		  return FALSE;
 		}
 
-	      p->p_vaddr -= off;
+	      if (! m->p_vaddr_valid)
+		p->p_vaddr -= off;
 	      if (! m->p_paddr_valid)
 		p->p_paddr -= off;
 	    }
@@ -5805,6 +5811,10 @@ copy_elf_program_header (bfd *ibfd, bfd 
       map->p_flags_valid = 1;
       map->p_paddr = segment->p_paddr;
       map->p_paddr_valid = 1;
+      map->p_vaddr = segment->p_vaddr;
+      map->p_vaddr_valid = 1;
+      map->p_align = segment->p_align;
+      map->p_align_valid = 1;
 
       /* Determine if this segment contains the ELF file header
 	 and if it contains the program headers themselves.  */
--- binutils/bfd/elf32-arm.c.pagesize	2006-05-19 06:31:20.000000000 -0700
+++ binutils/bfd/elf32-arm.c	2006-05-22 12:36:40.000000000 -0700
@@ -62,7 +62,7 @@
 #define ARM_ELF_ABI_VERSION		0
 #define ARM_ELF_OS_ABI_VERSION		ELFOSABI_ARM
 
-static const struct elf_backend_data elf32_arm_vxworks_bed;
+static struct elf_backend_data elf32_arm_vxworks_bed;
 
 /* Note: code such as elf32_arm_reloc_type_lookup expect to use e.g.
    R_ARM_PC24 as an index into this, and find the R_ARM_PC24 HOWTO
@@ -8196,6 +8196,7 @@ const struct elf_size_info elf32_arm_siz
 #define ELF_MAXPAGESIZE			0x8000
 #endif
 #define ELF_MINPAGESIZE			0x1000
+#define ELF_COMMONPAGESIZE		0x1000
 
 #define bfd_elf32_mkobject		        elf32_arm_mkobject
 
--- binutils/bfd/elf32-mips.c.pagesize	2006-03-27 09:05:27.000000000 -0800
+++ binutils/bfd/elf32-mips.c	2006-05-22 12:36:40.000000000 -0700
@@ -1599,6 +1599,7 @@ static const struct ecoff_debug_swap mip
 /* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses
    a value of 0x1000, and we are compatible.  */
 #define ELF_MAXPAGESIZE			0x1000
+#define ELF_COMMONPAGESIZE		0x1000
 
 #include "elf32-target.h"
 
--- binutils/bfd/elf32-ppc.c.pagesize	2006-05-19 06:31:20.000000000 -0700
+++ binutils/bfd/elf32-ppc.c	2006-05-22 12:36:40.000000000 -0700
@@ -7436,6 +7436,7 @@ ppc_elf_finish_dynamic_sections (bfd *ou
 #define ELF_MAXPAGESIZE		0x10000
 #endif
 #define ELF_MINPAGESIZE		0x1000
+#define ELF_COMMONPAGESIZE	0x1000
 #define elf_info_to_howto	ppc_elf_info_to_howto
 
 #ifdef  EM_CYGNUS_POWERPC
--- binutils/bfd/elf32-sh.c.pagesize	2006-03-16 12:37:42.000000000 -0800
+++ binutils/bfd/elf32-sh.c	2006-05-22 12:36:40.000000000 -0700
@@ -7371,6 +7371,7 @@ sh_elf_plt_sym_val (bfd_vma i, const ase
 #define	TARGET_LITTLE_NAME		"elf32-shl-nbsd"
 #undef	ELF_MAXPAGESIZE
 #define	ELF_MAXPAGESIZE			0x10000
+#undef	ELF_COMMONPAGESIZE
 #undef	elf_symbol_leading_char
 #define	elf_symbol_leading_char		0
 #undef	elf32_bed
@@ -7388,6 +7389,8 @@ sh_elf_plt_sym_val (bfd_vma i, const ase
 #define	TARGET_LITTLE_SYM		bfd_elf32_shlin_vec
 #undef	TARGET_LITTLE_NAME
 #define	TARGET_LITTLE_NAME		"elf32-sh-linux"
+#undef	ELF_COMMONPAGESIZE
+#define	ELF_COMMONPAGESIZE		0x1000
 
 #undef	elf_backend_grok_prstatus
 #define	elf_backend_grok_prstatus	elf32_shlin_grok_prstatus
--- binutils/bfd/elf32-sh64.c.pagesize	2006-05-04 10:32:30.000000000 -0700
+++ binutils/bfd/elf32-sh64.c	2006-05-22 12:36:40.000000000 -0700
@@ -785,6 +785,7 @@ static const struct bfd_elf_special_sect
 #define	TARGET_LITTLE_NAME	"elf32-sh64l-nbsd"
 #undef	ELF_MAXPAGESIZE
 #define	ELF_MAXPAGESIZE		0x10000
+#undef	ELF_COMMONPAGESIZE
 #undef	elf_symbol_leading_char
 #define	elf_symbol_leading_char	0
 #undef	elf32_bed
@@ -803,6 +804,8 @@ static const struct bfd_elf_special_sect
 #define	TARGET_LITTLE_NAME	"elf32-sh64-linux"
 #undef	elf32_bed
 #define	elf32_bed		elf32_sh64_lin_bed
+#undef	ELF_COMMONPAGESIZE
+#define	ELF_COMMONPAGESIZE	0x1000
 
 #include "elf32-target.h"
 
--- binutils/bfd/elf32-sparc.c.pagesize	2006-04-05 11:10:51.000000000 -0700
+++ binutils/bfd/elf32-sparc.c	2006-05-22 12:36:40.000000000 -0700
@@ -172,6 +172,7 @@ elf32_sparc_reloc_type_class (const Elf_
 #define ELF_MACHINE_CODE EM_SPARC
 #define ELF_MACHINE_ALT1 EM_SPARC32PLUS
 #define ELF_MAXPAGESIZE 0x10000
+#define ELF_COMMONPAGESIZE 0x2000
 
 #define bfd_elf32_bfd_merge_private_bfd_data \
 					elf32_sparc_merge_private_bfd_data
--- binutils/bfd/elf64-alpha.c.pagesize	2006-03-16 12:37:42.000000000 -0800
+++ binutils/bfd/elf64-alpha.c	2006-05-22 12:36:40.000000000 -0700
@@ -5231,6 +5231,7 @@ static const struct elf_size_info alpha_
 #define ELF_ARCH		bfd_arch_alpha
 #define ELF_MACHINE_CODE	EM_ALPHA
 #define ELF_MAXPAGESIZE	0x10000
+#define ELF_COMMONPAGESIZE	0x2000
 
 #define bfd_elf64_bfd_link_hash_table_create \
   elf64_alpha_bfd_link_hash_table_create
--- binutils/bfd/elf64-ppc.c.pagesize	2006-05-11 08:52:56.000000000 -0700
+++ binutils/bfd/elf64-ppc.c	2006-05-22 12:36:40.000000000 -0700
@@ -61,6 +61,7 @@ static bfd_vma opd_entry_value
 #define ELF_ARCH		bfd_arch_powerpc
 #define ELF_MACHINE_CODE	EM_PPC64
 #define ELF_MAXPAGESIZE		0x10000
+#define ELF_COMMONPAGESIZE	0x1000
 #define elf_info_to_howto	ppc64_elf_info_to_howto
 
 #define elf_backend_want_got_sym 0
--- binutils/bfd/elf64-sparc.c.pagesize	2005-05-04 11:17:48.000000000 -0700
+++ binutils/bfd/elf64-sparc.c	2006-05-22 12:36:40.000000000 -0700
@@ -814,6 +814,7 @@ const struct elf_size_info elf64_sparc_s
 #define TARGET_BIG_NAME	"elf64-sparc"
 #define ELF_ARCH	bfd_arch_sparc
 #define ELF_MAXPAGESIZE 0x100000
+#define ELF_COMMONPAGESIZE 0x2000
 
 /* This is the official ABI value.  */
 #define ELF_MACHINE_CODE EM_SPARCV9
--- binutils/bfd/elf64-x86-64.c.pagesize	2006-03-27 09:05:29.000000000 -0800
+++ binutils/bfd/elf64-x86-64.c	2006-05-22 12:36:40.000000000 -0700
@@ -3631,6 +3631,7 @@ static const struct bfd_elf_special_sect
 #define ELF_ARCH			    bfd_arch_i386
 #define ELF_MACHINE_CODE		    EM_X86_64
 #define ELF_MAXPAGESIZE			    0x100000
+#define ELF_COMMONPAGESIZE		    0x1000
 
 #define elf_backend_can_gc_sections	    1
 #define elf_backend_can_refcount	    1
--- binutils/bfd/elfn32-mips.c.pagesize	2005-12-05 14:28:41.000000000 -0800
+++ binutils/bfd/elfn32-mips.c	2006-05-22 12:36:40.000000000 -0700
@@ -2384,6 +2384,7 @@ static const struct ecoff_debug_swap mip
    a value of 0x1000, and we are compatible.
    FIXME: How does this affect NewABI?  */
 #define ELF_MAXPAGESIZE			0x1000
+#define ELF_COMMONPAGESIZE		0x1000
 
 #include "elf32-target.h"
 
--- binutils/bfd/elfxx-ia64.c.pagesize	2006-05-19 07:08:21.000000000 -0700
+++ binutils/bfd/elfxx-ia64.c	2006-05-22 12:36:40.000000000 -0700
@@ -5717,6 +5717,7 @@ elfNN_hpux_backend_symbol_processing (bf
 #define ELF_MACHINE_ALT1		1999	/* EAS2.3 */
 #define ELF_MACHINE_ALT2		1998	/* EAS2.2 */
 #define ELF_MAXPAGESIZE			0x10000	/* 64KB */
+#define ELF_COMMONPAGESIZE		0x4000	/* 16KB */
 
 #define elf_backend_section_from_shdr \
 	elfNN_ia64_section_from_shdr
@@ -5824,6 +5825,7 @@ elfNN_hpux_backend_symbol_processing (bf
 
 #undef  ELF_MAXPAGESIZE
 #define ELF_MAXPAGESIZE                 0x1000  /* 4K */
+#undef ELF_COMMONPAGESIZE
 
 #undef  elfNN_bed
 #define elfNN_bed elfNN_ia64_hpux_bed
--- binutils/bfd/elfxx-target.h.pagesize	2006-04-25 14:35:45.000000000 -0700
+++ binutils/bfd/elfxx-target.h	2006-05-22 12:36:40.000000000 -0700
@@ -294,6 +294,10 @@
 #define ELF_MINPAGESIZE ELF_MAXPAGESIZE
 #endif
 
+#ifndef ELF_COMMONPAGESIZE
+#define ELF_COMMONPAGESIZE 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			\
@@ -556,12 +560,13 @@
 extern const struct elf_size_info _bfd_elfNN_size_info;
 
 #ifndef INCLUDED_TARGET_FILE
-static const struct elf_backend_data elfNN_bed =
+static struct elf_backend_data elfNN_bed =
 {
   ELF_ARCH,			/* arch */
   ELF_MACHINE_CODE,		/* elf_machine_code */
   ELF_MAXPAGESIZE,		/* maxpagesize */
   ELF_MINPAGESIZE,		/* minpagesize */
+  ELF_COMMONPAGESIZE,		/* commonpagesize */
   ELF_DYNAMIC_SEC_FLAGS,	/* dynamic_sec_flags */
   elf_info_to_howto,
   elf_info_to_howto_rel,
--- binutils/bfd/targets.c.pagesize	2006-04-05 11:10:51.000000000 -0700
+++ binutils/bfd/targets.c	2006-05-22 12:36:40.000000000 -0700
@@ -1307,14 +1307,15 @@ SYNOPSIS
 
 DESCRIPTION
 	Return a pointer to the transfer vector for the object target
-	named @var{target_name}.  If @var{target_name} is <<NULL>>, choose the
-	one in the environment variable <<GNUTARGET>>; if that is null or not
-	defined, then choose the first entry in the target list.
-	Passing in the string "default" or setting the environment
-	variable to "default" will cause the first entry in the target
-	list to be returned, and "target_defaulted" will be set in the
-	BFD.  This causes <<bfd_check_format>> to loop over all the
-	targets to find the one that matches the file being read.
+	named @var{target_name}.  If @var{target_name} is <<NULL>>,
+	choose the one in the environment variable <<GNUTARGET>>; if
+	that is null or not defined, then choose the first entry in the
+	target list.  Passing in the string "default" or setting the
+	environment variable to "default" will cause the first entry in
+	the target list to be returned, and "target_defaulted" will be
+	set in the BFD if @var{abfd} isn't <<NULL>>.  This causes
+	<<bfd_check_format>> to loop over all the targets to find the
+	one that matches the file being read.
 */
 
 const bfd_target *
@@ -1331,21 +1332,27 @@ bfd_find_target (const char *target_name
   /* This is safe; the vector cannot be null.  */
   if (targname == NULL || strcmp (targname, "default") == 0)
     {
-      abfd->target_defaulted = TRUE;
       if (bfd_default_vector[0] != NULL)
-	abfd->xvec = bfd_default_vector[0];
+	target = bfd_default_vector[0];
       else
-	abfd->xvec = bfd_target_vector[0];
-      return abfd->xvec;
+	target = bfd_target_vector[0];
+      if (abfd)
+	{
+	  abfd->xvec = target;
+	  abfd->target_defaulted = TRUE;
+	}
+      return target;
     }
 
-  abfd->target_defaulted = FALSE;
+  if (abfd)
+    abfd->target_defaulted = FALSE;
 
   target = find_target (targname);
   if (target == NULL)
     return NULL;
 
-  abfd->xvec = target;
+  if (abfd)
+    abfd->xvec = target;
   return target;
 }
 
--- binutils/include/elf/internal.h.pagesize	2006-02-10 08:59:44.000000000 -0800
+++ binutils/include/elf/internal.h	2006-05-22 12:47:06.000000000 -0700
@@ -235,12 +235,22 @@ struct elf_segment_map
   unsigned long p_flags;
   /* Program segment physical address.  */
   bfd_vma p_paddr;
+  /* Program segment virtual address.  */
+  bfd_vma p_vaddr;
+  /* Program segment alignment. */
+  bfd_vma p_align;
   /* Whether the p_flags field is valid; if not, the flags are based
      on the section flags.  */
   unsigned int p_flags_valid : 1;
   /* Whether the p_paddr field is valid; if not, the physical address
      is based on the section lma values.  */
   unsigned int p_paddr_valid : 1;
+  /* Whether the p_vaddr field is valid; if not, the virtual address
+     is based on the section vma values.  */
+  unsigned int p_vaddr_valid : 1;
+  /* Whether the p_align field is valid; if not, the segment alignment
+     is based on the default maximum page size.  */
+  unsigned int p_align_valid : 1;
   /* Whether this segment includes the file header.  */
   unsigned int includes_filehdr : 1;
   /* Whether this segment includes the program headers.  */
--- binutils/ld/emulparams/arcelf.sh.pagesize	2006-05-19 09:31:04.000000000 -0700
+++ binutils/ld/emulparams/arcelf.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,7 +3,7 @@ OUTPUT_FORMAT="elf32-littlearc"
 LITTLE_OUTPUT_FORMAT="elf32-littlearc"
 BIG_OUTPUT_FORMAT="elf32-bigarc"
 TEXT_START_ADDR=0x0
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x0
 ARCH=arc
 MACHINE=
--- binutils/ld/emulparams/armelf_linux.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/armelf_linux.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,8 +3,8 @@ SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-littlearm"
 BIG_OUTPUT_FORMAT="elf32-bigarm"
 LITTLE_OUTPUT_FORMAT="elf32-littlearm"
-MAXPAGESIZE=0x8000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 TEMPLATE_NAME=elf32
 EXTRA_EM_FILE=armelf
 GENERATE_SHLIB_SCRIPT=yes
--- binutils/ld/emulparams/armelf_nbsd.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/armelf_nbsd.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,5 +1,5 @@
 . ${srcdir}/emulparams/armelf.sh
-MAXPAGESIZE=0x8000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TEXT_START_ADDR=0x00008000
 TARGET2_TYPE=got-rel
 
--- binutils/ld/emulparams/armelf_vxworks.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/armelf_vxworks.sh	2006-05-22 12:36:40.000000000 -0700
@@ -2,5 +2,5 @@
 OUTPUT_FORMAT="elf32-littlearm-vxworks"
 BIG_OUTPUT_FORMAT="elf32-bigarm-vxworks"
 LITTLE_OUTPUT_FORMAT="$OUTPUT_FORMAT"
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 . ${srcdir}/emulparams/vxworks.sh
--- binutils/ld/emulparams/armnto.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/armnto.sh	2006-05-22 12:36:40.000000000 -0700
@@ -17,7 +17,7 @@ GENERATE_SHLIB_SCRIPT=yes
 
 ARCH=arm
 MACHINE=
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 
 ENTRY=_start
 
--- binutils/ld/emulparams/armsymbian.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/armsymbian.sh	2006-05-22 12:36:40.000000000 -0700
@@ -19,7 +19,4 @@ OTHER_READONLY_SECTIONS="
   ${RELOCATING+ __exidx_end = .; }
   ${RELOCATING+ .ARM.exidx\$\$Limit = . ; }"
 
-# This value should match ELF_MAXPAGESIZE in BFD.  Otherwise, elf.c
-# will not place read-write sections in a separate ELF segment from
-# the read-only sections.
-MAXPAGESIZE=0x8000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
--- binutils/ld/emulparams/bfin.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/bfin.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-bfin"
 TEXT_START_ADDR=0x0
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TARGET_PAGE_SIZE=0x1000
 NONPAGED_TEXT_START_ADDR=${TEXT_START_ADDR}
 ARCH=bfin
--- binutils/ld/emulparams/crislinux.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/crislinux.sh	2006-05-22 12:36:40.000000000 -0700
@@ -14,7 +14,7 @@ GENERATE_SHLIB_SCRIPT=yes
 # Is this high enough and low enough?
 TEXT_START_ADDR=0x80000
 
-MAXPAGESIZE=8192
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 
 # We don't do the hoops through DEFINED to provide [_]*start, as it
 # doesn't work with --gc-sections, and the start-name is pretty fixed
--- binutils/ld/emulparams/elf32_i860.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32_i860.sh	2006-05-22 12:36:40.000000000 -0700
@@ -5,5 +5,5 @@ BIG_OUTPUT_FORMAT="elf32-i860"
 LITTLE_OUTPUT_FORMAT="elf32-i860-little"
 TEXT_START_ADDR=0
 PAGE_SIZE=0x1000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=i860
--- binutils/ld/emulparams/elf32_i960.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32_i960.sh	2006-05-22 12:36:40.000000000 -0700
@@ -5,4 +5,4 @@ ARCH=i960
 MACHINE=
 TEXT_START_ADDR=0
 EMBEDDED=yes
-MAXPAGESIZE=0x2000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
--- binutils/ld/emulparams/elf32_sparc.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32_sparc.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,8 +1,8 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-sparc"
 TEXT_START_ADDR=0x10000
-MAXPAGESIZE=0x10000
-COMMONPAGESIZE=0x2000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x10000
 ALIGNMENT=8
 ARCH=sparc
--- binutils/ld/emulparams/elf32am33lin.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32am33lin.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-am33lin"
 TEXT_START_ADDR=0x8000000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x8000000
 ARCH=mn10300
 MACHINE=
--- binutils/ld/emulparams/elf32bfinfd.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32bfinfd.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 . ${srcdir}/emulparams/bfin.sh
 unset STACK_ADDR
 OUTPUT_FORMAT="elf32-bfinfdpic"
-MAXPAGESIZE=0x4000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TEMPLATE_NAME=elf32
 GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
--- binutils/ld/emulparams/elf32bmip.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32bmip.sh	2006-05-22 12:36:40.000000000 -0700
@@ -7,8 +7,8 @@ BIG_OUTPUT_FORMAT="elf32-bigmips"
 LITTLE_OUTPUT_FORMAT="elf32-littlemips"
 TEXT_START_ADDR=0x0400000
 test -n "${EMBEDDED}" || DATA_ADDR=0x10000000
-MAXPAGESIZE=0x40000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x0400000
 SHLIB_TEXT_START_ADDR=0x5ffe0000
 TEXT_DYNAMIC=
--- binutils/ld/emulparams/elf32bmipn32-defs.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32bmipn32-defs.sh	2006-05-22 12:36:40.000000000 -0700
@@ -33,7 +33,7 @@ GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
 
 TEXT_START_ADDR=0x10000000
-MAXPAGESIZE=0x100000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ENTRY=__start
 
 # GOT-related settings.  
--- binutils/ld/emulparams/elf32bmipn32.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32bmipn32.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,7 +3,7 @@ OUTPUT_FORMAT="elf32-nbigmips"
 BIG_OUTPUT_FORMAT="elf32-nbigmips"
 LITTLE_OUTPUT_FORMAT="elf32-nlittlemips"
 SHLIB_TEXT_START_ADDR=0x5ffe0000
-COMMONPAGESIZE=0x1000
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 
 # IRIX6 defines these symbols.  0x34 is the size of the ELF header.
 EXECUTABLE_SYMBOLS="
--- binutils/ld/emulparams/elf32btsmipn32.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32btsmipn32.sh	2006-05-22 12:36:40.000000000 -0700
@@ -5,7 +5,7 @@
 OUTPUT_FORMAT="elf32-ntradbigmips"
 BIG_OUTPUT_FORMAT="elf32-ntradbigmips"
 LITTLE_OUTPUT_FORMAT="elf32-ntradlittlemips"
-COMMONPAGESIZE=0x1000
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 
 # Magic sections.
 OTHER_TEXT_SECTIONS='*(.mips16.fn.*) *(.mips16.call.*)'
--- binutils/ld/emulparams/elf32frvfd.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32frvfd.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 . ${srcdir}/emulparams/elf32frv.sh
 unset STACK_ADDR
 OUTPUT_FORMAT="elf32-frvfdpic"
-MAXPAGESIZE=0x4000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TEMPLATE_NAME=elf32
 GENERATE_SHLIB_SCRIPT=yes
 GENERATE_PIE_SCRIPT=yes
--- binutils/ld/emulparams/elf32i370.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32i370.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,6 +3,6 @@ GENERATE_SHLIB_SCRIPT=yes
 SCRIPT_NAME=elfi370
 OUTPUT_FORMAT="elf32-i370"
 TEXT_START_ADDR=0x01800000
-MAXPAGESIZE=0x40000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=i370
 MACHINE=
--- binutils/ld/emulparams/elf32lppcnto.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32lppcnto.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,5 +1,5 @@
 . ${srcdir}/emulparams/elf32ppc.sh
 OUTPUT_FORMAT="elf32-powerpcle"
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TEXT_START_ADDR=0x48040000
 
--- binutils/ld/emulparams/elf32mcore.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32mcore.sh	2006-05-22 12:36:40.000000000 -0700
@@ -4,7 +4,7 @@ BIG_OUTPUT_FORMAT="elf32-mcore-big"
 LITTLE_OUTPUT_FORMAT="elf32-mcore-little"
 PAGE_SIZE=0x1000
 TARGET_PAGE_SIZE=0x400
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TEXT_START_ADDR=0
 NONPAGED_TEXT_START_ADDR=0
 ARCH=mcore
--- binutils/ld/emulparams/elf32openrisc.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32openrisc.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,7 +3,7 @@ SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-openrisc"
 TEXT_START_ADDR=0x10000
 ARCH=openrisc
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ENTRY=_start
 EMBEDDED=yes
 NOP=0x15000000
--- binutils/ld/emulparams/elf32ppccommon.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32ppccommon.sh	2006-05-22 12:36:40.000000000 -0700
@@ -6,8 +6,8 @@ GENERATE_PIE_SCRIPT=yes
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-powerpc"
 TEXT_START_ADDR=0x01800000
-MAXPAGESIZE=0x10000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 ARCH=powerpc:common
 MACHINE=
 EXECUTABLE_SYMBOLS='PROVIDE (__stack = 0); PROVIDE (___stack = 0);'
--- binutils/ld/emulparams/elf32ppcnto.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32ppcnto.sh	2006-05-22 13:00:47.000000000 -0700
@@ -1,4 +1,4 @@
 . ${srcdir}/emulparams/elf32ppc.sh
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TEXT_START_ADDR=0x48040000
 
--- binutils/ld/emulparams/elf32ppcwindiss.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32ppcwindiss.sh	2006-05-22 12:36:40.000000000 -0700
@@ -4,7 +4,7 @@ OUTPUT_FORMAT="elf32-powerpc"
 ARCH=powerpc
 MACHINE=
 EMBEDDED=yes
-MAXPAGESIZE=0x10000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 
 # The data below is taken from the windiss.dld linker script that comes with
 # the Diab linker.
--- binutils/ld/emulparams/elf32vax.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32vax.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-vax"
 TEXT_START_ADDR=0x10000
-MAXPAGESIZE=0x10000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x1000
 ARCH=vax
 MACHINE=
--- binutils/ld/emulparams/elf32xc16x.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32xc16x.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,6 +3,6 @@ TEMPLATE_NAME=elf32
 OUTPUT_FORMAT="elf32-xc16x"
 TEXT_START_ADDR=0x00400
 ARCH=xc16x
-MAXPAGESIZE=256
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ENTRY=_start
 EMBEDDED=yes
--- binutils/ld/emulparams/elf32xc16xl.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32xc16xl.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,6 +3,6 @@ TEMPLATE_NAME=elf32
 OUTPUT_FORMAT="elf32-xc16x"
 TEXT_START_ADDR=0xc00300
 ARCH=xc16x:xc16xl
-MAXPAGESIZE=256
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ENTRY=_start
 EMBEDDED=yes
--- binutils/ld/emulparams/elf32xc16xs.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf32xc16xs.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,6 +3,6 @@ TEMPLATE_NAME=elf32
 OUTPUT_FORMAT="elf32-xc16x"
 TEXT_START_ADDR=0xc00300
 ARCH=xc16x:xc16xs
-MAXPAGESIZE=256
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ENTRY=_start
 EMBEDDED=yes
--- binutils/ld/emulparams/elf64_aix.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf64_aix.sh	2006-05-22 12:36:40.000000000 -0700
@@ -5,7 +5,7 @@ TEMPLATE_NAME=elf32
 OUTPUT_FORMAT="elf64-ia64-aix-little"
 ARCH=ia64
 MACHINE=
-MAXPAGESIZE=0x10000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 TEXT_START_ADDR="0x10000000"
 DATA_ADDR="ALIGN (0x10000000) + (. & (${MAXPAGESIZE} - 1))"
 GENERATE_SHLIB_SCRIPT=yes
--- binutils/ld/emulparams/elf64_ia64.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf64_ia64.sh	2006-05-22 12:36:40.000000000 -0700
@@ -6,12 +6,12 @@ EXTRA_EM_FILE=ia64elf
 OUTPUT_FORMAT="elf64-ia64-little"
 ARCH=ia64
 MACHINE=
-MAXPAGESIZE=0x10000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 # FIXME: It interferes with linker relaxation. Disable it until it is
 # fixed.
 if test "0" = "1" -a -n "$CREATE_SHLIB"; then
   # Optimize shared libraries for 16K page size
-  COMMONPAGESIZE=0x4000
+  COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 fi
 TEXT_START_ADDR="0x4000000000000000"
 DATA_ADDR="0x6000000000000000 + (. & (${MAXPAGESIZE} - 1))"
--- binutils/ld/emulparams/elf64_s390.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf64_s390.sh	2006-05-22 12:36:40.000000000 -0700
@@ -2,8 +2,8 @@ SCRIPT_NAME=elf
 ELFSIZE=64
 OUTPUT_FORMAT="elf64-s390"
 TEXT_START_ADDR=0x80000000
-MAXPAGESIZE=0x1000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x80000000
 ARCH="s390:64-bit"
 MACHINE=
--- binutils/ld/emulparams/elf64_sparc.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf64_sparc.sh	2006-05-22 12:36:40.000000000 -0700
@@ -2,8 +2,8 @@ SCRIPT_NAME=elf
 ELFSIZE=64
 TEMPLATE_NAME=elf32
 OUTPUT_FORMAT="elf64-sparc"
-MAXPAGESIZE=0x100000
-COMMONPAGESIZE=0x2000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 ARCH="sparc:v9"
 MACHINE=
 DATA_PLT=
--- binutils/ld/emulparams/elf64alpha.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf64alpha.sh	2006-05-22 12:36:40.000000000 -0700
@@ -5,8 +5,8 @@ TEMPLATE_NAME=elf32
 EXTRA_EM_FILE=alphaelf
 OUTPUT_FORMAT="elf64-alpha"
 TEXT_START_ADDR="0x120000000"
-MAXPAGESIZE=0x10000
-COMMONPAGESIZE=0x2000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 NONPAGED_TEXT_START_ADDR="0x120000000"
 ARCH=alpha
 MACHINE=
--- binutils/ld/emulparams/elf64hppa.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf64hppa.sh	2006-05-22 12:36:40.000000000 -0700
@@ -4,7 +4,7 @@ LIB_PATH="=/usr/lib/pa20_64:=/opt/langto
 TEXT_START_ADDR=0x4000000000001000
 DATA_ADDR=0x8000000000001000
 TARGET_PAGE_SIZE=4096
-MAXPAGESIZE=4096
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 
 # The HP dynamic linker actually requires you set the start of text and
 # data to some reasonable value.  Of course nobody knows what reasoanble
--- binutils/ld/emulparams/elf64mmix.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf64mmix.sh	2006-05-22 12:36:40.000000000 -0700
@@ -12,11 +12,7 @@ TEXT_START_ADDR='DEFINED (__.MMIX.start.
 TEXT_BASE_ADDRESS=$TEXT_START_ADDR
 DATA_ADDR='DEFINED (__.MMIX.start..data) ? __.MMIX.start..data : 0x2000000000000000'
 
-# Setting this anywhere near the quite reasonable value of 0x10000
-# causes the binary to bloat to reach page alignment between segments.
-# Let's just have a 256-byte default page alignment.  Having some
-# alignment at all gives a warm feeling but not much more.
-MAXPAGESIZE=256
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=mmix
 MACHINE=
 COMPILE_IN=yes
--- binutils/ld/emulparams/elf64ppc.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf64ppc.sh	2006-05-22 12:36:40.000000000 -0700
@@ -7,8 +7,8 @@ SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf64-powerpc"
 TEXT_START_ADDR=0x10000000
 #SEGMENT_SIZE=0x10000000
-MAXPAGESIZE=0x10000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 ARCH=powerpc:common64
 MACHINE=
 NOP=0x60000000
--- binutils/ld/emulparams/elf_i386.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf_i386.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,8 +1,8 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-i386"
 TEXT_START_ADDR=0x08048000
-MAXPAGESIZE=0x1000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x08048000
 ARCH=i386
 MACHINE=
--- binutils/ld/emulparams/elf_i386_be.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf_i386_be.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,7 +3,7 @@ OUTPUT_FORMAT="elf32-i386"
 TEXT_START_ADDR=0x80000000
 #SHLIB_TEXT_START_ADDR=0x80000000
 NONPAGED_TEXT_START_ADDR=0x80000000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=i386
 MACHINE=
 NOP=0x90909090
--- binutils/ld/emulparams/elf_i386_chaos.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf_i386_chaos.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=elf_chaos
 OUTPUT_FORMAT="elf32-i386"
 TEXT_START_ADDR=0x40000000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x40000000
 ARCH=i386
 MACHINE=
--- binutils/ld/emulparams/elf_i386_ldso.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf_i386_ldso.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-i386"
 TEXT_START_ADDR=0x08048000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x08048000
 ARCH=i386
 MACHINE=
--- binutils/ld/emulparams/elf_i386_vxworks.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf_i386_vxworks.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,8 +1,8 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-i386-vxworks"
 TEXT_START_ADDR=0x08048000
-MAXPAGESIZE=0x1000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x08048000
 ARCH=i386
 MACHINE=
--- binutils/ld/emulparams/elf_s390.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf_s390.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,8 +1,8 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-s390"
 TEXT_START_ADDR=0x00400000
-MAXPAGESIZE=0x1000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x00400000
 ARCH="s390:31-bit"
 MACHINE=
--- binutils/ld/emulparams/elf_x86_64.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/elf_x86_64.sh	2006-05-22 12:36:40.000000000 -0700
@@ -2,8 +2,8 @@ SCRIPT_NAME=elf
 ELFSIZE=64
 OUTPUT_FORMAT="elf64-x86-64"
 TEXT_START_ADDR=0x400000
-MAXPAGESIZE=0x100000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x400000
 ARCH="i386:x86-64"
 MACHINE=
--- binutils/ld/emulparams/hppa64linux.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/hppa64linux.sh	2006-05-22 12:36:40.000000000 -0700
@@ -7,7 +7,7 @@ ELFSIZE=64
 OUTPUT_FORMAT="elf64-hppa-linux"
 TEXT_START_ADDR=0x10000
 TARGET_PAGE_SIZE=0x10000
-MAXPAGESIZE=0x10000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=hppa
 MACHINE=hppa2.0w
 ENTRY="main"
--- binutils/ld/emulparams/hppalinux.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/hppalinux.sh	2006-05-22 12:36:40.000000000 -0700
@@ -6,7 +6,7 @@ ELFSIZE=32
 OUTPUT_FORMAT="elf32-hppa-linux"
 TEXT_START_ADDR=0x10000
 TARGET_PAGE_SIZE=0x10000
-MAXPAGESIZE=0x10000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=hppa
 MACHINE=hppa1.1    # We use 1.1 specific features.
 NOP=0x08000240
--- binutils/ld/emulparams/hppaobsd.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/hppaobsd.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,4 +3,4 @@
 OUTPUT_FORMAT="elf32-hppa"
 TEXT_START_ADDR=0x1000
 TARGET_PAGE_SIZE=0x1000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
--- binutils/ld/emulparams/i386lynx.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/i386lynx.sh	2006-05-22 12:36:40.000000000 -0700
@@ -4,7 +4,7 @@ ENTRY=_main
 TEXT_BASE=0x0
 DYN_TEXT_BASE=0x00400000
 TEXT_START_ADDR="(DEFINED(_DYNAMIC) ? ${DYN_TEXT_BASE} : ${TEXT_BASE})"
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x1000
 ARCH=i386
 MACHINE=
--- binutils/ld/emulparams/i386moss.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/i386moss.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-i386"
 TEXT_START_ADDR=0x00002000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x00002000
 ARCH=i386
 MACHINE=
--- binutils/ld/emulparams/i386nto.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/i386nto.sh	2006-05-22 12:36:40.000000000 -0700
@@ -2,7 +2,7 @@ SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-i386"
 TEXT_START_ADDR=0x08048000
 TEXT_START_SYMBOLS='_btext = .;'
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x08048000
 #SHLIB_TEXT_START_ADDR=0xb0300000
 ARCH=i386
--- binutils/ld/emulparams/i386nw.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/i386nw.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=nw
 OUTPUT_FORMAT="elf32-i386"
 TEXT_START_ADDR=0x08000000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x08000000
 ARCH=i386
 NOP=0x90909090
--- binutils/ld/emulparams/m32relf_linux.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/m32relf_linux.sh	2006-05-22 12:36:40.000000000 -0700
@@ -5,7 +5,7 @@ OUTPUT_FORMAT="elf32-m32r-linux"
 TEXT_START_ADDR=0x1000
 ARCH=m32r
 MACHINE=
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 
 # Hmmm, there's got to be a better way.  This sets the stack to the
 # top of simulator memory (32MB).
--- binutils/ld/emulparams/m68kelf.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/m68kelf.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-m68k"
 TEXT_START_ADDR=0x80000000
-MAXPAGESIZE=0x2000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=${TEXT_START_ADDR}
 ARCH=m68k
 MACHINE=
--- binutils/ld/emulparams/m68kpsos.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/m68kpsos.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,6 +1,6 @@
 SCRIPT_NAME=psos
 OUTPUT_FORMAT="elf32-m68k"
 TEXT_START_ADDR=0x20000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=m68k
 TEMPLATE_NAME=elf32
--- binutils/ld/emulparams/or32elf.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/or32elf.sh	2006-05-22 12:36:40.000000000 -0700
@@ -2,5 +2,5 @@ SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-or32"
 TEXT_START_ADDR=0x1000000
 TARGET_PAGE_SIZE=0x1000000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=or32
--- binutils/ld/emulparams/pjelf.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/pjelf.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,5 +1,5 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-pj"
 TEXT_START_ADDR=0x1000000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=pj
--- binutils/ld/emulparams/pjlelf.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/pjlelf.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,5 +1,5 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-pjl"
 TEXT_START_ADDR=0x1000000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=pj
--- binutils/ld/emulparams/ppclynx.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/ppclynx.sh	2006-05-22 12:36:40.000000000 -0700
@@ -3,7 +3,7 @@ OUTPUT_FORMAT="elf32-powerpc"
 TEXT_BASE=0x00002000
 DYN_TEXT_BASE=0x00400000
 TEXT_START_ADDR="(DEFINED(_DYNAMIC) ? ${DYN_TEXT_BASE} : ${TEXT_BASE})"
-MAXPAGESIZE=0x10000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x1000
 ARCH=powerpc
 MACHINE=
--- binutils/ld/emulparams/ppcnw.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/ppcnw.sh	2006-05-22 12:36:40.000000000 -0700
@@ -2,6 +2,6 @@ SCRIPT_NAME=nw
 OUTPUT_FORMAT="elf32-powerpc"
 TEXT_START_ADDR=0x0400000
 DATA_ADDR=0x10000000
-MAXPAGESIZE=0x40000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 NONPAGED_TEXT_START_ADDR=0x0400000
 ARCH=powerpc
--- binutils/ld/emulparams/shelf32_nbsd.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/shelf32_nbsd.sh	2006-05-22 12:36:40.000000000 -0700
@@ -5,7 +5,7 @@
 
 OUTPUT_FORMAT="elf32-sh64-nbsd"
 TEXT_START_ADDR=0x400000
-MAXPAGESIZE=0x10000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 
 ENTRY=__start
 
--- binutils/ld/emulparams/shelf_nbsd.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/shelf_nbsd.sh	2006-05-22 12:36:40.000000000 -0700
@@ -5,7 +5,7 @@
 
 OUTPUT_FORMAT="elf32-sh-nbsd"
 TEXT_START_ADDR=0x400000
-MAXPAGESIZE=0x10000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 
 DATA_START_SYMBOLS='__data_start = . ;';
 
--- binutils/ld/emulparams/shelf_nto.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/shelf_nto.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-sh"
 TEXT_START_ADDR=0x08040000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=sh
 MACHINE=
 TEMPLATE_NAME=elf32
--- binutils/ld/emulparams/shlelf32_linux.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/shlelf32_linux.sh	2006-05-22 12:36:40.000000000 -0700
@@ -4,8 +4,8 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-sh64-linux"
 TEXT_START_ADDR=0x400000
-MAXPAGESIZE=0x10000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 ARCH=sh
 MACHINE=sh5
 ALIGNMENT=8
--- binutils/ld/emulparams/shlelf_linux.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/shlelf_linux.sh	2006-05-22 12:36:40.000000000 -0700
@@ -4,8 +4,8 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-sh-linux"
 TEXT_START_ADDR=0x400000
-MAXPAGESIZE=0x10000
-COMMONPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 ARCH=sh
 MACHINE=
 TEMPLATE_NAME=elf32
--- binutils/ld/emulparams/shlelf_nto.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/shlelf_nto.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,7 +1,7 @@
 SCRIPT_NAME=elf
 OUTPUT_FORMAT="elf32-shl"
 TEXT_START_ADDR=0x08040000
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ARCH=sh
 MACHINE=
 TEMPLATE_NAME=elf32
--- binutils/ld/emulparams/xtensa-config.sh.pagesize	2006-05-19 09:31:05.000000000 -0700
+++ binutils/ld/emulparams/xtensa-config.sh	2006-05-22 12:36:40.000000000 -0700
@@ -1,3 +1,3 @@
 # Xtensa configuration settings.
 
-MAXPAGESIZE=0x1000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
--- binutils/ld/emultempl/elf32.em.pagesize	2006-04-14 14:44:47.000000000 -0700
+++ binutils/ld/emultempl/elf32.em	2006-05-22 12:36:40.000000000 -0700
@@ -1846,6 +1846,22 @@ cat >>e${EMULATION_NAME}.c <<EOF
 	link_info.relro = TRUE;
       else if (strcmp (optarg, "norelro") == 0)
 	link_info.relro = FALSE;
+      else if (strncmp (optarg, "max-page-size=", 14) == 0)
+	{
+	  char *end;
+	  config.maxpagesize = strtoul (optarg + 14, &end, 0);
+	  if (*end)
+	    einfo (_("%P%F: invalid maxium page size \`%s'\n"),
+		   optarg + 14);
+	}
+      else if (strncmp (optarg, "common-page-size=", 17) == 0)
+	{
+	  char *end;
+	  config.commonpagesize = strtoul (optarg + 17, &end, 0);
+	  if (*end)
+	    einfo (_("%P%F: invalid common page size \`%s'\n"),
+		   optarg + 17);
+	}
       /* What about the other Solaris -z options? FIXME.  */
       break;
 EOF
@@ -1897,6 +1913,8 @@ cat >>e${EMULATION_NAME}.c <<EOF
   fprintf (file, _("  -z now\t\tMark object non-lazy runtime binding\n"));
   fprintf (file, _("  -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t  at runtime\n"));
   fprintf (file, _("  -z relro\t\tCreate RELRO program header\n"));
+  fprintf (file, _("  -z max-page-size=SIZE\tSet maximum page size to SIZE\n"));
+  fprintf (file, _("  -z common-page-size=SIZE\n\t\t\tSet common page size to SIZE\n"));
   fprintf (file, _("  -z KEYWORD\t\tIgnored for Solaris compatibility\n"));
 EOF
 fi
--- binutils/ld/ld.h.pagesize	2005-09-30 08:45:16.000000000 -0700
+++ binutils/ld/ld.h	2006-05-22 12:36:40.000000000 -0700
@@ -270,6 +270,12 @@ typedef struct {
 
   /* The size of the hash table to use.  */
   bfd_size_type hash_table_size;
+
+  /* The maximum page size for ELF.  */
+  bfd_vma maxpagesize;
+
+  /* The common page size for ELF.  */
+  bfd_vma commonpagesize;
 } ld_config_type;
 
 extern ld_config_type config;
--- binutils/ld/ld.texinfo.pagesize	2006-05-19 06:31:21.000000000 -0700
+++ binutils/ld/ld.texinfo	2006-05-22 12:36:40.000000000 -0700
@@ -1007,6 +1007,12 @@ Marks the object may contain $ORIGIN.
 @item relro
 Create an ELF @code{PT_GNU_RELRO} segment header in the object.
 
+@item max-page-size=@var{value}
+Set the emulation maximum page size to @var{value}.
+
+@item common-page-size=@var{value}
+Set the emulation common page size to @var{value}.
+
 @end table
 
 Other keywords are ignored for Solaris compatibility.  
--- binutils/ld/ldexp.c.pagesize	2005-12-08 07:06:38.000000000 -0800
+++ binutils/ld/ldexp.c	2006-05-22 13:16:55.000000000 -0700
@@ -99,6 +99,7 @@ exp_print_token (token_code_type code, i
     { SIZEOF, "SIZEOF" },
     { ADDR, "ADDR" },
     { LOADADDR, "LOADADDR" },
+    { CONSTANT, "CONSTANT" },
     { MAX_K, "MAX_K" },
     { REL, "relocatable" },
     { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
@@ -623,6 +624,16 @@ fold_name (etree_type *tree)
       }
       break;
 
+    case CONSTANT:
+      if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
+	new_abs (bfd_emul_get_maxpagesize (default_target));
+      else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
+	new_abs (bfd_emul_get_commonpagesize (default_target));
+      else
+	einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
+	       tree->name.name);
+      break;
+
     default:
       FAIL ();
       break;
--- binutils/ld/ldgram.y.pagesize	2005-10-15 07:58:32.000000000 -0700
+++ binutils/ld/ldgram.y	2006-05-22 12:36:40.000000000 -0700
@@ -152,6 +152,7 @@ static int error_index;
 %token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
 %token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL
 %token EXCLUDE_FILE
+%token CONSTANT
 %type <versyms> vers_defns
 %type <versnode> vers_tag
 %type <deflist> verdep
@@ -841,6 +842,8 @@ exp	:
 			{ $$ = exp_nameop (ADDR,$3); }
 	|	LOADADDR '(' NAME ')'
 			{ $$ = exp_nameop (LOADADDR,$3); }
+	|	CONSTANT '(' NAME ')'
+			{ $$ = exp_nameop (CONSTANT,$3); }
 	|	ABSOLUTE '(' exp ')'
 			{ $$ = exp_unop (ABSOLUTE, $3); }
 	|	ALIGN_K '(' exp ')'
--- binutils/ld/ldlex.l.pagesize	2005-08-05 10:44:03.000000000 -0700
+++ binutils/ld/ldlex.l	2006-05-22 12:36:40.000000000 -0700
@@ -316,6 +316,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([
 <EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
 <EXPRESSION,BOTH,SCRIPT>"KEEP"		{ RTOKEN(KEEP); }
 <EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE"  { RTOKEN(EXCLUDE_FILE); }
+<EXPRESSION,BOTH,SCRIPT>"CONSTANT"	{ RTOKEN(CONSTANT);}
 <MRI>"#".*\n?			{ ++ lineno; }
 <MRI>"\n"	                { ++ lineno;  RTOKEN(NEWLINE); }
 <MRI>"*".*			{ /* Mri comment line */ }
--- binutils/ld/ldmain.c.pagesize	2006-04-06 11:56:20.000000000 -0700
+++ binutils/ld/ldmain.c	2006-05-22 13:15:26.000000000 -0700
@@ -317,6 +317,9 @@ main (int argc, char **argv)
   link_info.warn_shared_textrel = FALSE;
   link_info.gc_sections = FALSE;
 
+  config.maxpagesize = 0;
+  config.commonpagesize = 0;
+
   ldfile_add_arch ("");
 
   config.make_executable = TRUE;
@@ -335,6 +338,13 @@ main (int argc, char **argv)
   if (config.hash_table_size != 0)
     bfd_hash_set_default_size (config.hash_table_size);
 
+  if (config.maxpagesize != 0)
+    bfd_emul_set_maxpagesize (default_target, config.maxpagesize);
+
+  if (config.commonpagesize != 0)
+    bfd_emul_set_commonpagesize (default_target,
+				 config.commonpagesize);
+
   ldemul_set_symbols ();
 
   if (link_info.relocatable)
--- binutils/ld/testsuite/ld-elf/binutils.exp.pagesize	2006-05-22 12:36:40.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/binutils.exp	2006-05-22 12:36:40.000000000 -0700
@@ -0,0 +1,80 @@
+# Expect script for binutils tests
+#   Copyright 2006 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Written by H.J. Lu (hongjiu.lu@intel.com)
+#
+
+# Make sure that binutils can correctly handle ld output in ELF.
+
+# This test can only be run on ELF platforms.
+if ![is_elf_format] {
+    return
+}
+
+proc strip_test { ld_options test } {
+    global as
+    global ld
+    global READELF
+    global strip
+    global srcdir
+    global subdir
+
+    if { ![ld_assemble $as $srcdir/$subdir/$test.s tmpdir/$test.o ] } {
+	unresolved "$ld_options"
+	return
+    }
+
+    if { ![ld_simple_link $ld tmpdir/$test "$ld_options tmpdir/$test.o"] } {
+	unresolved "$ld_options"
+	return
+    }
+
+    send_log "$READELF -l --wide tmpdir/$test > tmpdir/$test.exp\n"
+    catch "exec $READELF -l --wide tmpdir/$test > tmpdir/$test.exp" got
+    if ![string match "" $got] then {
+	send_log "$got\n"
+	unresolved "$ld_options"
+	return
+    }
+
+    send_log "$strip tmpdir/$test\n"
+    catch "exec $strip tmpdir/$test" got
+    if ![string match "" $got] then {
+	send_log "$got\n"
+	unresolved "$ld_options"
+	return
+    }
+
+    send_log "$READELF -l --wide tmpdir/$test > tmpdir/$test.out\n"
+    catch "exec $READELF -l --wide tmpdir/$test > tmpdir/$test.out" got
+    if ![string match "" $got] then {
+	send_log "$got\n"
+	unresolved "$ld_options"
+	return
+    }
+
+    if { [catch {exec cmp tmpdir/$test.exp tmpdir/$test.out}] } then {
+	send_log "tmpdir/$test.exp tmpdir/$test.out differ.\n"
+	fail "$ld_options"
+	return
+    }
+
+    pass "$ld_options"
+}
+
+strip_test "-z max-page-size=0x200000" maxpage
+strip_test "-z max-page-size=0x200000 -z common-page-size=0x100000" maxpage
--- binutils/ld/testsuite/ld-elf/commonpage.d.pagesize	2006-05-22 12:36:40.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/commonpage.d	2006-05-22 12:36:40.000000000 -0700
@@ -0,0 +1,8 @@
+#source: maxpage.s
+#ld: -z max-page-size=0x200000 -z common-page-size=0x100000
+#readelf: -l --wide
+
+#...
+  LOAD+.*0x200000
+  LOAD+.*0x200000
+#pass
--- binutils/ld/testsuite/ld-elf/maxpage.d.pagesize	2006-05-22 12:36:40.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/maxpage.d	2006-05-22 12:36:40.000000000 -0700
@@ -0,0 +1,8 @@
+#source: maxpage.s
+#ld: -z max-page-size=0x200000
+#readelf: -l --wide
+
+#...
+  LOAD+.*0x200000
+  LOAD+.*0x200000
+#pass
--- binutils/ld/testsuite/ld-elf/maxpage.s.pagesize	2006-05-22 12:36:40.000000000 -0700
+++ binutils/ld/testsuite/ld-elf/maxpage.s	2006-05-22 12:36:40.000000000 -0700
@@ -0,0 +1,7 @@
+	.text
+	.global _start
+_start:
+	.long	0
+
+	.data
+	.long	0


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]