This is the mail archive of the gas2@sourceware.cygnus.com mailing list for the gas2 project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
On Tue, 7 July 1998, 11:27:12, ian@cygnus.com wrote:
> Date: Tue, 7 Jul 1998 12:59:39 +0200 (MET DST)
> From: Manfred Hollstein <manfred@s-direktnet.de>
>
> Given this small C source
>
> /* foo.c */
> extern char global_var;
> main () { global_var = 1; }
> /* EOF */
>
> should result in an executable with undefined symbols, shouldn't it?
>
> ...
>
> As you can see, "global_var" is still undefined. This problem isn't
> new, I can easily reproduce it with binutils-2.7 - funnily, we've been
> using this linker already without problems for many million lines of
> C/C++ code :-?
>
> Judging by the howto fields in coff-m88k.c, all m88k relocs are
> handled by the function m88k_special_reloc in that file. That
> function does not seem to check for undefined symbols when handling
> the R_HVRT16 and R_LVRT16 reloc types. Since it returns bfd_reloc_ok
> for those types, no further checking will be done. It should return
> bfd_reloc_undefined instead for an undefined symbol. See
> bfd_perform_relocation.
>
> Ian
Ahh yes, thank you very much for the illumination; I should have
recognized this myself as I introduced the m88k_special_reloc function :-(
The appended patch works for me; Ian, will you check it into the
current development sources?
Thanks, Manfred.
Wed Jul 8 08:01:32 1998 Manfred Hollstein <manfred@s-direktnet.de>
* coff-m88k.c (m88k_special_reloc): Don't loose the information
that a symbol is undefined.
diff -rup -x CVS -x RCS -x *.o -x *.info* -x *.html* -x *.elc -x *.dvi -x *.orig -x *~ -x version.el binutils-2.9.1.orig/bfd/coff-m88k.c binutils-2.9.1/bfd/coff-m88k.c
--- binutils-2.9.1.orig/bfd/coff-m88k.c Fri May 1 17:48:04 1998
+++ binutils-2.9.1/bfd/coff-m88k.c Wed Jul 8 08:03:11 1998
@@ -117,8 +117,12 @@ m88k_special_reloc (abfd, reloc_entry, s
bfd_put_16 (abfd, relocation, (unsigned char *) data + addr);
}
+ /* If we are not producing relocateable output, return an error if
+ the symbol is not defined. */
+ if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
+ return bfd_reloc_undefined;
+
return bfd_reloc_ok;
- break;
default:
if (output_bfd != (bfd *) NULL)