This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: another round of h8300-rtems/coff problems
- To: Joel Sherrill <joel dot sherrill at OARcorp dot com>
- Subject: Re: another round of h8300-rtems/coff problems
- From: Alan Modra <alan at linuxcare dot com dot au>
- Date: Thu, 2 Nov 2000 18:24:21 +1100 (EST)
- cc: Nick Clifton <nickc at redhat dot com>, binutils at sourceware dot cygnus dot com
On Thu, 2 Nov 2000, I wrote:
> my way around the coff code. The snag I hit with this simple "fix" is
> that coff_slurp_reloc_table is called too early in the link process to
> have set up section->offset, and saves away the relocs in asect->relocation.
> When called later, at a stage where we could make use of section->offset,
> nothing happens in coff_slurp_reloc_table because the saved relocs are
> available. Looks like a generic coff bug.
Try this one.
bfd/ChangeLog
* coffcode.h (coff_slurp_reloc_table): Move asect->relocation test
from here..
(coff_canonicalize_reloc): ..to here. Adjust reloc addresses for
relocatable link.
Alan Modra
--
Linuxcare. Support for the Revolution.
Index: coffcode.h
===================================================================
RCS file: /cvs/src/src/bfd/coffcode.h,v
retrieving revision 1.47
diff -u -p -r1.47 coffcode.h
--- coffcode.h 2000/10/06 19:47:51 1.47
+++ coffcode.h 2000/11/02 07:02:33
@@ -4745,8 +4745,6 @@ coff_slurp_reloc_table (abfd, asect, sym
unsigned int idx;
- if (asect->relocation)
- return true;
if (asect->reloc_count == 0)
return true;
if (asect->flags & SEC_CONSTRUCTOR)
@@ -4883,9 +4881,7 @@ coff_canonicalize_reloc (abfd, section,
arelent ** relptr;
asymbol ** symbols;
{
- arelent *tblptr = section->relocation;
- unsigned int count = 0;
-
+ unsigned int count;
if (section->flags & SEC_CONSTRUCTOR)
{
@@ -4902,16 +4898,32 @@ coff_canonicalize_reloc (abfd, section,
}
else
{
- if (! coff_slurp_reloc_table (abfd, section, symbols))
- return -1;
+ arelent *tblptr = section->relocation;
- tblptr = section->relocation;
+ if (tblptr != NULL)
+ {
+ /* We have already been called once during the load_symbols
+ stage of a link. If called again, it's from the ldwrite
+ stage of a relocatable link. We need to adjust all the
+ reloc offsets here in that case. */
+ if (section->output_offset != 0)
+ for (count = 0; count < section->reloc_count; count++)
+ {
+ tblptr->address += section->output_offset;
+ tblptr++;
+ }
+ }
+ else
+ {
+ if (! coff_slurp_reloc_table (abfd, section, symbols))
+ return -1;
+ }
- for (; count++ < section->reloc_count;)
+ tblptr = section->relocation;
+ for (count = 0; count < section->reloc_count; count++)
*relptr++ = tblptr++;
-
-
}
+
*relptr = 0;
return section->reloc_count;
}