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]

PATCH: PR ld/11628: "ld -Ttext-segment=ORG" does not set PT_LOAD.p_vaddr


ORG in "ld -Ttext-segment=ORG" should be multiple of maximum page size.
This patch issues an error if ORG isn't multiple of maximum page size.
OK to install?


H.J.
---
ld/

2010-05-24  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/11628
	* lexsup.c (set_segment_start): Make it return "segment_type *".
	(parse_args): Check address of text segment is multiple of
	maximum page size.
	(set_segment_start): Return "segment_type *".

ld/testsuite/

2010-05-24  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/11628
	* ld-elf/textaddr3.d: New.
	* ld-elf/textaddr4.d: Likewise.
	* ld-elf/textaddr5.d: Likewise.
	* ld-elf/textaddr6.d: Likewise.

diff --git a/ld/lexsup.c b/ld/lexsup.c
index b992fca..1e47710 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -56,7 +56,7 @@
 
 static void set_default_dirlist (char *);
 static void set_section_start (char *, char *);
-static void set_segment_start (const char *, char *);
+static segment_type *set_segment_start (const char *, char *);
 static void help (void);
 
 /* Non-zero if we are processing a --defsym from the command line.  */
@@ -1268,7 +1268,13 @@ parse_args (unsigned argc, char **argv)
 	  set_segment_start (".text", optarg);
 	  break;
 	case OPTION_TTEXT_SEGMENT:
-	  set_segment_start (".text-segment", optarg);
+	  {
+	    segment_type *seg = set_segment_start (".text-segment",
+						   optarg);
+	    if (seg && (seg->value % config.maxpagesize) != 0)
+	      einfo (_("%P%F: address of text segment `%s' isn't multiple of maximum page size\n"),
+		     optarg);
+	  }
 	  break;
 	case OPTION_TRADITIONAL_FORMAT:
 	  link_info.traditional_format = TRUE;
@@ -1550,7 +1556,7 @@ set_section_start (char *sect, char *valstr)
   lang_section_start (sect, exp_intop (val), NULL);
 }
 
-static void
+static segment_type *
 set_segment_start (const char *section, char *valstr)
 {
   const char *name;
@@ -1559,7 +1565,10 @@ set_segment_start (const char *section, char *valstr)
 
   bfd_vma val = bfd_scan_vma (valstr, &end, 16);
   if (*end)
-    einfo (_("%P%F: invalid hex number `%s'\n"), valstr);
+    {
+      einfo (_("%P%F: invalid hex number `%s'\n"), valstr);
+      return NULL;
+    }
   /* If we already have an entry for this segment, update the existing
      value.  */
   name = section + 1;
@@ -1567,7 +1576,7 @@ set_segment_start (const char *section, char *valstr)
     if (strcmp (seg->name, name) == 0)
       {
 	seg->value = val;
-	return;
+	return seg;
       }
   /* There was no existing value so we must create a new segment
      entry.  */
@@ -1583,6 +1592,7 @@ set_segment_start (const char *section, char *valstr)
      that.  If a SEGMENT_START directive is seen, the section address
      assignment will be disabled.  */
   lang_section_start (section, exp_intop (val), seg);
+  return seg;
 }
 
 
--- /dev/null	2010-05-24 09:41:04.580007186 -0700
+++ binutils/ld/testsuite/ld-elf/textaddr3.d	2010-05-24 11:13:52.895504746 -0700
@@ -0,0 +1,5 @@
+#source: maxpage1.s
+#ld: -z max-page-size=0x200000 -Ttext-segment 0x10000
+#readelf: -l --wide
+#target: *-*-linux-gnu
+#error: .*address of text segment `0x10000' isn't multiple of maximum page size
--- /dev/null	2010-05-24 09:41:04.580007186 -0700
+++ binutils/ld/testsuite/ld-elf/textaddr4.d	2010-05-24 11:14:22.263600575 -0700
@@ -0,0 +1,8 @@
+#source: maxpage1.s
+#ld: -z max-page-size=0x10000 -Ttext-segment 0x10000
+#readelf: -l --wide
+#target: *-*-linux-gnu
+
+#...
+  LOAD +0x0+ 0x0*10000 0x0*10000 0x0*[0-9a-f][0-9a-f][0-9a-f] 0x0*[0-9a-f][0-9a-f][0-9a-f] R E 0x10000
+#pass
--- /dev/null	2010-05-24 09:41:04.580007186 -0700
+++ binutils/ld/testsuite/ld-elf/textaddr5.d	2010-05-24 11:13:03.783748790 -0700
@@ -0,0 +1,5 @@
+#source: maxpage1.s
+#ld: -shared -z max-page-size=0x200000 -Ttext-segment 0x10000
+#readelf: -l --wide
+#target: *-*-linux-gnu
+#error: .*address of text segment `0x10000' isn't multiple of maximum page size
--- /dev/null	2010-05-24 09:41:04.580007186 -0700
+++ binutils/ld/testsuite/ld-elf/textaddr6.d	2010-05-24 11:14:45.030440124 -0700
@@ -0,0 +1,8 @@
+#source: maxpage1.s
+#ld: -shared -z max-page-size=0x10000 -Ttext-segment 0x10000
+#readelf: -l --wide
+#target: *-*-linux-gnu
+
+#...
+  LOAD +0x0+ 0x0*10000 0x0*10000 0x0*[0-9a-f][0-9a-f][0-9a-f] 0x0*[0-9a-f][0-9a-f][0-9a-f] R E 0x10000
+#pass


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