-/* evax-egsd.c -- BFD back-end for ALPHA EVAX (openVMS/AXP) files.
- Copyright 1996 Free Software Foundation Inc.
+/* evax-egsd.c -- BFD back-end for ALPHA EVAX (openVMS/Alpha) files.
+ Copyright 1996, 1997 Free Software Foundation Inc.
go and read the openVMS linker manual (esp. appendix B)
if you don't know what's going on here :-)
- Written by Klaus Kรคmpf (kkaempf@progis.de)
+ Written by Klaus K"ampf (kkaempf@progis.de)
of proGIS Softwareentwicklung, Aachen, Germany
This program is free software; you can redistribute it and/or modify
#define EVAX_BSS_NAME "$BSS$"
#define EVAX_READONLY_NAME "$READONLY$"
#define EVAX_LITERAL_NAME "$LITERAL$"
+#define EVAX_COMMON_NAME "$COMMON$"
+#define EVAX_LOCAL_NAME "$LOCAL$"
struct sec_flags_struct {
char *name; /* name of section */
}
else /* symbol reference */
{
-#if EVAX_DEBUG
- evax_debug(3, "egsd sym ref #%d (%s, %04x=%s)\n", abfd->symcount, evax_rec+9, old_flags, flag2str(gsyflagdesc, old_flags));
-#endif
symbol->name =
_bfd_evax_save_counted_string ((char *)evax_rec+8);
+#if EVAX_DEBUG
+ evax_debug(3, "egsd sym ref #%d (%s, %04x=%s)\n", abfd->symcount,
+ symbol->name, old_flags, flag2str(gsyflagdesc, old_flags));
+#endif
symbol->section = bfd_make_section (abfd, BFD_UND_SECTION_NAME);
}
sname = EVAX_READONLY_NAME;
else if ((*sname == 'l') && (strcmp (sname, "literal") == 0))
sname = EVAX_LITERAL_NAME;
+ else if ((*sname == 'c') && (strcmp (sname, "comm") == 0))
+ sname = EVAX_COMMON_NAME;
+ else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
+ sname = EVAX_LOCAL_NAME;
}
_bfd_evax_output_begin (abfd, EGSD_S_C_PSC, -1);
}
old_flags = symbol->flags;
+ if ((*(symbol->section->name+1) == 'c')
+ && (strcmp (symbol->section->name+1, "comm") == 0)
+ && (strcmp (symbol->name, ".comm") != 0))
+ old_flags |= BSF_GLOBAL;
+
+ if (old_flags & BSF_FILE)
+ continue;
+
if (((old_flags & BSF_GLOBAL) == 0) /* not xdef */
&& (!bfd_is_und_section (symbol->section))) /* and not xref */
continue; /* dont output */
_bfd_evax_output_long (abfd, symbol->section->index);/* L_PSINDX, FIXME */
}
}
- if (strlen ((char *)symbol->name) > 198)
- {
- (*_bfd_error_handler) ("Name '%s' too long\n", symbol->name);
- abort ();
- }
- nptr = (char *)symbol->name;
- uptr = uname;
- while (*nptr)
- {
- if (islower (*nptr))
- *uptr = toupper (*nptr);
- else
- *uptr = *nptr;
- uptr++;
- nptr++;
- }
- *uptr = 0;
- _bfd_evax_output_counted (abfd, uname);
+ _bfd_evax_output_counted (abfd, _bfd_evax_length_hash_symbol (abfd, symbol->name));
_bfd_evax_output_flush (abfd);