1 /* coff object file format
2 Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005
4 Free Software Foundation, Inc.
6 This file is part of GAS.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23 #define OBJ_HEADER "obj-coff.h"
33 #define streq(a,b) (strcmp ((a), (b)) == 0)
34 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
36 /* I think this is probably always correct. */
37 #ifndef KEEP_RELOC_INFO
38 #define KEEP_RELOC_INFO
41 /* obj_coff_section will use this macro to set a new section's
42 attributes when a directive has no valid flags or the "w" flag is
43 used. This default should be appropriate for most. */
44 #ifndef TC_COFF_SECTION_DEFAULT_ATTRIBUTES
45 #define TC_COFF_SECTION_DEFAULT_ATTRIBUTES (SEC_LOAD | SEC_DATA)
48 /* This is used to hold the symbol built by a sequence of pseudo-ops
49 from .def and .endef. */
50 static symbolS *def_symbol_in_progress;
52 /* PE weak alternate symbols begin with this string. */
53 static const char weak_altprefix[] = ".weak.";
58 unsigned long chunk_size;
59 unsigned long element_size;
62 unsigned long pointer;
70 stack_init (unsigned long chunk_size,
71 unsigned long element_size)
75 st = malloc (sizeof (* st));
78 st->data = malloc (chunk_size);
85 st->size = chunk_size;
86 st->chunk_size = chunk_size;
87 st->element_size = element_size;
92 stack_push (stack *st, char *element)
94 if (st->pointer + st->element_size >= st->size)
96 st->size += st->chunk_size;
97 if ((st->data = xrealloc (st->data, st->size)) == NULL)
100 memcpy (st->data + st->pointer, element, st->element_size);
101 st->pointer += st->element_size;
102 return st->data + st->pointer;
106 stack_pop (stack *st)
108 if (st->pointer < st->element_size)
113 st->pointer -= st->element_size;
114 return st->data + st->pointer;
117 /* Maintain a list of the tagnames of the structures. */
119 static struct hash_control *tag_hash;
124 tag_hash = hash_new ();
128 tag_insert (const char *name, symbolS *symbolP)
130 const char *error_string;
132 if ((error_string = hash_jam (tag_hash, name, (char *) symbolP)))
133 as_fatal (_("Inserting \"%s\" into structure table failed: %s"),
138 tag_find (char *name)
140 return (symbolS *) hash_find (tag_hash, name);
144 tag_find_or_make (char *name)
148 if ((symbolP = tag_find (name)) == NULL)
150 symbolP = symbol_new (name, undefined_section,
151 0, &zero_address_frag);
153 tag_insert (S_GET_NAME (symbolP), symbolP);
154 symbol_table_insert (symbolP);
160 /* We accept the .bss directive to set the section for backward
161 compatibility with earlier versions of gas. */
164 obj_coff_bss (int ignore ATTRIBUTE_UNUSED)
166 if (*input_line_pointer == '\n')
167 subseg_new (".bss", get_absolute_expression ());
172 #define GET_FILENAME_STRING(X) \
173 ((char *) (&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1])
177 fetch_coff_debug_section (void)
179 static segT debug_section;
185 s = bfd_make_debug_symbol (stdoutput, NULL, 0);
187 debug_section = s->section;
189 return debug_section;
193 SA_SET_SYM_ENDNDX (symbolS *sym, symbolS *val)
195 combined_entry_type *entry, *p;
197 entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1];
198 p = coffsymbol (symbol_get_bfdsym (val))->native;
199 entry->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = p;
204 SA_SET_SYM_TAGNDX (symbolS *sym, symbolS *val)
206 combined_entry_type *entry, *p;
208 entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1];
209 p = coffsymbol (symbol_get_bfdsym (val))->native;
210 entry->u.auxent.x_sym.x_tagndx.p = p;
215 S_GET_DATA_TYPE (symbolS *sym)
217 return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type;
221 S_SET_DATA_TYPE (symbolS *sym, int val)
223 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type = val;
228 S_GET_STORAGE_CLASS (symbolS *sym)
230 return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass;
234 S_SET_STORAGE_CLASS (symbolS *sym, int val)
236 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass = val;
240 /* Merge a debug symbol containing debug information into a normal symbol. */
243 c_symbol_merge (symbolS *debug, symbolS *normal)
245 S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug));
246 S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug));
248 if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal))
249 /* Take the most we have. */
250 S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug));
252 if (S_GET_NUMBER_AUXILIARY (debug) > 0)
253 /* Move all the auxiliary information. */
254 memcpy (SYM_AUXINFO (normal), SYM_AUXINFO (debug),
255 (S_GET_NUMBER_AUXILIARY (debug)
256 * sizeof (*SYM_AUXINFO (debug))));
258 /* Move the debug flags. */
259 SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug));
263 c_dot_file_symbol (const char *filename, int appfile ATTRIBUTE_UNUSED)
267 /* BFD converts filename to a .file symbol with an aux entry. It
268 also handles chaining. */
269 symbolP = symbol_new (filename, bfd_abs_section_ptr, 0, &zero_address_frag);
271 S_SET_STORAGE_CLASS (symbolP, C_FILE);
272 S_SET_NUMBER_AUXILIARY (symbolP, 1);
274 symbol_get_bfdsym (symbolP)->flags = BSF_DEBUGGING;
281 listing_source_file (filename);
285 /* Make sure that the symbol is first on the symbol chain. */
286 if (symbol_rootP != symbolP)
288 symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);
289 symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP);
293 /* Line number handling. */
297 struct line_no *next;
304 /* Symbol of last function, which we should hang line#s off of. */
305 static symbolS *line_fsym;
307 #define in_function() (line_fsym != 0)
308 #define clear_function() (line_fsym = 0)
309 #define set_function(F) (line_fsym = (F), coff_add_linesym (F))
313 coff_obj_symbol_new_hook (symbolS *symbolP)
315 long sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type);
316 char * s = xmalloc (sz);
319 coffsymbol (symbol_get_bfdsym (symbolP))->native = (combined_entry_type *) s;
321 S_SET_DATA_TYPE (symbolP, T_NULL);
322 S_SET_STORAGE_CLASS (symbolP, 0);
323 S_SET_NUMBER_AUXILIARY (symbolP, 0);
325 if (S_IS_STRING (symbolP))
326 SF_SET_STRING (symbolP);
328 if (S_IS_LOCAL (symbolP))
329 SF_SET_LOCAL (symbolP);
333 /* Handle .ln directives. */
335 static symbolS *current_lineno_sym;
336 static struct line_no *line_nos;
337 /* FIXME: Blindly assume all .ln directives will be in the .text section. */
341 add_lineno (fragS * frag, addressT offset, int num)
343 struct line_no * new_line = xmalloc (sizeof (* new_line));
345 if (!current_lineno_sym)
349 /* The native aix assembler accepts negative line number. */
353 /* Zero is used as an end marker in the file. */
354 as_warn (_("Line numbers must be positive integers\n"));
357 #endif /* OBJ_XCOFF */
358 new_line->next = line_nos;
359 new_line->frag = frag;
360 new_line->l.line_number = num;
361 new_line->l.u.offset = offset;
367 coff_add_linesym (symbolS *sym)
371 coffsymbol (symbol_get_bfdsym (current_lineno_sym))->lineno =
376 current_lineno_sym = sym;
380 obj_coff_ln (int appline)
384 if (! appline && def_symbol_in_progress != NULL)
386 as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
387 demand_empty_rest_of_line ();
391 l = get_absolute_expression ();
393 /* If there is no lineno symbol, treat a .ln
394 directive as if it were a .appline directive. */
395 if (appline || current_lineno_sym == NULL)
396 new_logical_line ((char *) NULL, l - 1);
398 add_lineno (frag_now, frag_now_fix (), l);
407 l += coff_line_base - 1;
408 listing_source_line (l);
413 demand_empty_rest_of_line ();
416 /* .loc is essentially the same as .ln; parse it for assembler
420 obj_coff_loc (int ignore ATTRIBUTE_UNUSED)
424 /* FIXME: Why do we need this check? We need it for ECOFF, but why
425 do we need it for COFF? */
426 if (now_seg != text_section)
428 as_warn (_(".loc outside of .text"));
429 demand_empty_rest_of_line ();
433 if (def_symbol_in_progress != NULL)
435 as_warn (_(".loc pseudo-op inside .def/.endef: ignored."));
436 demand_empty_rest_of_line ();
440 /* Skip the file number. */
442 get_absolute_expression ();
445 lineno = get_absolute_expression ();
453 lineno += coff_line_base - 1;
454 listing_source_line (lineno);
459 demand_empty_rest_of_line ();
461 add_lineno (frag_now, frag_now_fix (), lineno);
464 /* Handle the .ident pseudo-op. */
467 obj_coff_ident (int ignore ATTRIBUTE_UNUSED)
469 segT current_seg = now_seg;
470 subsegT current_subseg = now_subseg;
476 /* We could put it in .comment, but that creates an extra section
477 that shouldn't be loaded into memory, which requires linker
478 changes... For now, until proven otherwise, use .rdata. */
479 sec = subseg_new (".rdata$zzz", 0);
480 bfd_set_section_flags (stdoutput, sec,
481 ((SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA)
482 & bfd_applicable_section_flags (stdoutput)));
485 subseg_new (".comment", 0);
489 subseg_set (current_seg, current_subseg);
492 /* Handle .def directives.
494 One might ask : why can't we symbol_new if the symbol does not
495 already exist and fill it with debug information. Because of
496 the C_EFCN special symbol. It would clobber the value of the
497 function symbol before we have a chance to notice that it is
498 a C_EFCN. And a second reason is that the code is more clear this
499 way. (at least I think it is :-). */
501 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
502 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
503 *input_line_pointer == '\t') \
504 input_line_pointer++;
507 obj_coff_def (int what ATTRIBUTE_UNUSED)
509 char name_end; /* Char after the end of name. */
510 char *symbol_name; /* Name of the debug symbol. */
511 char *symbol_name_copy; /* Temporary copy of the name. */
512 unsigned int symbol_name_length;
514 if (def_symbol_in_progress != NULL)
516 as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
517 demand_empty_rest_of_line ();
523 symbol_name = input_line_pointer;
524 name_end = get_symbol_end ();
525 symbol_name_length = strlen (symbol_name);
526 symbol_name_copy = xmalloc (symbol_name_length + 1);
527 strcpy (symbol_name_copy, symbol_name);
528 #ifdef tc_canonicalize_symbol_name
529 symbol_name_copy = tc_canonicalize_symbol_name (symbol_name_copy);
532 /* Initialize the new symbol. */
533 def_symbol_in_progress = symbol_make (symbol_name_copy);
534 symbol_set_frag (def_symbol_in_progress, &zero_address_frag);
535 S_SET_VALUE (def_symbol_in_progress, 0);
537 if (S_IS_STRING (def_symbol_in_progress))
538 SF_SET_STRING (def_symbol_in_progress);
540 *input_line_pointer = name_end;
542 demand_empty_rest_of_line ();
545 unsigned int dim_index;
548 obj_coff_endef (int ignore ATTRIBUTE_UNUSED)
550 symbolS *symbolP = NULL;
553 if (def_symbol_in_progress == NULL)
555 as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
556 demand_empty_rest_of_line ();
560 /* Set the section number according to storage class. */
561 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress))
566 SF_SET_TAG (def_symbol_in_progress);
570 SF_SET_DEBUG (def_symbol_in_progress);
571 S_SET_SEGMENT (def_symbol_in_progress, fetch_coff_debug_section ());
575 SF_SET_LOCAL (def_symbol_in_progress); /* Do not emit this symbol. */
578 SF_SET_PROCESS (def_symbol_in_progress); /* Will need processing before writing. */
584 S_SET_SEGMENT (def_symbol_in_progress, text_section);
586 name = S_GET_NAME (def_symbol_in_progress);
587 if (name[0] == '.' && name[2] == 'f' && name[3] == '\0')
593 if (! in_function ())
594 as_warn (_("`%s' symbol without preceding function"), name);
595 /* Will need relocating. */
596 SF_SET_PROCESS (def_symbol_in_progress);
602 /* The MS compilers output the actual endline, not the
603 function-relative one... we want to match without
604 changing the assembler input. */
605 SA_SET_SYM_LNNO (def_symbol_in_progress,
606 (SA_GET_SYM_LNNO (def_symbol_in_progress)
617 #endif /* C_AUTOARG */
624 /* According to the COFF documentation:
626 http://osr5doc.sco.com:1996/topics/COFF_SectNumFld.html
628 A special section number (-2) marks symbolic debugging symbols,
629 including structure/union/enumeration tag names, typedefs, and
630 the name of the file. A section number of -1 indicates that the
631 symbol has a value but is not relocatable. Examples of
632 absolute-valued symbols include automatic and register variables,
633 function arguments, and .eos symbols.
635 But from Ian Lance Taylor:
637 http://sources.redhat.com/ml/binutils/2000-08/msg00202.html
639 the actual tools all marked them as section -1. So the GNU COFF
640 assembler follows historical COFF assemblers.
642 However, it causes problems for djgpp
644 http://sources.redhat.com/ml/binutils/2000-08/msg00210.html
646 By defining STRICTCOFF, a COFF port can make the assembler to
647 follow the documented behavior. */
654 SF_SET_DEBUG (def_symbol_in_progress);
655 S_SET_SEGMENT (def_symbol_in_progress, absolute_section);
663 S_SET_SEGMENT (def_symbol_in_progress, absolute_section);
674 /* Valid but set somewhere else (s_comm, s_lcomm, colon). */
681 as_warn (_("unexpected storage class %d"),
682 S_GET_STORAGE_CLASS (def_symbol_in_progress));
686 /* Now that we have built a debug symbol, try to find if we should
687 merge with an existing symbol or not. If a symbol is C_EFCN or
688 absolute_section or untagged SEG_DEBUG it never merges. We also
689 don't merge labels, which are in a different namespace, nor
690 symbols which have not yet been defined since they are typically
691 unique, nor do we merge tags with non-tags. */
693 /* Two cases for functions. Either debug followed by definition or
694 definition followed by debug. For definition first, we will
695 merge the debug symbol into the definition. For debug first, the
696 lineno entry MUST point to the definition function or else it
697 will point off into space when obj_crawl_symbol_chain() merges
698 the debug symbol into the real symbol. Therefor, let's presume
699 the debug symbol is a real function reference. */
701 /* FIXME-SOON If for some reason the definition label/symbol is
702 never seen, this will probably leave an undefined symbol at link
705 if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN
706 || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL
707 || (streq (bfd_get_section_name (stdoutput,
708 S_GET_SEGMENT (def_symbol_in_progress)),
710 && !SF_GET_TAG (def_symbol_in_progress))
711 || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section
712 || ! symbol_constant_p (def_symbol_in_progress)
713 || (symbolP = symbol_find (S_GET_NAME (def_symbol_in_progress))) == NULL
714 || SF_GET_TAG (def_symbol_in_progress) != SF_GET_TAG (symbolP))
716 /* If it already is at the end of the symbol list, do nothing */
717 if (def_symbol_in_progress != symbol_lastP)
719 symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
720 symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
726 /* This symbol already exists, merge the newly created symbol
727 into the old one. This is not mandatory. The linker can
728 handle duplicate symbols correctly. But I guess that it save
729 a *lot* of space if the assembly file defines a lot of
732 /* The debug entry (def_symbol_in_progress) is merged into the
733 previous definition. */
735 c_symbol_merge (def_symbol_in_progress, symbolP);
736 symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
738 def_symbol_in_progress = symbolP;
740 if (SF_GET_FUNCTION (def_symbol_in_progress)
741 || SF_GET_TAG (def_symbol_in_progress)
742 || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_STAT)
744 /* For functions, and tags, and static symbols, the symbol
745 *must* be where the debug symbol appears. Move the
746 existing symbol to the current place. */
747 /* If it already is at the end of the symbol list, do nothing. */
748 if (def_symbol_in_progress != symbol_lastP)
750 symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
751 symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, &symbol_lastP);
756 if (SF_GET_TAG (def_symbol_in_progress))
760 oldtag = symbol_find (S_GET_NAME (def_symbol_in_progress));
761 if (oldtag == NULL || ! SF_GET_TAG (oldtag))
762 tag_insert (S_GET_NAME (def_symbol_in_progress),
763 def_symbol_in_progress);
766 if (SF_GET_FUNCTION (def_symbol_in_progress))
768 know (sizeof (def_symbol_in_progress) <= sizeof (long));
769 set_function (def_symbol_in_progress);
770 SF_SET_PROCESS (def_symbol_in_progress);
773 /* That is, if this is the first time we've seen the
775 symbol_table_insert (def_symbol_in_progress);
779 def_symbol_in_progress = NULL;
780 demand_empty_rest_of_line ();
784 obj_coff_dim (int ignore ATTRIBUTE_UNUSED)
788 if (def_symbol_in_progress == NULL)
790 as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
791 demand_empty_rest_of_line ();
795 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
797 for (dim_index = 0; dim_index < DIMNUM; dim_index++)
800 SA_SET_SYM_DIMEN (def_symbol_in_progress, dim_index,
801 get_absolute_expression ());
803 switch (*input_line_pointer)
806 input_line_pointer++;
810 as_warn (_("badly formed .dim directive ignored"));
819 demand_empty_rest_of_line ();
823 obj_coff_line (int ignore ATTRIBUTE_UNUSED)
827 if (def_symbol_in_progress == NULL)
829 /* Probably stabs-style line? */
834 this_base = get_absolute_expression ();
835 if (streq (".bf", S_GET_NAME (def_symbol_in_progress)))
836 coff_line_base = this_base;
838 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
839 SA_SET_SYM_LNNO (def_symbol_in_progress, this_base);
841 demand_empty_rest_of_line ();
844 if (streq (".bf", S_GET_NAME (def_symbol_in_progress)))
849 listing_source_line ((unsigned int) this_base);
855 obj_coff_size (int ignore ATTRIBUTE_UNUSED)
857 if (def_symbol_in_progress == NULL)
859 as_warn (_(".size pseudo-op used outside of .def/.endef ignored."));
860 demand_empty_rest_of_line ();
864 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
865 SA_SET_SYM_SIZE (def_symbol_in_progress, get_absolute_expression ());
866 demand_empty_rest_of_line ();
870 obj_coff_scl (int ignore ATTRIBUTE_UNUSED)
872 if (def_symbol_in_progress == NULL)
874 as_warn (_(".scl pseudo-op used outside of .def/.endef ignored."));
875 demand_empty_rest_of_line ();
879 S_SET_STORAGE_CLASS (def_symbol_in_progress, get_absolute_expression ());
880 demand_empty_rest_of_line ();
884 obj_coff_tag (int ignore ATTRIBUTE_UNUSED)
889 if (def_symbol_in_progress == NULL)
891 as_warn (_(".tag pseudo-op used outside of .def/.endef ignored."));
892 demand_empty_rest_of_line ();
896 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
897 symbol_name = input_line_pointer;
898 name_end = get_symbol_end ();
900 #ifdef tc_canonicalize_symbol_name
901 symbol_name = tc_canonicalize_symbol_name (symbol_name);
904 /* Assume that the symbol referred to by .tag is always defined.
905 This was a bad assumption. I've added find_or_make. xoxorich. */
906 SA_SET_SYM_TAGNDX (def_symbol_in_progress,
907 tag_find_or_make (symbol_name));
908 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L)
909 as_warn (_("tag not found for .tag %s"), symbol_name);
911 SF_SET_TAGGED (def_symbol_in_progress);
912 *input_line_pointer = name_end;
914 demand_empty_rest_of_line ();
918 obj_coff_type (int ignore ATTRIBUTE_UNUSED)
920 if (def_symbol_in_progress == NULL)
922 as_warn (_(".type pseudo-op used outside of .def/.endef ignored."));
923 demand_empty_rest_of_line ();
927 S_SET_DATA_TYPE (def_symbol_in_progress, get_absolute_expression ());
929 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress)) &&
930 S_GET_STORAGE_CLASS (def_symbol_in_progress) != C_TPDEF)
931 SF_SET_FUNCTION (def_symbol_in_progress);
933 demand_empty_rest_of_line ();
937 obj_coff_val (int ignore ATTRIBUTE_UNUSED)
939 if (def_symbol_in_progress == NULL)
941 as_warn (_(".val pseudo-op used outside of .def/.endef ignored."));
942 demand_empty_rest_of_line ();
946 if (is_name_beginner (*input_line_pointer))
948 char *symbol_name = input_line_pointer;
949 char name_end = get_symbol_end ();
951 #ifdef tc_canonicalize_symbol_name
952 symbol_name = tc_canonicalize_symbol_name (symbol_name);
954 if (streq (symbol_name, "."))
956 /* If the .val is != from the .def (e.g. statics). */
957 symbol_set_frag (def_symbol_in_progress, frag_now);
958 S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ());
960 else if (! streq (S_GET_NAME (def_symbol_in_progress), symbol_name))
965 exp.X_add_symbol = symbol_find_or_make (symbol_name);
966 exp.X_op_symbol = NULL;
967 exp.X_add_number = 0;
968 symbol_set_value_expression (def_symbol_in_progress, &exp);
970 /* If the segment is undefined when the forward reference is
971 resolved, then copy the segment id from the forward
973 SF_SET_GET_SEGMENT (def_symbol_in_progress);
975 /* FIXME: gcc can generate address expressions here in
976 unusual cases (search for "obscure" in sdbout.c). We
977 just ignore the offset here, thus generating incorrect
978 debugging information. We ignore the rest of the line
981 /* Otherwise, it is the name of a non debug symbol and its value
982 will be calculated later. */
983 *input_line_pointer = name_end;
987 S_SET_VALUE (def_symbol_in_progress, get_absolute_expression ());
990 demand_empty_rest_of_line ();
995 /* Return nonzero if name begins with weak alternate symbol prefix. */
998 weak_is_altname (const char * name)
1000 return strneq (name, weak_altprefix, sizeof (weak_altprefix) - 1);
1003 /* Return the name of the alternate symbol
1004 name corresponding to a weak symbol's name. */
1007 weak_name2altname (const char * name)
1011 alt_name = xmalloc (sizeof (weak_altprefix) + strlen (name));
1012 strcpy (alt_name, weak_altprefix);
1013 return strcat (alt_name, name);
1016 /* Return the name of the weak symbol corresponding to an
1020 weak_altname2name (const char * name)
1025 assert (weak_is_altname (name));
1027 weak_name = xstrdup (name + 6);
1028 if ((dot = strchr (weak_name, '.')))
1033 /* Make a weak symbol name unique by
1034 appending the name of an external symbol. */
1037 weak_uniquify (const char * name)
1040 const char * unique = "";
1043 if (an_external_name != NULL)
1044 unique = an_external_name;
1046 assert (weak_is_altname (name));
1048 if (strchr (name + sizeof (weak_altprefix), '.'))
1051 ret = xmalloc (strlen (name) + strlen (unique) + 2);
1054 strcat (ret, unique);
1059 pecoff_obj_set_weak_hook (symbolS *symbolP)
1061 symbolS *alternateP;
1063 /* See _Microsoft Portable Executable and Common Object
1064 File Format Specification_, section 5.5.3.
1065 Create a symbol representing the alternate value.
1066 coff_frob_symbol will set the value of this symbol from
1067 the value of the weak symbol itself. */
1068 S_SET_STORAGE_CLASS (symbolP, C_NT_WEAK);
1069 S_SET_NUMBER_AUXILIARY (symbolP, 1);
1070 SA_SET_SYM_FSIZE (symbolP, IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY);
1072 alternateP = symbol_find_or_make (weak_name2altname (S_GET_NAME (symbolP)));
1073 S_SET_EXTERNAL (alternateP);
1074 S_SET_STORAGE_CLASS (alternateP, C_NT_WEAK);
1076 SA_SET_SYM_TAGNDX (symbolP, alternateP);
1080 pecoff_obj_clear_weak_hook (symbolS *symbolP)
1082 symbolS *alternateP;
1084 S_SET_STORAGE_CLASS (symbolP, 0);
1085 SA_SET_SYM_FSIZE (symbolP, 0);
1087 alternateP = symbol_find (weak_name2altname (S_GET_NAME (symbolP)));
1088 S_CLEAR_EXTERNAL (alternateP);
1093 /* Handle .weak. This is a GNU extension in formats other than PE. */
1096 obj_coff_weak (int ignore ATTRIBUTE_UNUSED)
1104 name = input_line_pointer;
1105 c = get_symbol_end ();
1108 as_warn (_("badly formed .weak directive ignored"));
1109 ignore_rest_of_line ();
1113 symbolP = symbol_find_or_make (name);
1114 *input_line_pointer = c;
1116 S_SET_WEAK (symbolP);
1120 input_line_pointer++;
1122 if (*input_line_pointer == '\n')
1129 demand_empty_rest_of_line ();
1133 coff_obj_read_begin_hook (void)
1135 /* These had better be the same. Usually 18 bytes. */
1136 know (sizeof (SYMENT) == sizeof (AUXENT));
1137 know (SYMESZ == AUXESZ);
1141 symbolS *coff_last_function;
1143 static symbolS *coff_last_bf;
1147 coff_frob_symbol (symbolS *symp, int *punt)
1149 static symbolS *last_tagP;
1150 static stack *block_stack;
1151 static symbolS *set_end;
1152 symbolS *next_set_end = NULL;
1154 if (symp == &abs_symbol)
1160 if (current_lineno_sym)
1161 coff_add_linesym (NULL);
1164 block_stack = stack_init (512, sizeof (symbolS*));
1167 if (S_GET_STORAGE_CLASS (symp) == C_NT_WEAK
1168 && ! S_IS_WEAK (symp)
1169 && weak_is_altname (S_GET_NAME (symp)))
1171 /* This is a weak alternate symbol. All processing of
1172 PECOFFweak symbols is done here, through the alternate. */
1173 symbolS *weakp = symbol_find_noref (weak_altname2name
1174 (S_GET_NAME (symp)), 1);
1177 assert (S_GET_NUMBER_AUXILIARY (weakp) == 1);
1179 if (! S_IS_WEAK (weakp))
1181 /* The symbol was turned from weak to strong. Discard altname. */
1185 else if (symbol_equated_p (weakp))
1187 /* The weak symbol has an alternate specified; symp is unneeded. */
1188 S_SET_STORAGE_CLASS (weakp, C_NT_WEAK);
1189 SA_SET_SYM_TAGNDX (weakp,
1190 symbol_get_value_expression (weakp)->X_add_symbol);
1192 S_CLEAR_EXTERNAL (symp);
1198 /* The weak symbol has been assigned an alternate value.
1199 Copy this value to symp, and set symp as weakp's alternate. */
1200 if (S_GET_STORAGE_CLASS (weakp) != C_NT_WEAK)
1202 S_SET_STORAGE_CLASS (symp, S_GET_STORAGE_CLASS (weakp));
1203 S_SET_STORAGE_CLASS (weakp, C_NT_WEAK);
1206 if (S_IS_DEFINED (weakp))
1208 /* This is a defined weak symbol. Copy value information
1209 from the weak symbol itself to the alternate symbol. */
1210 symbol_set_value_expression (symp,
1211 symbol_get_value_expression (weakp));
1212 symbol_set_frag (symp, symbol_get_frag (weakp));
1213 S_SET_SEGMENT (symp, S_GET_SEGMENT (weakp));
1217 /* This is an undefined weak symbol.
1218 Define the alternate symbol to zero. */
1219 S_SET_VALUE (symp, 0);
1220 S_SET_SEGMENT (symp, absolute_section);
1223 S_SET_NAME (symp, weak_uniquify (S_GET_NAME (symp)));
1224 S_SET_STORAGE_CLASS (symp, C_EXT);
1226 S_SET_VALUE (weakp, 0);
1227 S_SET_SEGMENT (weakp, undefined_section);
1231 if (S_IS_WEAK (symp))
1232 S_SET_STORAGE_CLASS (symp, C_WEAKEXT);
1235 if (!S_IS_DEFINED (symp)
1236 && !S_IS_WEAK (symp)
1237 && S_GET_STORAGE_CLASS (symp) != C_STAT)
1238 S_SET_STORAGE_CLASS (symp, C_EXT);
1240 if (!SF_GET_DEBUG (symp))
1244 if (!SF_GET_LOCAL (symp)
1245 && !SF_GET_STATICS (symp)
1246 && S_GET_STORAGE_CLASS (symp) != C_LABEL
1247 && symbol_constant_p (symp)
1248 && (real = symbol_find_noref (S_GET_NAME (symp), 1))
1249 && S_GET_STORAGE_CLASS (real) == C_NULL
1252 c_symbol_merge (symp, real);
1257 if (!S_IS_DEFINED (symp) && !SF_GET_LOCAL (symp))
1259 assert (S_GET_VALUE (symp) == 0);
1260 if (S_IS_WEAKREFD (symp))
1263 S_SET_EXTERNAL (symp);
1265 else if (S_GET_STORAGE_CLASS (symp) == C_NULL)
1267 if (S_GET_SEGMENT (symp) == text_section
1268 && symp != seg_info (text_section)->sym)
1269 S_SET_STORAGE_CLASS (symp, C_LABEL);
1271 S_SET_STORAGE_CLASS (symp, C_STAT);
1274 if (SF_GET_PROCESS (symp))
1276 if (S_GET_STORAGE_CLASS (symp) == C_BLOCK)
1278 if (streq (S_GET_NAME (symp), ".bb"))
1279 stack_push (block_stack, (char *) &symp);
1284 begin = *(symbolS **) stack_pop (block_stack);
1286 as_warn (_("mismatched .eb"));
1288 next_set_end = begin;
1292 if (coff_last_function == 0 && SF_GET_FUNCTION (symp))
1294 union internal_auxent *auxp;
1296 coff_last_function = symp;
1297 if (S_GET_NUMBER_AUXILIARY (symp) < 1)
1298 S_SET_NUMBER_AUXILIARY (symp, 1);
1299 auxp = SYM_AUXENT (symp);
1300 memset (auxp->x_sym.x_fcnary.x_ary.x_dimen, 0,
1301 sizeof (auxp->x_sym.x_fcnary.x_ary.x_dimen));
1304 if (S_GET_STORAGE_CLASS (symp) == C_EFCN)
1306 if (coff_last_function == 0)
1307 as_fatal (_("C_EFCN symbol for %s out of scope"),
1309 SA_SET_SYM_FSIZE (coff_last_function,
1310 (long) (S_GET_VALUE (symp)
1311 - S_GET_VALUE (coff_last_function)));
1312 next_set_end = coff_last_function;
1313 coff_last_function = 0;
1317 if (S_IS_EXTERNAL (symp))
1318 S_SET_STORAGE_CLASS (symp, C_EXT);
1319 else if (SF_GET_LOCAL (symp))
1322 if (SF_GET_FUNCTION (symp))
1323 symbol_get_bfdsym (symp)->flags |= BSF_FUNCTION;
1326 /* Double check weak symbols. */
1327 if (S_IS_WEAK (symp) && S_IS_COMMON (symp))
1328 as_bad (_("Symbol `%s' can not be both weak and common"),
1331 if (SF_GET_TAG (symp))
1333 else if (S_GET_STORAGE_CLASS (symp) == C_EOS)
1334 next_set_end = last_tagP;
1337 /* This is pretty horrible, but we have to set *punt correctly in
1338 order to call SA_SET_SYM_ENDNDX correctly. */
1339 if (! symbol_used_in_reloc_p (symp)
1340 && ((symbol_get_bfdsym (symp)->flags & BSF_SECTION_SYM) != 0
1341 || (! (S_IS_EXTERNAL (symp) || S_IS_WEAK (symp))
1342 && ! symbol_get_tc (symp)->output
1343 && S_GET_STORAGE_CLASS (symp) != C_FILE)))
1347 if (set_end != (symbolS *) NULL
1349 && ((symbol_get_bfdsym (symp)->flags & BSF_NOT_AT_END) != 0
1350 || (S_IS_DEFINED (symp)
1351 && ! S_IS_COMMON (symp)
1352 && (! S_IS_EXTERNAL (symp) || SF_GET_FUNCTION (symp)))))
1354 SA_SET_SYM_ENDNDX (set_end, symp);
1358 if (next_set_end != NULL)
1360 if (set_end != NULL)
1361 as_warn ("Warning: internal error: forgetting to set endndx of %s",
1362 S_GET_NAME (set_end));
1363 set_end = next_set_end;
1368 && S_GET_STORAGE_CLASS (symp) == C_FCN
1369 && streq (S_GET_NAME (symp), ".bf"))
1371 if (coff_last_bf != NULL)
1372 SA_SET_SYM_ENDNDX (coff_last_bf, symp);
1373 coff_last_bf = symp;
1376 if (coffsymbol (symbol_get_bfdsym (symp))->lineno)
1379 struct line_no *lptr;
1382 lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno;
1383 for (i = 0; lptr; lptr = lptr->next)
1385 lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno;
1387 /* We need i entries for line numbers, plus 1 for the first
1388 entry which BFD will override, plus 1 for the last zero
1389 entry (a marker for BFD). */
1390 l = xmalloc ((i + 2) * sizeof (* l));
1391 coffsymbol (symbol_get_bfdsym (symp))->lineno = l;
1392 l[i + 1].line_number = 0;
1393 l[i + 1].u.sym = NULL;
1397 lptr->l.u.offset += lptr->frag->fr_address / OCTETS_PER_BYTE;
1405 coff_adjust_section_syms (bfd *abfd ATTRIBUTE_UNUSED,
1407 void * x ATTRIBUTE_UNUSED)
1410 segment_info_type *seginfo = seg_info (sec);
1411 int nlnno, nrelocs = 0;
1413 /* RS/6000 gas creates a .debug section manually in ppc_frob_file in
1414 tc-ppc.c. Do not get confused by it. */
1415 if (seginfo == NULL)
1418 if (streq (sec->name, ".text"))
1419 nlnno = coff_n_line_nos;
1423 /* @@ Hope that none of the fixups expand to more than one reloc
1425 fixS *fixp = seginfo->fix_root;
1428 if (! fixp->fx_done)
1430 fixp = fixp->fx_next;
1433 if (bfd_get_section_size (sec) == 0
1436 && sec != text_section
1437 && sec != data_section
1438 && sec != bss_section)
1441 secsym = section_symbol (sec);
1442 /* This is an estimate; we'll plug in the real value using
1443 SET_SECTION_RELOCS later */
1444 SA_SET_SCN_NRELOC (secsym, nrelocs);
1445 SA_SET_SCN_NLINNO (secsym, nlnno);
1449 coff_frob_file_after_relocs (void)
1451 bfd_map_over_sections (stdoutput, coff_adjust_section_syms, NULL);
1454 /* Implement the .section pseudo op:
1455 .section name {, "flags"}
1457 | +--- optional flags: 'b' for bss
1459 +-- section name 'l' for lib
1463 'd' (apparently m88k for data)
1465 'r' for read-only data
1466 's' for shared data (PE)
1467 But if the argument is not a quoted string, treat it as a
1470 Note the 'a' flag is silently ignored. This allows the same
1471 .section directive to be parsed in both ELF and COFF formats. */
1474 obj_coff_section (int ignore ATTRIBUTE_UNUSED)
1476 /* Strip out the section name. */
1481 flagword flags, oldflags;
1492 section_name = input_line_pointer;
1493 c = get_symbol_end ();
1495 name = xmalloc (input_line_pointer - section_name + 1);
1496 strcpy (name, section_name);
1498 *input_line_pointer = c;
1503 flags = SEC_NO_FLAGS;
1505 if (*input_line_pointer == ',')
1507 ++input_line_pointer;
1509 if (*input_line_pointer != '"')
1510 exp = get_absolute_expression ();
1513 ++input_line_pointer;
1514 while (*input_line_pointer != '"'
1515 && ! is_end_of_line[(unsigned char) *input_line_pointer])
1517 switch (*input_line_pointer)
1519 case 'b': flags |= SEC_ALLOC; flags &=~ SEC_LOAD; break;
1520 case 'n': flags &=~ SEC_LOAD; flags |= SEC_NEVER_LOAD; break;
1522 case 's': flags |= SEC_COFF_SHARED; /* Fall through. */
1523 case 'd': flags |= SEC_DATA | SEC_LOAD; /* Fall through. */
1524 case 'w': flags &=~ SEC_READONLY; break;
1526 case 'a': break; /* For compatibility with ELF. */
1527 case 'x': flags |= SEC_CODE | SEC_LOAD; break;
1528 case 'r': flags |= SEC_DATA | SEC_LOAD | SEC_READONLY; break;
1530 case 'i': /* STYP_INFO */
1531 case 'l': /* STYP_LIB */
1532 case 'o': /* STYP_OVER */
1533 as_warn (_("unsupported section attribute '%c'"),
1534 *input_line_pointer);
1538 as_warn (_("unknown section attribute '%c'"),
1539 *input_line_pointer);
1542 ++input_line_pointer;
1544 if (*input_line_pointer == '"')
1545 ++input_line_pointer;
1549 sec = subseg_new (name, (subsegT) exp);
1551 oldflags = bfd_get_section_flags (stdoutput, sec);
1552 if (oldflags == SEC_NO_FLAGS)
1554 /* Set section flags for a new section just created by subseg_new.
1555 Provide a default if no flags were parsed. */
1556 if (flags == SEC_NO_FLAGS)
1557 flags = TC_COFF_SECTION_DEFAULT_ATTRIBUTES;
1559 #ifdef COFF_LONG_SECTION_NAMES
1560 /* Add SEC_LINK_ONCE and SEC_LINK_DUPLICATES_DISCARD to .gnu.linkonce
1561 sections so adjust_reloc_syms in write.c will correctly handle
1562 relocs which refer to non-local symbols in these sections. */
1563 if (strneq (name, ".gnu.linkonce", sizeof (".gnu.linkonce") - 1))
1564 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1567 if (! bfd_set_section_flags (stdoutput, sec, flags))
1568 as_warn (_("error setting flags for \"%s\": %s"),
1569 bfd_section_name (stdoutput, sec),
1570 bfd_errmsg (bfd_get_error ()));
1572 else if (flags != SEC_NO_FLAGS)
1574 /* This section's attributes have already been set. Warn if the
1575 attributes don't match. */
1576 flagword matchflags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
1577 | SEC_DATA | SEC_COFF_SHARED | SEC_NEVER_LOAD);
1578 if ((flags ^ oldflags) & matchflags)
1579 as_warn (_("Ignoring changed section attributes for %s"), name);
1582 demand_empty_rest_of_line ();
1586 coff_adjust_symtab (void)
1588 if (symbol_rootP == NULL
1589 || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE)
1590 c_dot_file_symbol ("fake", 0);
1594 coff_frob_section (segT sec)
1599 bfd_vma size, n_entries, mask;
1600 bfd_vma align_power = (bfd_vma)sec->alignment_power + OCTETS_PER_BYTE_POWER;
1602 /* The COFF back end in BFD requires that all section sizes be
1603 rounded up to multiples of the corresponding section alignments,
1604 supposedly because standard COFF has no other way of encoding alignment
1605 for sections. If your COFF flavor has a different way of encoding
1606 section alignment, then skip this step, as TICOFF does. */
1607 size = bfd_get_section_size (sec);
1608 mask = ((bfd_vma) 1 << align_power) - 1;
1609 #if !defined(TICOFF)
1615 new_size = (size + mask) & ~mask;
1616 bfd_set_section_size (stdoutput, sec, new_size);
1618 /* If the size had to be rounded up, add some padding in
1619 the last non-empty frag. */
1620 fragp = seg_info (sec)->frchainP->frch_root;
1621 last = seg_info (sec)->frchainP->frch_last;
1622 while (fragp->fr_next != last)
1623 fragp = fragp->fr_next;
1624 last->fr_address = size;
1625 fragp->fr_offset += new_size - size;
1629 /* If the section size is non-zero, the section symbol needs an aux
1630 entry associated with it, indicating the size. We don't know
1631 all the values yet; coff_frob_symbol will fill them in later. */
1634 || sec == text_section
1635 || sec == data_section
1636 || sec == bss_section)
1639 symbolS *secsym = section_symbol (sec);
1641 S_SET_STORAGE_CLASS (secsym, C_STAT);
1642 S_SET_NUMBER_AUXILIARY (secsym, 1);
1643 SF_SET_STATICS (secsym);
1644 SA_SET_SCN_SCNLEN (secsym, size);
1647 /* FIXME: These should be in a "stabs.h" file, or maybe as.h. */
1648 #ifndef STAB_SECTION_NAME
1649 #define STAB_SECTION_NAME ".stab"
1651 #ifndef STAB_STRING_SECTION_NAME
1652 #define STAB_STRING_SECTION_NAME ".stabstr"
1654 if (! streq (STAB_STRING_SECTION_NAME, sec->name))
1658 sec = subseg_get (STAB_SECTION_NAME, 0);
1659 /* size is already rounded up, since other section will be listed first */
1660 size = bfd_get_section_size (strsec);
1662 n_entries = bfd_get_section_size (sec) / 12 - 1;
1664 /* Find first non-empty frag. It should be large enough. */
1665 fragp = seg_info (sec)->frchainP->frch_root;
1666 while (fragp && fragp->fr_fix == 0)
1667 fragp = fragp->fr_next;
1668 assert (fragp != 0 && fragp->fr_fix >= 12);
1670 /* Store the values. */
1671 p = fragp->fr_literal;
1672 bfd_h_put_16 (stdoutput, n_entries, (bfd_byte *) p + 6);
1673 bfd_h_put_32 (stdoutput, size, (bfd_byte *) p + 8);
1677 obj_coff_init_stab_section (segT seg)
1682 unsigned int stroff;
1684 /* Make space for this first symbol. */
1688 as_where (&file, (unsigned int *) NULL);
1689 stabstr_name = xmalloc (strlen (seg->name) + 4);
1690 strcpy (stabstr_name, seg->name);
1691 strcat (stabstr_name, "str");
1692 stroff = get_stab_string_offset (file, stabstr_name);
1694 md_number_to_chars (p, stroff, 4);
1699 s_get_name (symbolS *s)
1701 return ((s == NULL) ? "(NULL)" : S_GET_NAME (s));
1709 for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
1710 printf (_("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n"),
1711 (unsigned long) symbolP,
1712 S_GET_NAME (symbolP),
1713 (long) S_GET_DATA_TYPE (symbolP),
1714 S_GET_STORAGE_CLASS (symbolP),
1715 (int) S_GET_SEGMENT (symbolP));
1720 const pseudo_typeS coff_pseudo_table[] =
1722 {"ABORT", s_abort, 0},
1723 {"appline", obj_coff_ln, 1},
1724 /* We accept the .bss directive for backward compatibility with
1725 earlier versions of gas. */
1726 {"bss", obj_coff_bss, 0},
1727 {"def", obj_coff_def, 0},
1728 {"dim", obj_coff_dim, 0},
1729 {"endef", obj_coff_endef, 0},
1730 {"ident", obj_coff_ident, 0},
1731 {"line", obj_coff_line, 0},
1732 {"ln", obj_coff_ln, 0},
1733 {"scl", obj_coff_scl, 0},
1734 {"sect", obj_coff_section, 0},
1735 {"sect.s", obj_coff_section, 0},
1736 {"section", obj_coff_section, 0},
1737 {"section.s", obj_coff_section, 0},
1738 /* FIXME: We ignore the MRI short attribute. */
1739 {"size", obj_coff_size, 0},
1740 {"tag", obj_coff_tag, 0},
1741 {"type", obj_coff_type, 0},
1742 {"val", obj_coff_val, 0},
1743 {"version", s_ignore, 0},
1744 {"loc", obj_coff_loc, 0},
1745 {"optim", s_ignore, 0}, /* For sun386i cc (?) */
1746 {"weak", obj_coff_weak, 0},
1747 #if defined TC_TIC4X
1748 /* The tic4x uses sdef instead of def. */
1749 {"sdef", obj_coff_def, 0},
1755 /* Support for a COFF emulation. */
1758 coff_pop_insert (void)
1760 pop_insert (coff_pseudo_table);
1764 coff_separate_stab_sections (void)
1769 const struct format_ops coff_format_ops =
1771 bfd_target_coff_flavour,
1772 0, /* dfl_leading_underscore */
1773 1, /* emit_section_symbols */
1778 0, /* frob_file_before_adjust */
1779 0, /* frob_file_before_fix */
1780 coff_frob_file_after_relocs,
1783 0, /* s_get_align */
1784 0, /* s_set_align */
1785 0, /* s_get_other */
1786 0, /* s_set_other */
1791 0, /* copy_symbol_attributes */
1792 0, /* generate_asm_lineno */
1793 0, /* process_stab */
1794 coff_separate_stab_sections,
1795 obj_coff_init_stab_section,
1796 0, /* sec_sym_ok_for_reloc */
1798 0, /* ecoff_set_ext */
1799 coff_obj_read_begin_hook,
1800 coff_obj_symbol_new_hook