public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* PATCH: PR ld/11628: "ld -Ttext-segment=ORG" does not set PT_LOAD.p_vaddr
@ 2010-05-24 18:24 H.J. Lu
  2010-05-24 20:55 ` Ian Lance Taylor
  0 siblings, 1 reply; 4+ messages in thread
From: H.J. Lu @ 2010-05-24 18:24 UTC (permalink / raw)
  To: binutils

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;
 }
 
 \f
--- /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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: PATCH: PR ld/11628: "ld -Ttext-segment=ORG" does not set PT_LOAD.p_vaddr
  2010-05-24 18:24 PATCH: PR ld/11628: "ld -Ttext-segment=ORG" does not set PT_LOAD.p_vaddr H.J. Lu
@ 2010-05-24 20:55 ` Ian Lance Taylor
  2010-05-25 19:19   ` H.J. Lu
  0 siblings, 1 reply; 4+ messages in thread
From: Ian Lance Taylor @ 2010-05-24 20:55 UTC (permalink / raw)
  To: H.J. Lu; +Cc: binutils

"H.J. Lu" <hongjiu.lu@intel.com> writes:

> 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?

If -n or -N is used there should not be such a requirement.

Ian

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: PATCH: PR ld/11628: "ld -Ttext-segment=ORG" does not set  PT_LOAD.p_vaddr
  2010-05-24 20:55 ` Ian Lance Taylor
@ 2010-05-25 19:19   ` H.J. Lu
  2010-05-26  4:35     ` Alan Modra
  0 siblings, 1 reply; 4+ messages in thread
From: H.J. Lu @ 2010-05-25 19:19 UTC (permalink / raw)
  To: Ian Lance Taylor; +Cc: binutils

[-- Attachment #1: Type: text/plain, Size: 793 bytes --]

On Mon, May 24, 2010 at 1:54 PM, Ian Lance Taylor <iant@google.com> wrote:
> "H.J. Lu" <hongjiu.lu@intel.com> writes:
>
>> 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?
>
> If -n or -N is used there should not be such a requirement.
>
> Ian
>

How about this patch?

-- 
H.J.
---

ld/

2010-05-25  H.J. Lu  <hongjiu.lu@intel.com>

 	PR ld/11628
	* ldexp.c (fold_binary): Warn if value of SEGMENT_START isn't
	multiple of maximum page size.

ld/testsuite/

2010-05-25  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.
	* ld-elf/textaddr7.d: Likewise.

[-- Attachment #2: binutils-pr11628-2.patch --]
[-- Type: text/plain, Size: 2685 bytes --]

ld/

2010-05-25  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/11628
	* ldexp.c (fold_binary): Warn if value of SEGMENT_START isn't
	multiple of maximum page size.

ld/testsuite/

2010-05-25  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.
	* ld-elf/textaddr7.d: Likewise.

diff --git a/ld/ldexp.c b/ld/ldexp.c
index 34d9eab..c0ca818 100644
--- a/ld/ldexp.c
+++ b/ld/ldexp.c
@@ -299,6 +299,11 @@ fold_binary (etree_type *tree)
       for (seg = segments; seg; seg = seg->next) 
 	if (strcmp (seg->name, segment_name) == 0)
 	  {
+	    if (!seg->used
+		&& config.magic_demand_paged
+		&& (seg->value % config.maxpagesize) != 0)
+	      einfo (_("%P: warning: address of `%s' isn't multiple of maximum page size\n"),
+		     segment_name);
 	    seg->used = TRUE;
 	    expld.result.value = seg->value;
 	    expld.result.str = NULL;
--- /dev/null	2010-05-24 09:41:04.580007186 -0700
+++ binutils/ld/testsuite/ld-elf/textaddr3.d	2010-05-25 12:12:41.871442026 -0700
@@ -0,0 +1,4 @@
+#source: maxpage1.s
+#ld: -Ttext-segment 0x10000 -z max-page-size=0x200000
+#target: *-*-linux-gnu
+#warning: .*address of `text-segment' 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-25 12:10:38.095444527 -0700
@@ -0,0 +1,4 @@
+#source: maxpage1.s
+#ld: -shared -z max-page-size=0x200000 -Ttext-segment 0x10000
+#target: *-*-linux-gnu
+#warning: .*address of `text-segment' 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
--- /dev/null	2010-05-24 09:41:04.580007186 -0700
+++ binutils/ld/testsuite/ld-elf/textaddr7.d	2010-05-25 12:13:50.486445531 -0700
@@ -0,0 +1,8 @@
+#source: maxpage1.s
+#ld: -n -z max-page-size=0x200000 -Ttext-segment 0x10000
+#readelf: -l --wide
+#target: *-*-linux-gnu
+
+#...
+  LOAD .*
+#pass

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: PATCH: PR ld/11628: "ld -Ttext-segment=ORG" does not set  PT_LOAD.p_vaddr
  2010-05-25 19:19   ` H.J. Lu
@ 2010-05-26  4:35     ` Alan Modra
  0 siblings, 0 replies; 4+ messages in thread
From: Alan Modra @ 2010-05-26  4:35 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Ian Lance Taylor, binutils

On Tue, May 25, 2010 at 12:19:41PM -0700, H.J. Lu wrote:
> ld/
> 
> 2010-05-25  H.J. Lu  <hongjiu.lu@intel.com>
> 
>  	PR ld/11628
> 	* ldexp.c (fold_binary): Warn if value of SEGMENT_START isn't
> 	multiple of maximum page size.
> 
> ld/testsuite/
> 
> 2010-05-25  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.
> 	* ld-elf/textaddr7.d: Likewise.

OK.

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-05-26  4:35 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-05-24 18:24 PATCH: PR ld/11628: "ld -Ttext-segment=ORG" does not set PT_LOAD.p_vaddr H.J. Lu
2010-05-24 20:55 ` Ian Lance Taylor
2010-05-25 19:19   ` H.J. Lu
2010-05-26  4:35     ` Alan Modra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).