Add support for generating PLT lookups for the ColdFire.

This commit is contained in:
Nick Clifton 2005-03-18 17:20:33 +00:00
parent b294bdf8d0
commit 238d258f72
6 changed files with 108 additions and 28 deletions

View file

@ -1,3 +1,9 @@
2005-03-18 C Jaiprakash <cjaiprakash@noida.hcltech.com>
* elf32-m68k.c (elf_cfv4e_plt0_entry): plt entry for coldfire v4e.
(elf_m68k_adjust_dynamic_symbol,elf_m68k_finish_dynamic_symbol,
elf_m68k_finish_dynamic_sections): Use it.
2005-03-17 Paul Brook <paul@codesourcery.com> 2005-03-17 Paul Brook <paul@codesourcery.com>
Dan Jacobowitz <dan@codesourcery.com> Dan Jacobowitz <dan@codesourcery.com>
Mark Mitchell <mark@codesourcery.com> Mark Mitchell <mark@codesourcery.com>

View file

@ -217,6 +217,37 @@ static const bfd_byte elf_m68k_plt_entry[PLT_ENTRY_SIZE] =
0, 0, 0, 0 /* replaced with offset to start of .plt. */ 0, 0, 0, 0 /* replaced with offset to start of .plt. */
}; };
#define CFV4E_PLT_ENTRY_SIZE 24
#define CFV4E_FLAG(abfd) (elf_elfheader (abfd)->e_flags & EF_CFV4E)
static const bfd_byte elf_cfv4e_plt0_entry[CFV4E_PLT_ENTRY_SIZE] =
{
0x20, 0x3c,
0, 0, 0, 0, /* Replaced with offset to .got + 4. */
0x2f, 0x3b, 0x08, 0xfa, /* move.l (%pc,addr),-(%sp) */
0x20, 0x3c,
0, 0, 0, 0, /* Replaced with offset to .got + 8. */
0x20, 0x7b, 0x08, 0x00, /* move.l (%pc,%d0:l), %a0 */
0x4e, 0xd0, /* jmp (%a0) */
0x4e, 0x71 /* nop */
};
/* Subsequent entries in a procedure linkage table look like this. */
static const bfd_byte elf_cfv4e_plt_entry[CFV4E_PLT_ENTRY_SIZE] =
{
0x20, 0x3c,
0, 0, 0, 0, /* Replaced with offset to symbol's .got entry. */
0x20, 0x7b, 0x08, 0x00, /* move.l (%pc,%d0:l), %a0 */
0x4e, 0xd0, /* jmp (%a0) */
0x2f, 0x3c, /* move.l #offset,-(%sp) */
0, 0, 0, 0, /* Replaced with offset into relocation table. */
0x60, 0xff, /* bra.l .plt */
0, 0, 0, 0 /* Replaced with offset to start of .plt. */
};
#define CPU32_FLAG(abfd) (elf_elfheader (abfd)->e_flags & EF_CPU32) #define CPU32_FLAG(abfd) (elf_elfheader (abfd)->e_flags & EF_CPU32)
#define PLT_CPU32_ENTRY_SIZE 24 #define PLT_CPU32_ENTRY_SIZE 24
@ -977,6 +1008,8 @@ elf_m68k_adjust_dynamic_symbol (info, h)
{ {
if (CPU32_FLAG (dynobj)) if (CPU32_FLAG (dynobj))
s->size += PLT_CPU32_ENTRY_SIZE; s->size += PLT_CPU32_ENTRY_SIZE;
else if (CFV4E_FLAG (dynobj))
s->size += CFV4E_PLT_ENTRY_SIZE;
else else
s->size += PLT_ENTRY_SIZE; s->size += PLT_ENTRY_SIZE;
} }
@ -998,6 +1031,8 @@ elf_m68k_adjust_dynamic_symbol (info, h)
/* Make room for this entry. */ /* Make room for this entry. */
if (CPU32_FLAG (dynobj)) if (CPU32_FLAG (dynobj))
s->size += PLT_CPU32_ENTRY_SIZE; s->size += PLT_CPU32_ENTRY_SIZE;
else if (CFV4E_FLAG (dynobj))
s->size += CFV4E_PLT_ENTRY_SIZE;
else else
s->size += PLT_ENTRY_SIZE; s->size += PLT_ENTRY_SIZE;
@ -1788,9 +1823,11 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
in all the symbols for which we are making plt entries. The in all the symbols for which we are making plt entries. The
first entry in the procedure linkage table is reserved. */ first entry in the procedure linkage table is reserved. */
if (CPU32_FLAG (output_bfd)) if (CPU32_FLAG (output_bfd))
plt_index = h->plt.offset / PLT_CPU32_ENTRY_SIZE - 1; plt_index = (h->plt.offset / PLT_CPU32_ENTRY_SIZE) - 1;
else if (CFV4E_FLAG (output_bfd))
plt_index = (h->plt.offset / CFV4E_PLT_ENTRY_SIZE) - 1;
else else
plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; plt_index = (h->plt.offset / PLT_ENTRY_SIZE) - 1;
/* Get the offset into the .got table of the entry that /* Get the offset into the .got table of the entry that
corresponds to this function. Each .got entry is 4 bytes. corresponds to this function. Each .got entry is 4 bytes.
@ -1806,6 +1843,14 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
plt_off2 = 12; plt_off2 = 12;
plt_off3 = 18; plt_off3 = 18;
} }
else if (CFV4E_FLAG (output_bfd))
{
memcpy (splt->contents + h->plt.offset, elf_cfv4e_plt_entry,
CFV4E_PLT_ENTRY_SIZE);
plt_off1 = 2;
plt_off2 = 14;
plt_off3 = 20;
}
else else
{ {
/* Fill in the entry in the procedure linkage table. */ /* Fill in the entry in the procedure linkage table. */
@ -1818,11 +1863,12 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
/* The offset is relative to the first extension word. */ /* The offset is relative to the first extension word. */
bfd_put_32 (output_bfd, bfd_put_32 (output_bfd,
(sgot->output_section->vma sgot->output_section->vma
+ sgot->output_offset + sgot->output_offset
+ got_offset + got_offset
- (splt->output_section->vma - (splt->output_section->vma
+ h->plt.offset + 2)), + h->plt.offset
+ CFV4E_FLAG (output_bfd) ? 8 : 2),
splt->contents + h->plt.offset + plt_off1); splt->contents + h->plt.offset + plt_off1);
bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela), bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
@ -1835,7 +1881,7 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
(splt->output_section->vma (splt->output_section->vma
+ splt->output_offset + splt->output_offset
+ h->plt.offset + h->plt.offset
+ 8), + CFV4E_FLAG (output_bfd) ? 12 : 8),
sgot->contents + got_offset); sgot->contents + got_offset);
/* Fill in the entry in the .rela.plt section. */ /* Fill in the entry in the .rela.plt section. */
@ -2013,23 +2059,23 @@ elf_m68k_finish_dynamic_sections (output_bfd, info)
/* Fill in the first entry in the procedure linkage table. */ /* Fill in the first entry in the procedure linkage table. */
if (splt->size > 0) if (splt->size > 0)
{ {
if (!CPU32_FLAG (output_bfd)) if (CFV4E_FLAG (output_bfd))
{ {
memcpy (splt->contents, elf_m68k_plt0_entry, PLT_ENTRY_SIZE); memcpy (splt->contents, elf_cfv4e_plt0_entry, CFV4E_PLT_ENTRY_SIZE);
bfd_put_32 (output_bfd, bfd_put_32 (output_bfd,
(sgot->output_section->vma (sgot->output_section->vma
+ sgot->output_offset + 4 + sgot->output_offset + 4
- (splt->output_section->vma + 2)), - (splt->output_section->vma + 2)),
splt->contents + 4); splt->contents + 2);
bfd_put_32 (output_bfd, bfd_put_32 (output_bfd,
(sgot->output_section->vma (sgot->output_section->vma
+ sgot->output_offset + 8 + sgot->output_offset + 8
- (splt->output_section->vma + 10)), - (splt->output_section->vma + 10) - 8),
splt->contents + 12); splt->contents + 12);
elf_section_data (splt->output_section)->this_hdr.sh_entsize elf_section_data (splt->output_section)->this_hdr.sh_entsize
= PLT_ENTRY_SIZE; = CFV4E_PLT_ENTRY_SIZE;
} }
else /* cpu32 */ else if (CPU32_FLAG (output_bfd))
{ {
memcpy (splt->contents, elf_cpu32_plt0_entry, PLT_CPU32_ENTRY_SIZE); memcpy (splt->contents, elf_cpu32_plt0_entry, PLT_CPU32_ENTRY_SIZE);
bfd_put_32 (output_bfd, bfd_put_32 (output_bfd,
@ -2045,6 +2091,22 @@ elf_m68k_finish_dynamic_sections (output_bfd, info)
elf_section_data (splt->output_section)->this_hdr.sh_entsize elf_section_data (splt->output_section)->this_hdr.sh_entsize
= PLT_CPU32_ENTRY_SIZE; = PLT_CPU32_ENTRY_SIZE;
} }
else
{
memcpy (splt->contents, elf_m68k_plt0_entry, PLT_ENTRY_SIZE);
bfd_put_32 (output_bfd,
(sgot->output_section->vma
+ sgot->output_offset + 4
- (splt->output_section->vma + 2)),
splt->contents + 4);
bfd_put_32 (output_bfd,
(sgot->output_section->vma
+ sgot->output_offset + 8
- (splt->output_section->vma + 10)),
splt->contents + 12);
elf_section_data (splt->output_section)->this_hdr.sh_entsize
= PLT_ENTRY_SIZE;
}
} }
} }

