From 392ca752084a7ea99a345a7b19b9e7453f2ea6a2 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Tue, 29 Jan 2013 22:17:53 +0000 Subject: [PATCH] * config/tc-rl78.c (rl78_cons_fix_new): Handle user-specified relocs in .word/.etc statements. --- bfd/elf32-rx.c | 14 +++++++++++++- gas/ChangeLog | 5 +++++ gas/config/tc-rl78.c | 17 +++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/bfd/elf32-rx.c b/bfd/elf32-rx.c index 5000eb7be0c..8b61142d4bf 100644 --- a/bfd/elf32-rx.c +++ b/bfd/elf32-rx.c @@ -3098,9 +3098,15 @@ rx_elf_object_p (bfd * abfd) { Elf_Internal_Shdr *sec = elf_tdata(abfd)->elf_sect_ptr[u]; +<<<<<<< elf32-rx.c + if (phdr[i].p_offset <= (bfd_vma) sec->sh_offset + && (bfd_vma)sec->sh_offset <= phdr[i].p_offset + (phdr[i].p_filesz - 1) + && sec->sh_size > 0) +======= if (phdr[i].p_filesz && phdr[i].p_offset <= (bfd_vma) sec->sh_offset && (bfd_vma)sec->sh_offset <= phdr[i].p_offset + (phdr[i].p_filesz - 1)) +>>>>>>> 1.20 { /* Found one! The difference between the two addresses, plus the difference between the two file offsets, is @@ -3113,7 +3119,7 @@ rx_elf_object_p (bfd * abfd) The correct LMA for the section is fffc0140 + (2050-2010). */ - phdr[i].p_vaddr = sec->sh_addr + (sec->sh_offset - phdr[i].p_offset); + phdr[i].p_vaddr = sec->sh_addr - (sec->sh_offset - phdr[i].p_offset); break; } } @@ -3123,9 +3129,15 @@ rx_elf_object_p (bfd * abfd) bsec = abfd->sections; while (bsec) { +<<<<<<< elf32-rx.c + if (bsec->flags & (SEC_LOAD | SEC_ALLOC) + && phdr[i].p_offset <= (bfd_vma) bsec->filepos + && (bfd_vma) bsec->filepos <= phdr[i].p_offset + (phdr[i].p_filesz - 1)) +======= if (phdr[i].p_filesz && phdr[i].p_vaddr <= bsec->vma && bsec->vma <= phdr[i].p_vaddr + (phdr[i].p_filesz - 1)) +>>>>>>> 1.20 { bsec->lma = phdr[i].p_paddr + (bsec->vma - phdr[i].p_vaddr); } diff --git a/gas/ChangeLog b/gas/ChangeLog index 3083caeda25..b4a211f594b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2013-01-29 DJ Delorie + + * config/tc-rl78.c (rl78_cons_fix_new): Handle user-specified + relocs in .word/.etc statements. + 2013-01-29 Roland McGrath * config/tc-arm.c (md_apply_fix): Use as_bad_where for "bad diff --git a/gas/config/tc-rl78.c b/gas/config/tc-rl78.c index 53d3df2f2b6..bd964dc1630 100644 --- a/gas/config/tc-rl78.c +++ b/gas/config/tc-rl78.c @@ -554,6 +554,23 @@ rl78_cons_fix_new (fragS * frag, return; } + switch (exp->X_md) + { + case BFD_RELOC_RL78_LO16: + case BFD_RELOC_RL78_HI16: + if (size != 2) + as_bad (_("%%hi16/%%lo16 only applies to .short or .hword")); + type = exp->X_md; + break; + case BFD_RELOC_RL78_HI8: + if (size != 1) + as_bad (_("%%hi8 only applies to .byte")); + type = exp->X_md; + break; + default: + break; + } + if (exp->X_op == O_subtract && exp->X_op_symbol) { if (size != 4 && size != 2 && size != 1) -- 2.30.2