aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-12-13 09:29:47 +1030
committerAlan Modra <amodra@gmail.com>2016-12-13 09:37:37 +1030
commit6392030005291f7c783da2247b63ae31dc8352e0 (patch)
treee969ae75f49bf5133ea7e5d69b9b36598efa2560
parentea0ffd5be2dfd6ee696fc15294d7b2bf29f267a7 (diff)
downloadgdb-6392030005291f7c783da2247b63ae31dc8352e0.zip
gdb-6392030005291f7c783da2247b63ae31dc8352e0.tar.gz
gdb-6392030005291f7c783da2247b63ae31dc8352e0.tar.bz2
Don't fudge p_vaddr when PHDR in segment
RX does horrible fudges to PT_LOAD p_vaddr, that affect the testsuite and mean the target won't support dynamic objects. The latter probably doesn't matter too much since RX is an embedded target, but it's easy to stop some of the fudges in order to reduce special cases for RX in the testsuite. The changes make sense in isolation too. bfd/ * elf32-rx.c (elf32_rx_modify_program_headers): Don't adjust segments that include the ELF file header or program headers. ld/ * 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.
-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.