aboutsummaryrefslogtreecommitdiff
path: root/bfd/coff-mips.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1993-02-03 17:14:11 +0000
committerIan Lance Taylor <ian@airs.com>1993-02-03 17:14:11 +0000
commit6d18a99d251727f46659a2e85a23544583ab8fd9 (patch)
tree7465bca07acbc85c4672c67f5c9e874f0cdc64ba /bfd/coff-mips.c
parent31965c32d0ceb4d2fe47d2e89c0ca5ecd58fe9ac (diff)
downloadgdb-6d18a99d251727f46659a2e85a23544583ab8fd9.zip
gdb-6d18a99d251727f46659a2e85a23544583ab8fd9.tar.gz
gdb-6d18a99d251727f46659a2e85a23544583ab8fd9.tar.bz2
Fix some minor bugs, make work on big endian machines, remember
text_start and text_end for future use by gdb and current use by find_nearest_line. Still covered by last ChangeLog entry, I think.
Diffstat (limited to 'bfd/coff-mips.c')
-rw-r--r--bfd/coff-mips.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/bfd/coff-mips.c b/bfd/coff-mips.c
index 95dba88..81406b5 100644
--- a/bfd/coff-mips.c
+++ b/bfd/coff-mips.c
@@ -45,6 +45,11 @@ typedef struct ecoff_tdata
/* The symbol table file position, set by ecoff_mkobject_hook. */
file_ptr sym_filepos;
+ /* The start and end of the text segment. Only valid for an
+ existing file, not for one we are creating. */
+ unsigned long text_start;
+ unsigned long text_end;
+
/* The cached gp value. This is used when relocating. */
bfd_vma gp;
@@ -353,6 +358,8 @@ ecoff_mkobject_hook (abfd, filehdr, aouthdr)
{
int i;
+ ecoff->text_start = internal_a->text_start;
+ ecoff->text_end = internal_a->text_start + internal_a->tsize;
ecoff->gp = internal_a->gp_value;
ecoff->gprmask = internal_a->gprmask;
for (i = 0; i < 4; i++)
@@ -375,8 +382,8 @@ ecoff_set_arch_mach_hook (abfd, filehdr)
switch (internal_f->f_magic)
{
case MIPS_MAGIC_1:
- case MIPS_MAGIC_2:
- case MIPS_MAGIC_3:
+ case MIPS_MAGIC_LITTLE:
+ case MIPS_MAGIC_BIG:
arch = bfd_arch_mips;
break;
@@ -558,9 +565,9 @@ ecoff_slurp_symbolic_info (abfd)
{
long cbline, issmax, issextmax;
- cbline = (internal_symhdr->cbLine + 3) &~ 4;
- issmax = (internal_symhdr->issMax + 3) &~ 4;
- issextmax = (internal_symhdr->issExtMax + 3) &~ 4;
+ cbline = (internal_symhdr->cbLine + 3) &~ 3;
+ issmax = (internal_symhdr->issMax + 3) &~ 3;
+ issextmax = (internal_symhdr->issExtMax + 3) &~ 3;
raw_size = (cbline * sizeof (unsigned char)
+ internal_symhdr->idnMax * sizeof (struct dnr_ext)
+ internal_symhdr->ipdMax * sizeof (struct pdr_ext)
@@ -2095,7 +2102,9 @@ ecoff_find_nearest_line (abfd,
/* If we're not in the .text section, we don't have any line
numbers. */
- if (strcmp (section->name, _TEXT) != 0)
+ if (strcmp (section->name, _TEXT) != 0
+ || offset < ecoff_data (abfd)->text_start
+ || offset >= ecoff_data (abfd)->text_end)
return false;
/* Make sure we have the FDR's. */
@@ -2113,10 +2122,11 @@ ecoff_find_nearest_line (abfd,
fdr_hold = (FDR *) NULL;
for (fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++)
{
+ if (fdr_ptr->cpd == 0)
+ continue;
if (offset < fdr_ptr->adr)
break;
- if (fdr_ptr->cpd > 0)
- fdr_hold = fdr_ptr;
+ fdr_hold = fdr_ptr;
}
if (fdr_hold == (FDR *) NULL)
return false;
@@ -2180,10 +2190,6 @@ ecoff_find_nearest_line (abfd,
offset -= count * 4;
}
- /* If offset is too large, this line is not interesting. */
- if (offset > 100)
- return false;
-
/* If fdr_ptr->rss is -1, then this file does not have full symbols,
at least according to gdb/mipsread.c. */
if (fdr_ptr->rss == -1)
@@ -3328,7 +3334,10 @@ ecoff_write_object_contents (abfd)
/* Set up the file header. */
- internal_f.f_magic = MIPS_MAGIC_2;
+ if (abfd->xvec->header_byteorder_big_p != false)
+ internal_f.f_magic = MIPS_MAGIC_BIG;
+ else
+ internal_f.f_magic = MIPS_MAGIC_LITTLE;
/*
We will NOT put a fucking timestamp in the header here. Every time you
@@ -3659,7 +3668,7 @@ ecoff_slurp_armap (abfd)
/* Make sure we have the right byte ordering. */
if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
^ (abfd->xvec->header_byteorder_big_p != false))
- || ((nextname[ARMAP_OBJECT_MARKER_INDEX] == ARMAP_BIG_ENDIAN)
+ || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
^ (abfd->xvec->byteorder_big_p != false)))
{
bfd_error = wrong_format;