aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-rx.c16
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/testsuite/ld-elf/flags1.d1
-rw-r--r--ld/testsuite/ld-scripts/phdrs.exp8
-rw-r--r--ld/testsuite/ld-scripts/pr14962-2.d2
-rw-r--r--ld/testsuite/ld-scripts/pr14962.d2
7 files changed, 29 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 1c1dd90..b461ebe 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2016-12-13 Alan Modra <amodra@gmail.com>
+
+ * elf32-rx.c (elf32_rx_modify_program_headers): Don't adjust
+ segments that include the ELF file header or program headers.
+
2016-12-08 Alan Modra <amodra@gmail.com>
PR ld/20932
diff --git a/bfd/elf32-rx.c b/bfd/elf32-rx.c
index f5377c0..72ea7fd 100644
--- a/bfd/elf32-rx.c
+++ b/bfd/elf32-rx.c
@@ -3200,9 +3200,11 @@ rx_elf_object_p (bfd * abfd)
int i;
unsigned int u;
Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
- int nphdrs = elf_elfheader (abfd)->e_phnum;
+ Elf_Internal_Ehdr *ehdr = elf_elfheader (abfd);
+ int nphdrs = ehdr->e_phnum;
sec_ptr bsec;
static int saw_be = FALSE;
+ bfd_vma end_phdroff;
/* We never want to automatically choose the non-swapping big-endian
target. The user can only get that explicitly, such as with -I
@@ -3227,6 +3229,17 @@ rx_elf_object_p (bfd * abfd)
corresponds (based on matching file offsets) and use its VMA
information to reconstruct the p_vaddr field we clobbered when we
wrote it out. */
+ /* If PT_LOAD headers include the ELF file header or program headers
+ then the PT_LOAD header does not start with some section contents.
+ Making adjustments based on the difference between sh_offset and
+ p_offset is nonsense in such cases. Exclude them. Note that
+ since standard linker scripts for RX do not use SIZEOF_HEADERS,
+ the linker won't normally create PT_LOAD segments covering the
+ headers so this is mainly for passing the ld testsuite.
+ FIXME. Why are we looking at non-PT_LOAD headers here? */
+ end_phdroff = ehdr->e_ehsize;
+ if (ehdr->e_phoff != 0)
+ end_phdroff = ehdr->e_phoff + nphdrs * ehdr->e_phentsize;
for (i=0; i<nphdrs; i++)
{
for (u=0; u<elf_tdata(abfd)->num_elf_sections; u++)
@@ -3234,6 +3247,7 @@ rx_elf_object_p (bfd * abfd)
Elf_Internal_Shdr *sec = elf_tdata(abfd)->elf_sect_ptr[u];
if (phdr[i].p_filesz
+ && phdr[i].p_offset >= end_phdroff
&& phdr[i].p_offset <= (bfd_vma) sec->sh_offset
&& sec->sh_size > 0
&& sec->sh_type != SHT_NOBITS
diff --git a/ld/ChangeLog b/ld/ChangeLog
index c4dadfc..08d5a69 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2016-12-13 Alan Modra <amodra@gmail.com>
+
+ * testsuite/ld-elf/flags1.d: Run for RX.
+ * testsuite/ld-scripts/phdrs.exp: Likewise.
+ * testsuite/ld-scripts/pr14962.d: Likewise.
+ * testsuite/ld-scripts/pr14962-2.d: Likewise.
+
2016-12-08 Alan Modra <amodra@gmail.com>
* configure: Regenerate.
diff --git a/ld/testsuite/ld-elf/flags1.d b/ld/testsuite/ld-elf/flags1.d
index aadf936..6cd8b3f 100644
--- a/ld/testsuite/ld-elf/flags1.d
+++ b/ld/testsuite/ld-elf/flags1.d
@@ -2,7 +2,6 @@
#ld: -Tflags1.ld
#objcopy_linked_file: --set-section-flags .post_text_reserve=contents,alloc,load,readonly,code
#readelf: -S --wide
-#notarget: rx-*-*
#...
Section Headers:
diff --git a/ld/testsuite/ld-scripts/phdrs.exp b/ld/testsuite/ld-scripts/phdrs.exp
index 9bdc90e..152d629 100644
--- a/ld/testsuite/ld-scripts/phdrs.exp
+++ b/ld/testsuite/ld-scripts/phdrs.exp
@@ -59,14 +59,6 @@ if ![ld_simple_link $ld tmpdir/phdrs $ldopt] {
set exec_output [prune_warnings $exec_output]
verbose -log $exec_output
- # The RX port sets the p_paddr of loadable segments to 0 in order
- # to be compatible with Renesas tools. When an RX executable is
- # loaded into a BFD based tool the code tries to reconstruct the
- # correct vaddr and paddr values. This is not always possible
- # however and this test is one example of where the reconstruction
- # fails.
- setup_xfail rx-*-*
-
if [regexp $phdrs_regexp $exec_output] {
pass $testname
} else {
diff --git a/ld/testsuite/ld-scripts/pr14962-2.d b/ld/testsuite/ld-scripts/pr14962-2.d
index 7dd244e..dad84a3 100644
--- a/ld/testsuite/ld-scripts/pr14962-2.d
+++ b/ld/testsuite/ld-scripts/pr14962-2.d
@@ -1,7 +1,7 @@
#ld: -T pr14962-2.t
#source: pr14962a.s
#nm: -n
-#notarget: rx-*-* frv-*-*linux*
+#notarget: frv-*-*linux*
#...
0+2000 [AT] _start
diff --git a/ld/testsuite/ld-scripts/pr14962.d b/ld/testsuite/ld-scripts/pr14962.d
index 06b223e..ba7dd58 100644
--- a/ld/testsuite/ld-scripts/pr14962.d
+++ b/ld/testsuite/ld-scripts/pr14962.d
@@ -2,7 +2,7 @@
#source: pr14962a.s
#source: pr14962b.s
#nm: -n
-#notarget: rx-*-* mmix-knuth-mmixware
+#notarget: mmix-knuth-mmixware
# The reference to x would normally generate a cross-reference error
# but the linker script converts x to absolute to avoid the error.