View file

@ -1,3 +1,8 @@
2005-03-18 C Jaiprakash <cjaiprakash@noida.hcltech.com>
* config/tc-m68k.c (m68k_elf_final_processing): Set file specific
flag for coldfire v4e.
2005-03-17 Bob Wilson <bob.wilson@acm.org> 2005-03-17 Bob Wilson <bob.wilson@acm.org>
* config/tc-xtensa.c (xg_apply_tentative_value): Rename to * config/tc-xtensa.c (xg_apply_tentative_value): Rename to

View file

@ -7447,6 +7447,8 @@ void
m68k_elf_final_processing (void) m68k_elf_final_processing (void)
{ {
/* Set file-specific flags if this is a cpu32 processor. */ /* Set file-specific flags if this is a cpu32 processor. */
if (arch_coldfire_fpu (current_architecture))
elf_elfheader (stdoutput)->e_flags |= EF_CFV4E;
if (cpu_of_arch (current_architecture) & cpu32) if (cpu_of_arch (current_architecture) & cpu32)
elf_elfheader (stdoutput)->e_flags |= EF_CPU32; elf_elfheader (stdoutput)->e_flags |= EF_CPU32;
else if ((cpu_of_arch (current_architecture) & m68000up) else if ((cpu_of_arch (current_architecture) & m68000up)

View file

@ -1,3 +1,7 @@
2005-03-18 C Jaipraash <cjaiprakash@noida.hcltech.com>
* m68k.h (EF_CFV4E): Define.
2005-03-17 Paul Brook <paul@codesourcery.com> 2005-03-17 Paul Brook <paul@codesourcery.com>
Dan Jacobowitz <dan@codesourcery.com> Dan Jacobowitz <dan@codesourcery.com>
Mark Mitchell <mark@codesourcery.com> Mark Mitchell <mark@codesourcery.com>

View file

@ -1,5 +1,5 @@
/* MC68k ELF support for BFD. /* MC68k ELF support for BFD.
Copyright 1998, 1999, 2000, 2002 Free Software Foundation, Inc. Copyright 1998, 1999, 2000, 2002, 2005 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
@ -54,5 +54,6 @@ END_RELOC_NUMBERS (R_68K_max)
#define EF_CPU32 0x00810000 #define EF_CPU32 0x00810000
#define EF_M68000 0x01000000 #define EF_M68000 0x01000000
#define EF_CFV4E 0x00008000
#endif #endif