* elf32-mips.c: Remove superfluous definitions copied from

elfxx-mips.c.
	(bfd_elf32_bigmips_vec,bfd_elf32_littlemips_vec): Use the
	SGIish vectors to check the special case.
	(mips_elf_hi16_reloc): Fix comment.
	(mips_elf_got16_reloc): Likewise.
	(_bfd_mips_elf32_gprel16_reloc): Likewise.
	(elf_reloc_map): Code cleanup.
	(mips_reloc_map): Add comment.
	(bfd_elf23_bfd_reloc_type_lookup): Code cleanup.
	(mips_elf32_rtype_to_howto): Likewise.
	(mips_elf32_discard_info): Likewise.
	(elf32_mips_irix_compat): Invert logic: Only SGIish vectors
	lead to IRIX compatibility now.
This commit is contained in:
Thiemo Seufer 2002-05-14 23:37:52 +00:00
parent 3bec30a830
commit cb7394f2b6
2 changed files with 37 additions and 173 deletions

View File

@ -1,3 +1,20 @@
2002-05-15 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
* elf32-mips.c: Remove superfluous definitions copied from
elfxx-mips.c.
(bfd_elf32_bigmips_vec,bfd_elf32_littlemips_vec): Use the
SGIish vectors to check the special case.
(mips_elf_hi16_reloc): Fix comment.
(mips_elf_got16_reloc): Likewise.
(_bfd_mips_elf32_gprel16_reloc): Likewise.
(elf_reloc_map): Code cleanup.
(mips_reloc_map): Add comment.
(bfd_elf23_bfd_reloc_type_lookup): Code cleanup.
(mips_elf32_rtype_to_howto): Likewise.
(mips_elf32_discard_info): Likewise.
(elf32_mips_irix_compat): Invert logic: Only SGIish vectors
lead to IRIX compatibility now.
2002-05-15 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
* elfxx-mips.c: Call it IRIX, not Irix in comments.

View File

