Line 30... |
Line 30... |
|
|
/* This is a meta-target that's used only with objcopy, to avoid the
|
/* This is a meta-target that's used only with objcopy, to avoid the
|
endian-swap we would otherwise get. We check for this in
|
endian-swap we would otherwise get. We check for this in
|
rx_elf_object_p(). */
|
rx_elf_object_p(). */
|
const bfd_target bfd_elf32_rx_be_ns_vec;
|
const bfd_target bfd_elf32_rx_be_ns_vec;
|
|
const bfd_target bfd_elf32_rx_be_vec;
|
|
|
#ifdef DEBUG
|
#ifdef DEBUG
|
char * rx_get_reloc (long);
|
char * rx_get_reloc (long);
|
void rx_dump_symtab (bfd *, void *, void *);
|
void rx_dump_symtab (bfd *, void *, void *);
|
#endif
|
#endif
|
Line 2112... |
Line 2113... |
/* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst. */
|
/* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst. */
|
else if (code == 1 && symval/scale <= 31
|
else if (code == 1 && symval/scale <= 31
|
/* Decodable bits. */
|
/* Decodable bits. */
|
&& (insn[0] & 0xcc) == 0xcc
|
&& (insn[0] & 0xcc) == 0xcc
|
/* Width. */
|
/* Width. */
|
&& (insn[0] & 0x30) != 3
|
&& (insn[0] & 0x30) != 0x30
|
/* Register MSBs. */
|
/* Register MSBs. */
|
&& (insn[1] & 0x88) == 0x00)
|
&& (insn[1] & 0x88) == 0x00)
|
{
|
{
|
int newrel = 0;
|
int newrel = 0;
|
|
|
Line 2216... |
Line 2217... |
/* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */
|
/* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */
|
else if (code == 1 && symval/scale <= 31
|
else if (code == 1 && symval/scale <= 31
|
/* Decodable bits. */
|
/* Decodable bits. */
|
&& (insn[0] & 0xc3) == 0xc3
|
&& (insn[0] & 0xc3) == 0xc3
|
/* Width. */
|
/* Width. */
|
&& (insn[0] & 0x30) != 3
|
&& (insn[0] & 0x30) != 0x30
|
/* Register MSBs. */
|
/* Register MSBs. */
|
&& (insn[1] & 0x88) == 0x00)
|
&& (insn[1] & 0x88) == 0x00)
|
{
|
{
|
int newrel = 0;
|
int newrel = 0;
|
|
|
Line 3026... |
Line 3027... |
int i;
|
int i;
|
unsigned int u;
|
unsigned int u;
|
Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
|
Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
|
int nphdrs = elf_elfheader (abfd)->e_phnum;
|
int nphdrs = elf_elfheader (abfd)->e_phnum;
|
sec_ptr bsec;
|
sec_ptr bsec;
|
|
static int saw_be = FALSE;
|
|
|
/* We never want to automatically choose the non-swapping big-endian
|
/* We never want to automatically choose the non-swapping big-endian
|
target. The user can only get that explicitly, such as with -I
|
target. The user can only get that explicitly, such as with -I
|
and objcopy. */
|
and objcopy. */
|
if (abfd->xvec == &bfd_elf32_rx_be_ns_vec
|
if (abfd->xvec == &bfd_elf32_rx_be_ns_vec
|
&& abfd->target_defaulted)
|
&& abfd->target_defaulted)
|
return FALSE;
|
return FALSE;
|
|
|
|
/* BFD->target_defaulted is not set to TRUE when a target is chosen
|
|
as a fallback, so we check for "scanning" to know when to stop
|
|
using the non-swapping target. */
|
|
if (abfd->xvec == &bfd_elf32_rx_be_ns_vec
|
|
&& saw_be)
|
|
return FALSE;
|
|
if (abfd->xvec == &bfd_elf32_rx_be_vec)
|
|
saw_be = TRUE;
|
|
|
bfd_default_set_arch_mach (abfd, bfd_arch_rx,
|
bfd_default_set_arch_mach (abfd, bfd_arch_rx,
|
elf32_rx_machine (abfd));
|
elf32_rx_machine (abfd));
|
|
|
/* For each PHDR in the object, we must find some section that
|
/* For each PHDR in the object, we must find some section that
|
corresponds (based on matching file offsets) and use its VMA
|
corresponds (based on matching file offsets) and use its VMA
|
Line 3071... |
Line 3082... |
/* We must update the bfd sections as well, so we don't stop
|
/* We must update the bfd sections as well, so we don't stop
|
with one match. */
|
with one match. */
|
bsec = abfd->sections;
|
bsec = abfd->sections;
|
while (bsec)
|
while (bsec)
|
{
|
{
|
if (phdr[i].p_vaddr <= bsec->lma
|
if (phdr[i].p_vaddr <= bsec->vma
|
&& bsec->vma <= phdr[i].p_vaddr + (phdr[i].p_filesz - 1))
|
&& bsec->vma <= phdr[i].p_vaddr + (phdr[i].p_filesz - 1))
|
{
|
{
|
bsec->lma = phdr[i].p_paddr + (bsec->vma - phdr[i].p_vaddr);
|
bsec->lma = phdr[i].p_paddr + (bsec->vma - phdr[i].p_vaddr);
|
}
|
}
|
bsec = bsec->next;
|
bsec = bsec->next;
|