* 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).