@ -89,164 +89,20 @@ static boolean elf32_mips_write_section
static irix_compat_t elf32_mips_irix_compat
PARAMS ((bfd *));
extern const bfd_target bfd_elf32_tradbigmips_vec;
extern const bfd_target bfd_elf32_tradlittlemips_vec;
extern const bfd_target bfd_elf32_bigmips_vec;
extern const bfd_target bfd_elf32_littlemips_vec;
/* Nonzero if ABFD is using the N32 ABI. */
#define ABI_N32_P(abfd) \
((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
/* Nonzero if ABFD is using the 64-bit ABI. */
#define ABI_64_P(abfd) \
((elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64) != 0)
#define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
/* Whether we are trying to be compatible with IRIX at all. */
#define SGI_COMPAT(abfd) \
(elf32_mips_irix_compat (abfd) != ict_none)
/* The size of an external REL relocation. */
#define MIPS_ELF_REL_SIZE(abfd) \
(get_elf_backend_data (abfd)->s->sizeof_rel)
/* The number of local .got entries we reserve. */
#define MIPS_RESERVED_GOTNO (2)
#if 0
/* We no longer try to identify particular sections for the .dynsym
section. When we do, we wind up crashing if there are other random
sections with relocations. */
/* Names of sections which appear in the .dynsym section in an Irix 5
executable. */
static const char * const mips_elf_dynsym_sec_names[] =
{
".text",
".init",
".fini",
".data",
".rodata",
".sdata",
".sbss",
".bss",
NULL
};
#define SIZEOF_MIPS_DYNSYM_SECNAMES \
(sizeof mips_elf_dynsym_sec_names / sizeof mips_elf_dynsym_sec_names[0])
/* The number of entries in mips_elf_dynsym_sec_names which go in the
text segment. */
#define MIPS_TEXT_DYNSYM_SECNO (3)
#endif /* 0 */
/* The names of the runtime procedure table symbols used on Irix 5. */
static const char * const mips_elf_dynsym_rtproc_names[] =
{
"_procedure_table",
"_procedure_string_table",
"_procedure_table_size",
NULL
};
/* These structures are used to generate the .compact_rel section on
Irix 5. */
typedef struct
{
unsigned long id1; /* Always one? */
unsigned long num; /* Number of compact relocation entries. */
unsigned long id2; /* Always two? */
unsigned long offset; /* The file offset of the first relocation. */
unsigned long reserved0; /* Zero? */
unsigned long reserved1; /* Zero? */
} Elf32_compact_rel;
typedef struct
{
bfd_byte id1[4];
bfd_byte num[4];
bfd_byte id2[4];
bfd_byte offset[4];
bfd_byte reserved0[4];
bfd_byte reserved1[4];
} Elf32_External_compact_rel;
typedef struct
{
unsigned int ctype : 1; /* 1: long 0: short format. See below. */
unsigned int rtype : 4; /* Relocation types. See below. */
unsigned int dist2to : 8;
unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
unsigned long konst; /* KONST field. See below. */
unsigned long vaddr; /* VADDR to be relocated. */
} Elf32_crinfo;
typedef struct
{
unsigned int ctype : 1; /* 1: long 0: short format. See below. */
unsigned int rtype : 4; /* Relocation types. See below. */
unsigned int dist2to : 8;
unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
unsigned long konst; /* KONST field. See below. */
} Elf32_crinfo2;
typedef struct
{
bfd_byte info[4];
bfd_byte konst[4];
bfd_byte vaddr[4];
} Elf32_External_crinfo;
typedef struct
{
bfd_byte info[4];
bfd_byte konst[4];
} Elf32_External_crinfo2;
/* These are the constants used to swap the bitfields in a crinfo. */
#define CRINFO_CTYPE (0x1)
#define CRINFO_CTYPE_SH (31)
#define CRINFO_RTYPE (0xf)
#define CRINFO_RTYPE_SH (27)
#define CRINFO_DIST2TO (0xff)
#define CRINFO_DIST2TO_SH (19)
#define CRINFO_RELVADDR (0x7ffff)
#define CRINFO_RELVADDR_SH (0)
/* A compact relocation info has long (3 words) or short (2 words)
formats. A short format doesn't have VADDR field and relvaddr
fields contains ((VADDR - vaddr of the previous entry) >> 2). */
#define CRF_MIPS_LONG 1
#define CRF_MIPS_SHORT 0
/* There are 4 types of compact relocation at least. The value KONST
has different meaning for each type:
(type) (konst)
CT_MIPS_REL32 Address in data
CT_MIPS_WORD Address in word (XXX)
CT_MIPS_GPHI_LO GP - vaddr
CT_MIPS_JMPAD Address to jump
*/
#define CRT_MIPS_REL32 0xa
#define CRT_MIPS_WORD 0xb
#define CRT_MIPS_GPHI_LO 0xc
#define CRT_MIPS_JMPAD 0xd
#define mips_elf_set_cr_format(x,format) ((x).ctype = (format))
#define mips_elf_set_cr_type(x,type) ((x).rtype = (type))
#define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v))
#define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2)
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
from smaller values. Start with zero, widen, *then* decrement. */
#define MINUS_ONE (((bfd_vma)0) - 1)
@ -904,7 +760,7 @@ mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data, input_section,
bfd_vma relocation;
struct mips_hi16 *n;
/* If we're relocating, and this an external symbol, we don't want
/* If we're relocating, and this is an external symbol, we don't want
to change anything. */
if (output_bfd != (bfd *) NULL
&& (symbol->flags & BSF_SECTION_SYM) == 0
@ -1099,7 +955,7 @@ mips_elf_got16_reloc (abfd, reloc_entry, symbol, data, input_section,
bfd *output_bfd;
char **error_message;
{
/* If we're relocating, and this an external symbol, we don't want
/* If we're relocating, and this is an external symbol, we don't want
to change anything. */
if (output_bfd != (bfd *) NULL
&& (symbol->flags & BSF_SECTION_SYM) == 0
@ -1264,8 +1120,8 @@ _bfd_mips_elf32_gprel16_reloc (abfd, reloc_entry, symbol, data, input_section,
data, gp);
}
/* Do a R_MIPS_GPREL32 relocation. Is this 32 bit value the offset
from the gp register? XXX */
/* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must
become the offset from the gp register. */
static bfd_reloc_status_type gprel32_with_gp PARAMS ((bfd *, asymbol *,
arelent *, asection *,
@ -1531,8 +1387,8 @@ mips16_gprel_reloc (abfd, reloc_entry, symbol, data, input_section,
/* A mapping from BFD reloc types to MIPS ELF reloc types. */
struct elf_reloc_map {
bfd_reloc_code_real_type bfd_reloc_val;
enum elf_mips_reloc_type elf_reloc_val;
bfd_reloc_code_real_type bfd_val;
enum elf_mips_reloc_type elf_val;
};
static const struct elf_reloc_map mips_reloc_map[] =
@ -1540,6 +1396,7 @@ static const struct elf_reloc_map mips_reloc_map[] =
{ BFD_RELOC_NONE, R_MIPS_NONE, },
{ BFD_RELOC_16, R_MIPS_16 },
{ BFD_RELOC_32, R_MIPS_32 },
/* There is no BFD reloc for R_MIPS_REL32. */
{ BFD_RELOC_64, R_MIPS_64 },
{ BFD_RELOC_MIPS_JMP, R_MIPS_26 },
{ BFD_RELOC_HI16_S, R_MIPS_HI16 },
@ -1568,11 +1425,13 @@ bfd_elf32_bfd_reloc_type_lookup (abfd, code)
bfd_reloc_code_real_type code;
{
unsigned int i;
reloc_howto_type *howto_table = elf_mips_howto_table_rel;
for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); i++)
for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
i++)
{
if (mips_reloc_map[i].bfd_reloc_val == code)
return &elf_mips_howto_table_rel[(int) mips_reloc_map[i].elf_reloc_val];
if (mips_reloc_map[i].bfd_val == code)
return &howto_table[(int) mips_reloc_map[i].elf_val];
}
switch (code)
@ -1586,7 +1445,7 @@ bfd_elf32_bfd_reloc_type_lookup (abfd, code)
Select the right relocation (R_MIPS_32 or R_MIPS_64) based on the
size of addresses on this architecture. */
if (bfd_arch_bits_per_address (abfd) == 32)
return &elf_mips_howto_table_rel[(int) R_MIPS_32];
return &howto_table[(int) R_MIPS_32];
else
return &elf_mips_ctor64_howto;
@ -1622,32 +1481,22 @@ mips_elf32_rtype_to_howto (r_type, rela_p)
{
case R_MIPS16_26:
return &elf_mips16_jump_howto;
break;
case R_MIPS16_GPREL:
return &elf_mips16_gprel_howto;
break;
case R_MIPS_GNU_VTINHERIT:
return &elf_mips_gnu_vtinherit_howto;
break;
case R_MIPS_GNU_VTENTRY:
return &elf_mips_gnu_vtentry_howto;
break;
case R_MIPS_GNU_REL_HI16:
return &elf_mips_gnu_rel_hi16;
break;
case R_MIPS_GNU_REL_LO16:
return &elf_mips_gnu_rel_lo16;
break;
case R_MIPS_GNU_REL16_S2:
return &elf_mips_gnu_rel16_s2;
break;
case R_MIPS_PC64:
return &elf_mips_gnu_pcrel64;
break;
case R_MIPS_PC32:
return &elf_mips_gnu_pcrel32;
break;
default:
BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
return &elf_mips_howto_table_rel[r_type];
@ -1822,7 +1671,6 @@ elf32_mips_discard_info (abfd, cookie, info)
struct bfd_link_info *info;
{
asection *o;
struct elf_backend_data *bed = get_elf_backend_data (abfd);
boolean ret = false;
unsigned char *tdata;
size_t i, skip;
@ -1852,8 +1700,7 @@ elf32_mips_discard_info (abfd, cookie, info)
}
cookie->rel = cookie->rels;
cookie->relend =
cookie->rels + o->reloc_count * bed->s->int_rels_per_ext_rel;
cookie->relend = cookie->rels + o->reloc_count;
for (i = 0, skip = 0; i < o->_raw_size; i ++)
{
@ -1927,11 +1774,11 @@ static irix_compat_t
elf32_mips_irix_compat (abfd)
bfd *abfd;
{
if ((abfd->xvec == &bfd_elf32_tradbigmips_vec)
|| (abfd->xvec == &bfd_elf32_tradlittlemips_vec))
return ict_none;
else
if ((abfd->xvec == &bfd_elf32_bigmips_vec)
|| (abfd->xvec == &bfd_elf32_littlemips_vec))
return ict_irix5;
else
return ict_none;
}
/* Given a data section and an in-memory embedded reloc section, store