aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2009-10-08 01:00:27 +0000
committerAlan Modra <amodra@gmail.com>2009-10-08 01:00:27 +0000
commit4100cea361e40b86953629f28dcab4d8d12d5fbe (patch)
tree1f897c573ce56d238e76c2b86bde3e7e272f618d
parent092004b4862f5b5f1c5d50be14ffb062d92d5fbb (diff)
downloadgdb-4100cea361e40b86953629f28dcab4d8d12d5fbe.zip
gdb-4100cea361e40b86953629f28dcab4d8d12d5fbe.tar.gz
gdb-4100cea361e40b86953629f28dcab4d8d12d5fbe.tar.bz2
PR ld/10744
* ldlang.c (lang_new_phdr): Allow FILEHDR/PHDRS on more than the first PT_LOAD header. * ld.texinfo: Update.
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/ld.texinfo3
-rw-r--r--ld/ldlang.c6
3 files changed, 13 insertions, 3 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index fe15c36..5ed952e 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2009-10-08 Alan Modra <amodra@bigpond.net.au>
+
+ PR ld/10744
+ * ldlang.c (lang_new_phdr): Allow FILEHDR/PHDRS on more than the
+ first PT_LOAD header.
+ * ld.texinfo: Update.
+
2009-10-06 Nathan Sidwell <nathan@codesourcery.com>
* ldlang.c (lang_new_phdr): Check PHDRS and FILEHDR in loadable
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index 978ae66..21ff9cd 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -4740,7 +4740,8 @@ the program header type to further describe the contents of the segment.
The @code{FILEHDR} keyword means that the segment should include the ELF
file header. The @code{PHDRS} keyword means that the segment should
include the ELF program headers themselves. If applied to a loadable
-segment (@code{PT_LOAD}), it must be the first loadable segment.
+segment (@code{PT_LOAD}), all prior loadable segments must have one of
+these keywords.
The @var{type} may be one of the following. The numbers indicate the
value of the keyword.
diff --git a/ld/ldlang.c b/ld/ldlang.c
index a46438e..f1daeb5 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -6779,9 +6779,11 @@ lang_new_phdr (const char *name,
hdrs = n->type == 1 && (phdrs || filehdr);
for (pp = &lang_phdr_list; *pp != NULL; pp = &(*pp)->next)
- if (hdrs && (*pp)->type == 1)
+ if (hdrs
+ && (*pp)->type == 1
+ && !((*pp)->filehdr || (*pp)->phdrs))
{
- einfo (_("%X%P:%S: PHDRS and FILEHDR are only permitted for the first PT_LOAD segment\n"));
+ einfo (_("%X%P:%S: PHDRS and FILEHDR are not supported when prior PT_LOAD headers lack them\n"));
hdrs = FALSE;
}