* ecoff.c (ecoff_compute_section_file_positions): Track the real

file position and the virtual file position separately.  Set
	filepos information bsaed on the real file position.
	(_bfd_ecoff_set_section_contents): Handle .lib sections like the
	Jan 23 change to coffcode.h.
Make Irix 4 shared libraries work again.
This commit is contained in:
Ian Lance Taylor 1996-04-26 23:16:52 +00:00
parent efa6c49704
commit 656c5b6d7e
2 changed files with 78 additions and 27 deletions

View File

@ -1,5 +1,11 @@
Fri Apr 26 18:00:37 1996 Ian Lance Taylor <ian@cygnus.com> Fri Apr 26 18:00:37 1996 Ian Lance Taylor <ian@cygnus.com>
* ecoff.c (ecoff_compute_section_file_positions): Track the real
file position and the virtual file position separately. Set
filepos information bsaed on the real file position.
(_bfd_ecoff_set_section_contents): Handle .lib sections like the
Jan 23 change to coffcode.h.
* som.c (som_slurp_symbol_table): Set the symbol count to the * som.c (som_slurp_symbol_table): Set the symbol count to the
number of BFD symbols created. number of BFD symbols created.

View File

@ -1822,12 +1822,9 @@ _bfd_ecoff_find_nearest_line (abfd, section, ignore_symbols, offset,
{ {
ecoff_data (abfd)->find_line_info = ecoff_data (abfd)->find_line_info =
((struct ecoff_find_line *) ((struct ecoff_find_line *)
bfd_alloc (abfd, sizeof (struct ecoff_find_line))); bfd_zalloc (abfd, sizeof (struct ecoff_find_line)));
if (ecoff_data (abfd)->find_line_info == NULL) if (ecoff_data (abfd)->find_line_info == NULL)
return false; return false;
ecoff_data (abfd)->find_line_info->find_buffer = NULL;
ecoff_data (abfd)->find_line_info->fdrtab_len = 0;
ecoff_data (abfd)->find_line_info->fdrtab = NULL;
} }
line_info = ecoff_data (abfd)->find_line_info; line_info = ecoff_data (abfd)->find_line_info;
@ -2043,7 +2040,7 @@ static boolean
ecoff_compute_section_file_positions (abfd) ecoff_compute_section_file_positions (abfd)
bfd *abfd; bfd *abfd;
{ {
file_ptr sofar; file_ptr sofar, file_sofar;
asection **sorted_hdrs; asection **sorted_hdrs;
asection *current; asection *current;
unsigned int i; unsigned int i;
@ -2052,6 +2049,7 @@ ecoff_compute_section_file_positions (abfd)
const bfd_vma round = ecoff_backend (abfd)->round; const bfd_vma round = ecoff_backend (abfd)->round;
sofar = _bfd_ecoff_sizeof_headers (abfd, false); sofar = _bfd_ecoff_sizeof_headers (abfd, false);
file_sofar = sofar;
/* Sort the sections by VMA. */ /* Sort the sections by VMA. */
sorted_hdrs = (asection **) bfd_malloc (abfd->section_count sorted_hdrs = (asection **) bfd_malloc (abfd->section_count
@ -2075,10 +2073,6 @@ ecoff_compute_section_file_positions (abfd)
current = sorted_hdrs[i]; current = sorted_hdrs[i];
/* Only deal with sections which have contents */
if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) == 0)
continue;
/* For the Alpha ECOFF .pdata section the lnnoptr field is /* For the Alpha ECOFF .pdata section the lnnoptr field is
supposed to indicate the number of .pdata entries that are supposed to indicate the number of .pdata entries that are
really in the section. Each entry is 8 bytes. We store this really in the section. Each entry is 8 bytes. We store this
@ -2107,6 +2101,7 @@ ecoff_compute_section_file_positions (abfd)
&& strcmp (current->name, _RCONST) != 0) && strcmp (current->name, _RCONST) != 0)
{ {
sofar = (sofar + round - 1) &~ (round - 1); sofar = (sofar + round - 1) &~ (round - 1);
file_sofar = (file_sofar + round - 1) &~ (round - 1);
first_data = false; first_data = false;
} }
else if (strcmp (current->name, _LIB) == 0) else if (strcmp (current->name, _LIB) == 0)
@ -2116,6 +2111,7 @@ ecoff_compute_section_file_positions (abfd)
page boundary. */ page boundary. */
sofar = (sofar + round - 1) &~ (round - 1); sofar = (sofar + round - 1) &~ (round - 1);
file_sofar = (file_sofar + round - 1) &~ (round - 1);
} }
else if (first_nonalloc else if (first_nonalloc
&& (current->flags & SEC_ALLOC) == 0 && (current->flags & SEC_ALLOC) == 0
@ -2126,31 +2122,42 @@ ecoff_compute_section_file_positions (abfd)
for the .bss section. */ for the .bss section. */
first_nonalloc = false; first_nonalloc = false;
sofar = (sofar + round - 1) &~ (round - 1); sofar = (sofar + round - 1) &~ (round - 1);
file_sofar = (file_sofar + round - 1) &~ (round - 1);
} }
/* Align the sections in the file to the same boundary on /* Align the sections in the file to the same boundary on
which they are aligned in virtual memory. */ which they are aligned in virtual memory. */
old_sofar = sofar;
sofar = BFD_ALIGN (sofar, 1 << alignment_power); sofar = BFD_ALIGN (sofar, 1 << alignment_power);
if ((current->flags & SEC_HAS_CONTENTS) != 0)
file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
if ((abfd->flags & D_PAGED) != 0 if ((abfd->flags & D_PAGED) != 0
&& (current->flags & SEC_ALLOC) != 0) && (current->flags & SEC_ALLOC) != 0)
sofar += (current->vma - sofar) % round; {
sofar += (current->vma - sofar) % round;
if ((current->flags & SEC_HAS_CONTENTS) != 0)
file_sofar += (current->vma - file_sofar) % round;
}
current->filepos = sofar; if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) != 0)
current->filepos = file_sofar;
sofar += current->_raw_size; sofar += current->_raw_size;
if ((current->flags & SEC_HAS_CONTENTS) != 0)
file_sofar += current->_raw_size;
/* make sure that this section is of the right size too */ /* make sure that this section is of the right size too */
old_sofar = sofar; old_sofar = sofar;
sofar = BFD_ALIGN (sofar, 1 << alignment_power); sofar = BFD_ALIGN (sofar, 1 << alignment_power);
if ((current->flags & SEC_HAS_CONTENTS) != 0)
file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
current->_raw_size += sofar - old_sofar; current->_raw_size += sofar - old_sofar;
} }
free (sorted_hdrs); free (sorted_hdrs);
sorted_hdrs = NULL; sorted_hdrs = NULL;
ecoff_data (abfd)->reloc_filepos = sofar; ecoff_data (abfd)->reloc_filepos = file_sofar;
return true; return true;
} }
@ -2230,11 +2237,22 @@ _bfd_ecoff_set_section_contents (abfd, section, location, offset, count)
return false; return false;
} }
/* If this is a .lib section, bump the vma address so that it winds /* Handle the .lib section specially so that Irix 4 shared libraries
up being the number of .lib sections output. This is right for work out. See coff_set_section_contents in coffcode.h. */
Irix 4. Ian Taylor <ian@cygnus.com>. */
if (strcmp (section->name, _LIB) == 0) if (strcmp (section->name, _LIB) == 0)
++section->vma; {
bfd_byte *rec, *recend;
rec = (bfd_byte *) location;
recend = rec + count;
while (rec < recend)
{
++section->lma;
rec += bfd_get_32 (abfd, rec) * 4;
}
BFD_ASSERT (rec == recend);
}
if (count == 0) if (count == 0)
return true; return true;
@ -3407,6 +3425,7 @@ ecoff_link_add_archive_symbols (abfd, info)
bfd *abfd; bfd *abfd;
struct bfd_link_info *info; struct bfd_link_info *info;
{ {
const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
const bfd_byte *raw_armap; const bfd_byte *raw_armap;
struct bfd_link_hash_entry **pundef; struct bfd_link_hash_entry **pundef;
unsigned int armap_count; unsigned int armap_count;
@ -3528,7 +3547,7 @@ ecoff_link_add_archive_symbols (abfd, info)
hash = srch; hash = srch;
} }
element = _bfd_get_elt_at_filepos (abfd, file_offset); element = (*backend->get_elt_at_filepos) (abfd, file_offset);
if (element == (bfd *) NULL) if (element == (bfd *) NULL)
return false; return false;
@ -3959,6 +3978,14 @@ static boolean ecoff_reloc_link_order
PARAMS ((bfd *, struct bfd_link_info *, asection *, PARAMS ((bfd *, struct bfd_link_info *, asection *,
struct bfd_link_order *)); struct bfd_link_order *));
/* Structure used to pass information to ecoff_link_write_external. */
struct extsym_info
{
bfd *abfd;
struct bfd_link_info *info;
};
/* ECOFF final link routine. This looks through all the input BFDs /* ECOFF final link routine. This looks through all the input BFDs
and gathers together all the debugging information, and then and gathers together all the debugging information, and then
processes all the link order information. This may cause it to processes all the link order information. This may cause it to
@ -3976,6 +4003,7 @@ _bfd_ecoff_bfd_final_link (abfd, info)
register bfd *input_bfd; register bfd *input_bfd;
asection *o; asection *o;
struct bfd_link_order *p; struct bfd_link_order *p;
struct extsym_info einfo;
/* We accumulate the debugging information counts in the symbolic /* We accumulate the debugging information counts in the symbolic
header. */ header. */
@ -4046,9 +4074,11 @@ _bfd_ecoff_bfd_final_link (abfd, info)
} }
/* Write out the external symbols. */ /* Write out the external symbols. */
einfo.abfd = abfd;
einfo.info = info;
ecoff_link_hash_traverse (ecoff_hash_table (info), ecoff_link_hash_traverse (ecoff_hash_table (info),
ecoff_link_write_external, ecoff_link_write_external,
(PTR) abfd); (PTR) &einfo);
if (info->relocateable) if (info->relocateable)
{ {
@ -4269,11 +4299,24 @@ ecoff_link_write_external (h, data)
struct ecoff_link_hash_entry *h; struct ecoff_link_hash_entry *h;
PTR data; PTR data;
{ {
bfd *output_bfd = (bfd *) data; struct extsym_info *einfo = (struct extsym_info *) data;
bfd *output_bfd = einfo->abfd;
boolean strip;
/* FIXME: We should check if this symbol is being stripped. */ /* We need to check if this symbol is being stripped. */
if (h->root.type == bfd_link_hash_undefined
|| h->root.type == bfd_link_hash_undefweak)
strip = false;
else if (einfo->info->strip == strip_all
|| (einfo->info->strip == strip_some
&& bfd_hash_lookup (einfo->info->keep_hash,
h->root.root.string,
false, false) == NULL))
strip = true;
else
strip = false;
if (h->written) if (strip || h->written)
return true; return true;
if (h->abfd == (bfd *) NULL) if (h->abfd == (bfd *) NULL)
@ -4556,8 +4599,9 @@ ecoff_reloc_link_order (output_bfd, info, output_section, link_order)
/* Treat a reloc against a defined symbol as though it were /* Treat a reloc against a defined symbol as though it were
actually against the section. */ actually against the section. */
h = bfd_link_hash_lookup (info->hash, link_order->u.reloc.p->u.name, h = bfd_wrapped_link_hash_lookup (output_bfd, info,
false, false, false); link_order->u.reloc.p->u.name,
false, false, false);
if (h != NULL if (h != NULL
&& (h->type == bfd_link_hash_defined && (h->type == bfd_link_hash_defined
|| h->type == bfd_link_hash_defweak)) || h->type == bfd_link_hash_defweak))
@ -4633,9 +4677,10 @@ ecoff_reloc_link_order (output_bfd, info, output_section, link_order)
{ {
struct ecoff_link_hash_entry *h; struct ecoff_link_hash_entry *h;
h = ecoff_link_hash_lookup (ecoff_hash_table (info), h = ((struct ecoff_link_hash_entry *)
link_order->u.reloc.p->u.name, bfd_wrapped_link_hash_lookup (output_bfd, info,
false, false, true); link_order->u.reloc.p->u.name,
false, false, true));
if (h != (struct ecoff_link_hash_entry *) NULL if (h != (struct ecoff_link_hash_entry *) NULL
&& h->indx != -1) && h->indx != -1)
in.r_symndx = h->indx; in.r_symndx = h->indx;