summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDJ Delorie <dj@delorie.com>2013-01-29 22:17:52 +0000
committerDJ Delorie <dj@delorie.com>2013-01-29 22:17:52 +0000
commit570377c717b4d2d973a04d890a9a24fcc1b8feaa (patch)
tree89414989541a2a54e6863469ae07a89b0dcc65d5
parent48bb8263bee1d1ba35896a98b6ae3a69ce76ef88 (diff)
downloadbinutils-redhat-570377c717b4d2d973a04d890a9a24fcc1b8feaa.tar.gz
* config/tc-rl78.c (rl78_cons_fix_new): Handle user-specified
relocs in .word/.etc statements.
-rw-r--r--bfd/elf32-rx.c14
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-rl78.c17
3 files changed, 35 insertions, 1 deletions
diff --git a/bfd/elf32-rx.c b/bfd/elf32-rx.c
index 5000eb7be0..8b61142d4b 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 3083caeda2..b4a211f594 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2013-01-29 DJ Delorie <dj@redhat.com>
+
+ * config/tc-rl78.c (rl78_cons_fix_new): Handle user-specified
+ relocs in .word/.etc statements.
+
2013-01-29 Roland McGrath <mcgrathr@google.com>
* 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 53d3df2f2b..bd964dc163 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)