* 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:
parent
efa6c49704
commit
656c5b6d7e
|
@ -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.
|
||||||
|
|
||||||
|
|
93
bfd/ecoff.c
93
bfd/ecoff.c
|
@ -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,7 +4599,8 @@ 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,
|
||||||
|
link_order->u.reloc.p->u.name,
|
||||||
false, false, false);
|
false, false, false);
|
||||||
if (h != NULL
|
if (h != NULL
|
||||||
&& (h->type == bfd_link_hash_defined
|
&& (h->type == bfd_link_hash_defined
|
||||||
|
@ -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 *)
|
||||||
|
bfd_wrapped_link_hash_lookup (output_bfd, info,
|
||||||
link_order->u.reloc.p->u.name,
|
link_order->u.reloc.p->u.name,
|
||||||
false, false, true);
|
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;
|
||||||
|
|
Loading…
Reference in New Issue