diff options
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf32-rx.c | 16 | ||||
-rw-r--r-- | ld/ChangeLog | 7 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/flags1.d | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/phdrs.exp | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/pr14962-2.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/pr14962.d | 2 |
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. |