1 /* coff object file format
2 Copyright (C) 1989-2023 Free Software Foundation, Inc.
4 This file is part of GAS.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 #define OBJ_HEADER "obj-coff.h"
24 #include "safe-ctype.h"
32 #include "coff/xcoff.h"
35 #define streq(a,b) (strcmp ((a), (b)) == 0)
37 /* I think this is probably always correct. */
38 #ifndef KEEP_RELOC_INFO
39 #define KEEP_RELOC_INFO
42 /* obj_coff_section will use this macro to set a new section's
43 attributes when a directive has no valid flags or the "w" flag is
44 used. This default should be appropriate for most. */
45 #ifndef TC_COFF_SECTION_DEFAULT_ATTRIBUTES
46 #define TC_COFF_SECTION_DEFAULT_ATTRIBUTES (SEC_LOAD | SEC_DATA)
49 /* This is used to hold the symbol built by a sequence of pseudo-ops
50 from .def and .endef. */
51 static symbolS
*def_symbol_in_progress
;
53 /* PE weak alternate symbols begin with this string. */
54 static const char weak_altprefix
[] = ".weak.";
57 #include "obj-coff-seh.c"
61 unsigned long chunk_size
;
62 unsigned long element_size
;
65 unsigned long pointer
;
73 stack_init (unsigned long chunk_size
,
74 unsigned long element_size
)
79 st
->data
= XNEWVEC (char, chunk_size
);
86 st
->size
= chunk_size
;
87 st
->chunk_size
= chunk_size
;
88 st
->element_size
= element_size
;
93 stack_push (stack
*st
, char *element
)
95 if (st
->pointer
+ st
->element_size
>= st
->size
)
97 st
->size
+= st
->chunk_size
;
98 st
->data
= XRESIZEVEC (char, st
->data
, st
->size
);
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 htab_t tag_hash
;
124 tag_hash
= str_htab_create ();
128 tag_insert (const char *name
, symbolS
*symbolP
)
130 str_hash_insert (tag_hash
, name
, symbolP
, 1);
134 tag_find (char *name
)
136 return (symbolS
*) str_hash_find (tag_hash
, name
);
140 tag_find_or_make (char *name
)
144 if ((symbolP
= tag_find (name
)) == NULL
)
146 symbolP
= symbol_new (name
, undefined_section
, &zero_address_frag
, 0);
148 tag_insert (S_GET_NAME (symbolP
), symbolP
);
149 symbol_table_insert (symbolP
);
155 /* We accept the .bss directive to set the section for backward
156 compatibility with earlier versions of gas. */
159 obj_coff_bss (int ignore ATTRIBUTE_UNUSED
)
161 if (*input_line_pointer
== '\n')
162 subseg_new (".bss", get_absolute_expression ());
168 /* Called from read.c:s_comm after we've parsed .comm symbol, size.
169 Parse a possible alignment value. */
172 obj_coff_common_parse (int ignore ATTRIBUTE_UNUSED
, symbolS
*symbolP
, addressT size
)
176 if (*input_line_pointer
== ',')
178 align
= parse_align (0);
179 if (align
== (addressT
) -1)
183 S_SET_VALUE (symbolP
, size
);
184 S_SET_EXTERNAL (symbolP
);
185 S_SET_SEGMENT (symbolP
, bfd_com_section_ptr
);
187 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
189 /* There is no S_SET_ALIGN (symbolP, align) in COFF/PE.
190 Instead we must add a note to the .drectve section. */
193 segT current_seg
= now_seg
;
194 subsegT current_subseg
= now_subseg
;
197 size_t pfxlen
, numlen
;
201 sec
= subseg_new (".drectve", 0);
202 oldflags
= bfd_section_flags (sec
);
203 if (oldflags
== SEC_NO_FLAGS
)
205 if (!bfd_set_section_flags (sec
, TC_COFF_SECTION_DEFAULT_ATTRIBUTES
))
206 as_warn (_("error setting flags for \"%s\": %s"),
207 bfd_section_name (sec
),
208 bfd_errmsg (bfd_get_error ()));
211 /* Emit a string. Note no NUL-termination. */
212 pfxlen
= strlen (" -aligncomm:") + 2 + strlen (S_GET_NAME (symbolP
)) + 1;
213 numlen
= snprintf (numbuff
, sizeof (numbuff
), "%d", (int) align
);
214 frag
= frag_more (pfxlen
+ numlen
);
215 (void) sprintf (frag
, " -aligncomm:\"%s\",", S_GET_NAME (symbolP
));
216 memcpy (frag
+ pfxlen
, numbuff
, numlen
);
217 /* Restore original subseg. */
218 subseg_set (current_seg
, current_subseg
);
225 obj_coff_comm (int ignore ATTRIBUTE_UNUSED
)
227 s_comm_internal (ignore
, obj_coff_common_parse
);
233 fetch_coff_debug_section (void)
235 static segT debug_section
;
241 s
= bfd_make_debug_symbol (stdoutput
);
243 debug_section
= s
->section
;
245 return debug_section
;
249 SA_SET_SYM_ENDNDX (symbolS
*sym
, symbolS
*val
)
251 combined_entry_type
*entry
, *p
;
253 entry
= &coffsymbol (symbol_get_bfdsym (sym
))->native
[1];
254 p
= coffsymbol (symbol_get_bfdsym (val
))->native
;
255 entry
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
= p
;
260 SA_SET_SYM_TAGNDX (symbolS
*sym
, symbolS
*val
)
262 combined_entry_type
*entry
, *p
;
264 entry
= &coffsymbol (symbol_get_bfdsym (sym
))->native
[1];
265 p
= coffsymbol (symbol_get_bfdsym (val
))->native
;
266 entry
->u
.auxent
.x_sym
.x_tagndx
.p
= p
;
271 S_GET_DATA_TYPE (symbolS
*sym
)
273 return coffsymbol (symbol_get_bfdsym (sym
))->native
->u
.syment
.n_type
;
277 S_SET_DATA_TYPE (symbolS
*sym
, int val
)
279 coffsymbol (symbol_get_bfdsym (sym
))->native
->u
.syment
.n_type
= val
;
284 S_GET_STORAGE_CLASS (symbolS
*sym
)
286 return coffsymbol (symbol_get_bfdsym (sym
))->native
->u
.syment
.n_sclass
;
290 S_SET_STORAGE_CLASS (symbolS
*sym
, int val
)
292 coffsymbol (symbol_get_bfdsym (sym
))->native
->u
.syment
.n_sclass
= val
;
296 /* Merge a debug symbol containing debug information into a normal symbol. */
299 c_symbol_merge (symbolS
*debug
, symbolS
*normal
)
301 S_SET_DATA_TYPE (normal
, S_GET_DATA_TYPE (debug
));
302 S_SET_STORAGE_CLASS (normal
, S_GET_STORAGE_CLASS (debug
));
304 if (S_GET_NUMBER_AUXILIARY (debug
) > S_GET_NUMBER_AUXILIARY (normal
))
305 /* Take the most we have. */
306 S_SET_NUMBER_AUXILIARY (normal
, S_GET_NUMBER_AUXILIARY (debug
));
308 if (S_GET_NUMBER_AUXILIARY (debug
) > 0)
309 /* Move all the auxiliary information. */
310 memcpy (SYM_AUXINFO (normal
), SYM_AUXINFO (debug
),
311 (S_GET_NUMBER_AUXILIARY (debug
)
312 * sizeof (*SYM_AUXINFO (debug
))));
314 /* Move the debug flags. */
315 SF_SET_DEBUG_FIELD (normal
, SF_GET_DEBUG_FIELD (debug
));
319 c_dot_file_symbol (const char *filename
)
323 /* BFD converts filename to a .file symbol with an aux entry. It
324 also handles chaining. */
325 symbolP
= symbol_new (filename
, bfd_abs_section_ptr
, &zero_address_frag
, 0);
327 S_SET_STORAGE_CLASS (symbolP
, C_FILE
);
328 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
330 symbol_get_bfdsym (symbolP
)->flags
= BSF_DEBUGGING
;
337 listing_source_file (filename
);
341 /* Make sure that the symbol is first on the symbol chain. */
342 if (symbol_rootP
!= symbolP
)
344 symbol_remove (symbolP
, &symbol_rootP
, &symbol_lastP
);
345 symbol_insert (symbolP
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
349 /* Line number handling. */
353 struct line_no
*next
;
360 /* Symbol of last function, which we should hang line#s off of. */
361 static symbolS
*line_fsym
;
363 #define in_function() (line_fsym != 0)
364 #define clear_function() (line_fsym = 0)
365 #define set_function(F) (line_fsym = (F), coff_add_linesym (F))
369 coff_obj_symbol_new_hook (symbolS
*symbolP
)
371 long sz
= (OBJ_COFF_MAX_AUXENTRIES
+ 1) * sizeof (combined_entry_type
);
372 char * s
= XNEWVEC (char, sz
);
375 coffsymbol (symbol_get_bfdsym (symbolP
))->native
= (combined_entry_type
*) s
;
376 coffsymbol (symbol_get_bfdsym (symbolP
))->native
->is_sym
= true;
378 S_SET_DATA_TYPE (symbolP
, T_NULL
);
379 S_SET_STORAGE_CLASS (symbolP
, 0);
380 S_SET_NUMBER_AUXILIARY (symbolP
, 0);
382 if (S_IS_STRING (symbolP
))
383 SF_SET_STRING (symbolP
);
385 if (S_IS_LOCAL (symbolP
))
386 SF_SET_LOCAL (symbolP
);
390 coff_obj_symbol_clone_hook (symbolS
*newsymP
, symbolS
*orgsymP
)
392 long elts
= OBJ_COFF_MAX_AUXENTRIES
+ 1;
393 combined_entry_type
* s
= XNEWVEC (combined_entry_type
, elts
);
395 memcpy (s
, coffsymbol (symbol_get_bfdsym (orgsymP
))->native
,
396 elts
* sizeof (combined_entry_type
));
397 coffsymbol (symbol_get_bfdsym (newsymP
))->native
= s
;
399 SF_SET (newsymP
, SF_GET (orgsymP
));
403 /* Handle .ln directives. */
405 static symbolS
*current_lineno_sym
;
406 static struct line_no
*line_nos
;
407 /* FIXME: Blindly assume all .ln directives will be in the .text section. */
411 add_lineno (fragS
* frag
, addressT offset
, int num
)
413 struct line_no
* new_line
= XNEW (struct line_no
);
415 if (!current_lineno_sym
)
419 /* The native aix assembler accepts negative line number. */
423 /* Zero is used as an end marker in the file. */
424 as_warn (_("Line numbers must be positive integers\n"));
427 #endif /* OBJ_XCOFF */
428 new_line
->next
= line_nos
;
429 new_line
->frag
= frag
;
430 new_line
->l
.line_number
= num
;
431 new_line
->l
.u
.offset
= offset
;
437 coff_add_linesym (symbolS
*sym
)
441 coffsymbol (symbol_get_bfdsym (current_lineno_sym
))->lineno
=
446 current_lineno_sym
= sym
;
450 obj_coff_ln (int ignore ATTRIBUTE_UNUSED
)
454 if (def_symbol_in_progress
!= NULL
)
456 as_warn (_(".ln pseudo-op inside .def/.endef: ignored."));
457 demand_empty_rest_of_line ();
461 l
= get_absolute_expression ();
463 /* If there is no lineno symbol, treat a .ln directive
464 as if it were a (no longer existing) .appline one. */
465 if (current_lineno_sym
== NULL
)
466 new_logical_line ((char *) NULL
, l
- 1);
468 add_lineno (frag_now
, frag_now_fix (), l
);
476 l
+= coff_line_base
- 1;
477 listing_source_line (l
);
482 demand_empty_rest_of_line ();
485 /* .loc is essentially the same as .ln; parse it for assembler
489 obj_coff_loc (int ignore ATTRIBUTE_UNUSED
)
493 /* FIXME: Why do we need this check? We need it for ECOFF, but why
494 do we need it for COFF? */
495 if (now_seg
!= text_section
)
497 as_warn (_(".loc outside of .text"));
498 demand_empty_rest_of_line ();
502 if (def_symbol_in_progress
!= NULL
)
504 as_warn (_(".loc pseudo-op inside .def/.endef: ignored."));
505 demand_empty_rest_of_line ();
509 /* Skip the file number. */
511 get_absolute_expression ();
514 lineno
= get_absolute_expression ();
522 lineno
+= coff_line_base
- 1;
523 listing_source_line (lineno
);
528 demand_empty_rest_of_line ();
530 add_lineno (frag_now
, frag_now_fix (), lineno
);
533 /* Handle the .ident pseudo-op. */
536 obj_coff_ident (int ignore ATTRIBUTE_UNUSED
)
538 segT current_seg
= now_seg
;
539 subsegT current_subseg
= now_subseg
;
545 /* We could put it in .comment, but that creates an extra section
546 that shouldn't be loaded into memory, which requires linker
547 changes... For now, until proven otherwise, use .rdata. */
548 sec
= subseg_new (".rdata$zzz", 0);
549 bfd_set_section_flags (sec
,
550 ((SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_DATA
)
551 & bfd_applicable_section_flags (stdoutput
)));
554 subseg_new (".comment", 0);
558 subseg_set (current_seg
, current_subseg
);
561 /* Handle .def directives.
563 One might ask : why can't we symbol_new if the symbol does not
564 already exist and fill it with debug information. Because of
565 the C_EFCN special symbol. It would clobber the value of the
566 function symbol before we have a chance to notice that it is
567 a C_EFCN. And a second reason is that the code is more clear this
568 way. (at least I think it is :-). */
570 #define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';')
571 #define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \
572 *input_line_pointer == '\t') \
573 input_line_pointer++;
576 obj_coff_def (int what ATTRIBUTE_UNUSED
)
578 char name_end
; /* Char after the end of name. */
579 char *symbol_name
; /* Name of the debug symbol. */
580 char *symbol_name_copy
; /* Temporary copy of the name. */
582 if (def_symbol_in_progress
!= NULL
)
584 as_warn (_(".def pseudo-op used inside of .def/.endef: ignored."));
585 demand_empty_rest_of_line ();
591 name_end
= get_symbol_name (&symbol_name
);
592 symbol_name_copy
= xstrdup (symbol_name
);
593 #ifdef tc_canonicalize_symbol_name
594 symbol_name_copy
= tc_canonicalize_symbol_name (symbol_name_copy
);
597 /* Initialize the new symbol. */
598 def_symbol_in_progress
= symbol_make (symbol_name_copy
);
599 symbol_set_frag (def_symbol_in_progress
, &zero_address_frag
);
600 S_SET_VALUE (def_symbol_in_progress
, 0);
602 if (S_IS_STRING (def_symbol_in_progress
))
603 SF_SET_STRING (def_symbol_in_progress
);
605 (void) restore_line_pointer (name_end
);
607 demand_empty_rest_of_line ();
611 obj_coff_endef (int ignore ATTRIBUTE_UNUSED
)
613 symbolS
*symbolP
= NULL
;
615 if (def_symbol_in_progress
== NULL
)
617 as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored."));
618 demand_empty_rest_of_line ();
622 /* Set the section number according to storage class. */
623 switch (S_GET_STORAGE_CLASS (def_symbol_in_progress
))
628 SF_SET_TAG (def_symbol_in_progress
);
632 SF_SET_DEBUG (def_symbol_in_progress
);
633 S_SET_SEGMENT (def_symbol_in_progress
, fetch_coff_debug_section ());
637 SF_SET_LOCAL (def_symbol_in_progress
); /* Do not emit this symbol. */
640 SF_SET_PROCESS (def_symbol_in_progress
); /* Will need processing before writing. */
646 S_SET_SEGMENT (def_symbol_in_progress
, text_section
);
648 name
= S_GET_NAME (def_symbol_in_progress
);
649 if (name
[0] == '.' && name
[2] == 'f' && name
[3] == '\0')
655 if (! in_function ())
656 as_warn (_("`%s' symbol without preceding function"), name
);
657 /* Will need relocating. */
658 SF_SET_PROCESS (def_symbol_in_progress
);
664 /* The MS compilers output the actual endline, not the
665 function-relative one... we want to match without
666 changing the assembler input. */
667 SA_SET_SYM_LNNO (def_symbol_in_progress
,
668 (SA_GET_SYM_LNNO (def_symbol_in_progress
)
679 #endif /* C_AUTOARG */
686 /* According to the COFF documentation:
688 http://osr5doc.sco.com:1996/topics/COFF_SectNumFld.html
690 A special section number (-2) marks symbolic debugging symbols,
691 including structure/union/enumeration tag names, typedefs, and
692 the name of the file. A section number of -1 indicates that the
693 symbol has a value but is not relocatable. Examples of
694 absolute-valued symbols include automatic and register variables,
695 function arguments, and .eos symbols.
697 But from Ian Lance Taylor:
699 http://sources.redhat.com/ml/binutils/2000-08/msg00202.html
701 the actual tools all marked them as section -1. So the GNU COFF
702 assembler follows historical COFF assemblers.
704 However, it causes problems for djgpp
706 http://sources.redhat.com/ml/binutils/2000-08/msg00210.html
708 By defining STRICTCOFF, a COFF port can make the assembler to
709 follow the documented behavior. */
716 SF_SET_DEBUG (def_symbol_in_progress
);
717 S_SET_SEGMENT (def_symbol_in_progress
, absolute_section
);
725 S_SET_SEGMENT (def_symbol_in_progress
, absolute_section
);
736 /* Valid but set somewhere else (s_comm, s_lcomm, colon). */
743 as_warn (_("unexpected storage class %d"),
744 S_GET_STORAGE_CLASS (def_symbol_in_progress
));
748 /* Now that we have built a debug symbol, try to find if we should
749 merge with an existing symbol or not. If a symbol is C_EFCN or
750 absolute_section or untagged SEG_DEBUG it never merges. We also
751 don't merge labels, which are in a different namespace, nor
752 symbols which have not yet been defined since they are typically
753 unique, nor do we merge tags with non-tags. */
755 /* Two cases for functions. Either debug followed by definition or
756 definition followed by debug. For definition first, we will
757 merge the debug symbol into the definition. For debug first, the
758 lineno entry MUST point to the definition function or else it
759 will point off into space when obj_crawl_symbol_chain() merges
760 the debug symbol into the real symbol. Therefor, let's presume
761 the debug symbol is a real function reference. */
763 /* FIXME-SOON If for some reason the definition label/symbol is
764 never seen, this will probably leave an undefined symbol at link
767 if (S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_EFCN
768 || S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_LABEL
769 || (streq (bfd_section_name (S_GET_SEGMENT (def_symbol_in_progress
)),
771 && !SF_GET_TAG (def_symbol_in_progress
))
772 || S_GET_SEGMENT (def_symbol_in_progress
) == absolute_section
773 || ! symbol_constant_p (def_symbol_in_progress
)
774 || (symbolP
= symbol_find (S_GET_NAME (def_symbol_in_progress
))) == NULL
775 || SF_GET_TAG (def_symbol_in_progress
) != SF_GET_TAG (symbolP
))
777 /* If it already is at the end of the symbol list, do nothing */
778 if (def_symbol_in_progress
!= symbol_lastP
)
780 symbol_remove (def_symbol_in_progress
, &symbol_rootP
, &symbol_lastP
);
781 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
,
787 /* This symbol already exists, merge the newly created symbol
788 into the old one. This is not mandatory. The linker can
789 handle duplicate symbols correctly. But I guess that it save
790 a *lot* of space if the assembly file defines a lot of
793 /* The debug entry (def_symbol_in_progress) is merged into the
794 previous definition. */
796 c_symbol_merge (def_symbol_in_progress
, symbolP
);
797 symbol_remove (def_symbol_in_progress
, &symbol_rootP
, &symbol_lastP
);
799 def_symbol_in_progress
= symbolP
;
801 if (SF_GET_FUNCTION (def_symbol_in_progress
)
802 || SF_GET_TAG (def_symbol_in_progress
)
803 || S_GET_STORAGE_CLASS (def_symbol_in_progress
) == C_STAT
)
805 /* For functions, and tags, and static symbols, the symbol
806 *must* be where the debug symbol appears. Move the
807 existing symbol to the current place. */
808 /* If it already is at the end of the symbol list, do nothing. */
809 if (def_symbol_in_progress
!= symbol_lastP
)
811 symbol_remove (def_symbol_in_progress
, &symbol_rootP
, &symbol_lastP
);
812 symbol_append (def_symbol_in_progress
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
817 if (SF_GET_TAG (def_symbol_in_progress
))
821 oldtag
= symbol_find (S_GET_NAME (def_symbol_in_progress
));
822 if (oldtag
== NULL
|| ! SF_GET_TAG (oldtag
))
823 tag_insert (S_GET_NAME (def_symbol_in_progress
),
824 def_symbol_in_progress
);
827 if (SF_GET_FUNCTION (def_symbol_in_progress
))
829 set_function (def_symbol_in_progress
);
830 SF_SET_PROCESS (def_symbol_in_progress
);
833 /* That is, if this is the first time we've seen the
835 symbol_table_insert (def_symbol_in_progress
);
839 def_symbol_in_progress
= NULL
;
840 demand_empty_rest_of_line ();
844 obj_coff_dim (int ignore ATTRIBUTE_UNUSED
)
848 if (def_symbol_in_progress
== NULL
)
850 as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored."));
851 demand_empty_rest_of_line ();
855 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
857 for (d_index
= 0; d_index
< DIMNUM
; d_index
++)
860 SA_SET_SYM_DIMEN (def_symbol_in_progress
, d_index
,
861 get_absolute_expression ());
863 switch (*input_line_pointer
)
866 input_line_pointer
++;
870 as_warn (_("badly formed .dim directive ignored"));
879 demand_empty_rest_of_line ();
883 obj_coff_line (int ignore ATTRIBUTE_UNUSED
)
887 if (def_symbol_in_progress
== NULL
)
889 /* Probably stabs-style line? */
894 this_base
= get_absolute_expression ();
895 if (streq (".bf", S_GET_NAME (def_symbol_in_progress
)))
896 coff_line_base
= this_base
;
898 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
899 SA_SET_SYM_LNNO (def_symbol_in_progress
, this_base
);
901 demand_empty_rest_of_line ();
904 if (streq (".bf", S_GET_NAME (def_symbol_in_progress
)))
909 listing_source_line ((unsigned int) this_base
);
915 obj_coff_size (int ignore ATTRIBUTE_UNUSED
)
917 if (def_symbol_in_progress
== NULL
)
919 as_warn (_(".size pseudo-op used outside of .def/.endef: ignored."));
920 demand_empty_rest_of_line ();
924 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
925 SA_SET_SYM_SIZE (def_symbol_in_progress
, get_absolute_expression ());
926 demand_empty_rest_of_line ();
930 obj_coff_scl (int ignore ATTRIBUTE_UNUSED
)
932 if (def_symbol_in_progress
== NULL
)
934 as_warn (_(".scl pseudo-op used outside of .def/.endef: ignored."));
935 demand_empty_rest_of_line ();
939 S_SET_STORAGE_CLASS (def_symbol_in_progress
, get_absolute_expression ());
940 demand_empty_rest_of_line ();
944 obj_coff_tag (int ignore ATTRIBUTE_UNUSED
)
949 if (def_symbol_in_progress
== NULL
)
951 as_warn (_(".tag pseudo-op used outside of .def/.endef: ignored."));
952 demand_empty_rest_of_line ();
956 S_SET_NUMBER_AUXILIARY (def_symbol_in_progress
, 1);
957 name_end
= get_symbol_name (&symbol_name
);
959 #ifdef tc_canonicalize_symbol_name
960 symbol_name
= tc_canonicalize_symbol_name (symbol_name
);
963 /* Assume that the symbol referred to by .tag is always defined.
964 This was a bad assumption. I've added find_or_make. xoxorich. */
965 SA_SET_SYM_TAGNDX (def_symbol_in_progress
,
966 tag_find_or_make (symbol_name
));
967 if (SA_GET_SYM_TAGNDX (def_symbol_in_progress
) == 0L)
968 as_warn (_("tag not found for .tag %s"), symbol_name
);
970 SF_SET_TAGGED (def_symbol_in_progress
);
972 (void) restore_line_pointer (name_end
);
973 demand_empty_rest_of_line ();
977 obj_coff_type (int ignore ATTRIBUTE_UNUSED
)
979 if (def_symbol_in_progress
== NULL
)
981 as_warn (_(".type pseudo-op used outside of .def/.endef: ignored."));
982 demand_empty_rest_of_line ();
986 S_SET_DATA_TYPE (def_symbol_in_progress
, get_absolute_expression ());
988 if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress
)) &&
989 S_GET_STORAGE_CLASS (def_symbol_in_progress
) != C_TPDEF
)
990 SF_SET_FUNCTION (def_symbol_in_progress
);
992 demand_empty_rest_of_line ();
996 obj_coff_val (int ignore ATTRIBUTE_UNUSED
)
998 if (def_symbol_in_progress
== NULL
)
1000 as_warn (_(".val pseudo-op used outside of .def/.endef: ignored."));
1001 demand_empty_rest_of_line ();
1005 if (is_name_beginner (*input_line_pointer
))
1008 char name_end
= get_symbol_name (&symbol_name
);
1010 #ifdef tc_canonicalize_symbol_name
1011 symbol_name
= tc_canonicalize_symbol_name (symbol_name
);
1013 if (streq (symbol_name
, "."))
1015 /* If the .val is != from the .def (e.g. statics). */
1016 symbol_set_frag (def_symbol_in_progress
, frag_now
);
1017 S_SET_VALUE (def_symbol_in_progress
, (valueT
) frag_now_fix ());
1019 else if (! streq (S_GET_NAME (def_symbol_in_progress
), symbol_name
))
1023 exp
.X_op
= O_symbol
;
1024 exp
.X_add_symbol
= symbol_find_or_make (symbol_name
);
1025 exp
.X_op_symbol
= NULL
;
1026 exp
.X_add_number
= 0;
1027 symbol_set_value_expression (def_symbol_in_progress
, &exp
);
1029 /* If the segment is undefined when the forward reference is
1030 resolved, then copy the segment id from the forward
1032 SF_SET_GET_SEGMENT (def_symbol_in_progress
);
1034 /* FIXME: gcc can generate address expressions here in
1035 unusual cases (search for "obscure" in sdbout.c). We
1036 just ignore the offset here, thus generating incorrect
1037 debugging information. We ignore the rest of the line
1040 /* Otherwise, it is the name of a non debug symbol and its value
1041 will be calculated later. */
1042 (void) restore_line_pointer (name_end
);
1046 S_SET_VALUE (def_symbol_in_progress
, get_absolute_expression ());
1049 demand_empty_rest_of_line ();
1054 /* Return nonzero if name begins with weak alternate symbol prefix. */
1057 weak_is_altname (const char * name
)
1059 return startswith (name
, weak_altprefix
);
1062 /* Return the name of the alternate symbol
1063 name corresponding to a weak symbol's name. */
1066 weak_name2altname (const char * name
)
1068 return concat (weak_altprefix
, name
, (char *) NULL
);
1071 /* Return the name of the weak symbol corresponding to an
1072 alternate symbol. */
1075 weak_altname2name (const char * name
)
1077 gas_assert (weak_is_altname (name
));
1078 return xstrdup (name
+ 6);
1081 /* Make a weak symbol name unique by
1082 appending the name of an external symbol. */
1085 weak_uniquify (const char * name
)
1087 const char * unique
= "";
1090 if (an_external_name
!= NULL
)
1091 unique
= an_external_name
;
1093 gas_assert (weak_is_altname (name
));
1095 return concat (name
, ".", unique
, (char *) NULL
);
1099 pecoff_obj_set_weak_hook (symbolS
*symbolP
)
1101 symbolS
*alternateP
;
1103 /* See _Microsoft Portable Executable and Common Object
1104 File Format Specification_, section 5.5.3.
1105 Create a symbol representing the alternate value.
1106 coff_frob_symbol will set the value of this symbol from
1107 the value of the weak symbol itself. */
1108 S_SET_STORAGE_CLASS (symbolP
, C_NT_WEAK
);
1109 S_SET_NUMBER_AUXILIARY (symbolP
, 1);
1110 SA_SET_SYM_FSIZE (symbolP
, IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY
);
1112 alternateP
= symbol_find_or_make (weak_name2altname (S_GET_NAME (symbolP
)));
1113 S_SET_EXTERNAL (alternateP
);
1114 S_SET_STORAGE_CLASS (alternateP
, C_NT_WEAK
);
1116 SA_SET_SYM_TAGNDX (symbolP
, alternateP
);
1120 pecoff_obj_clear_weak_hook (symbolS
*symbolP
)
1122 symbolS
*alternateP
;
1124 S_SET_STORAGE_CLASS (symbolP
, 0);
1125 SA_SET_SYM_FSIZE (symbolP
, 0);
1127 alternateP
= symbol_find (weak_name2altname (S_GET_NAME (symbolP
)));
1128 S_CLEAR_EXTERNAL (alternateP
);
1133 /* Handle .weak. This is a GNU extension in formats other than PE. */
1136 obj_coff_weak (int ignore ATTRIBUTE_UNUSED
)
1144 c
= get_symbol_name (&name
);
1147 as_warn (_("badly formed .weak directive ignored"));
1148 ignore_rest_of_line ();
1152 symbolP
= symbol_find_or_make (name
);
1153 *input_line_pointer
= c
;
1154 SKIP_WHITESPACE_AFTER_NAME ();
1155 S_SET_WEAK (symbolP
);
1159 input_line_pointer
++;
1161 if (*input_line_pointer
== '\n')
1168 demand_empty_rest_of_line ();
1172 coff_obj_read_begin_hook (void)
1174 /* These had better be the same. Usually 18 bytes. */
1175 know (sizeof (SYMENT
) == sizeof (AUXENT
));
1176 know (SYMESZ
== AUXESZ
);
1180 symbolS
*coff_last_function
;
1182 static symbolS
*coff_last_bf
;
1186 coff_frob_symbol (symbolS
*symp
, int *punt
)
1188 static symbolS
*last_tagP
;
1189 static stack
*block_stack
;
1190 static symbolS
*set_end
;
1191 symbolS
*next_set_end
= NULL
;
1193 if (symp
== &abs_symbol
)
1199 if (current_lineno_sym
)
1200 coff_add_linesym (NULL
);
1203 block_stack
= stack_init (512, sizeof (symbolS
*));
1206 if (S_GET_STORAGE_CLASS (symp
) == C_NT_WEAK
1207 && ! S_IS_WEAK (symp
)
1208 && weak_is_altname (S_GET_NAME (symp
)))
1210 /* This is a weak alternate symbol. All processing of
1211 PECOFFweak symbols is done here, through the alternate. */
1212 symbolS
*weakp
= symbol_find_noref (weak_altname2name
1213 (S_GET_NAME (symp
)), 1);
1216 gas_assert (S_GET_NUMBER_AUXILIARY (weakp
) == 1);
1218 if (! S_IS_WEAK (weakp
))
1220 /* The symbol was turned from weak to strong. Discard altname. */
1224 else if (symbol_equated_p (weakp
))
1226 /* The weak symbol has an alternate specified; symp is unneeded. */
1227 S_SET_STORAGE_CLASS (weakp
, C_NT_WEAK
);
1228 SA_SET_SYM_TAGNDX (weakp
,
1229 symbol_get_value_expression (weakp
)->X_add_symbol
);
1231 S_CLEAR_EXTERNAL (symp
);
1237 /* The weak symbol has been assigned an alternate value.
1238 Copy this value to symp, and set symp as weakp's alternate. */
1239 if (S_GET_STORAGE_CLASS (weakp
) != C_NT_WEAK
)
1241 S_SET_STORAGE_CLASS (symp
, S_GET_STORAGE_CLASS (weakp
));
1242 S_SET_STORAGE_CLASS (weakp
, C_NT_WEAK
);
1245 if (S_IS_DEFINED (weakp
))
1247 /* This is a defined weak symbol. Copy value information
1248 from the weak symbol itself to the alternate symbol. */
1249 symbol_set_value_expression (symp
,
1250 symbol_get_value_expression (weakp
));
1251 symbol_set_frag (symp
, symbol_get_frag (weakp
));
1252 S_SET_SEGMENT (symp
, S_GET_SEGMENT (weakp
));
1256 /* This is an undefined weak symbol.
1257 Define the alternate symbol to zero. */
1258 S_SET_VALUE (symp
, 0);
1259 S_SET_SEGMENT (symp
, absolute_section
);
1262 S_SET_NAME (symp
, weak_uniquify (S_GET_NAME (symp
)));
1263 S_SET_STORAGE_CLASS (symp
, C_EXT
);
1265 S_SET_VALUE (weakp
, 0);
1266 S_SET_SEGMENT (weakp
, undefined_section
);
1270 if (S_IS_WEAK (symp
))
1271 S_SET_STORAGE_CLASS (symp
, C_WEAKEXT
);
1274 if (!S_IS_DEFINED (symp
)
1275 && !S_IS_WEAK (symp
)
1276 && S_GET_STORAGE_CLASS (symp
) != C_STAT
)
1277 S_SET_STORAGE_CLASS (symp
, C_EXT
);
1279 if (!SF_GET_DEBUG (symp
))
1283 if (!SF_GET_LOCAL (symp
)
1284 && !SF_GET_STATICS (symp
)
1285 && S_GET_STORAGE_CLASS (symp
) != C_LABEL
1286 && symbol_constant_p (symp
)
1287 && (real
= symbol_find_noref (S_GET_NAME (symp
), 1))
1288 && S_GET_STORAGE_CLASS (real
) == C_NULL
1291 c_symbol_merge (symp
, real
);
1296 if (!S_IS_DEFINED (symp
) && !SF_GET_LOCAL (symp
))
1298 gas_assert (S_GET_VALUE (symp
) == 0);
1299 if (S_IS_WEAKREFD (symp
))
1302 S_SET_EXTERNAL (symp
);
1304 else if (S_GET_STORAGE_CLASS (symp
) == C_NULL
)
1306 if (S_GET_SEGMENT (symp
) == text_section
1307 && symp
!= seg_info (text_section
)->sym
)
1308 S_SET_STORAGE_CLASS (symp
, C_LABEL
);
1310 S_SET_STORAGE_CLASS (symp
, C_STAT
);
1313 if (SF_GET_PROCESS (symp
))
1315 if (S_GET_STORAGE_CLASS (symp
) == C_BLOCK
)
1317 if (streq (S_GET_NAME (symp
), ".bb"))
1318 stack_push (block_stack
, (char *) &symp
);
1323 begin
= *(symbolS
**) stack_pop (block_stack
);
1325 as_warn (_("mismatched .eb"));
1327 next_set_end
= begin
;
1331 if (coff_last_function
== 0 && SF_GET_FUNCTION (symp
)
1332 && S_IS_DEFINED (symp
))
1334 union internal_auxent
*auxp
;
1336 coff_last_function
= symp
;
1337 if (S_GET_NUMBER_AUXILIARY (symp
) < 1)
1338 S_SET_NUMBER_AUXILIARY (symp
, 1);
1339 auxp
= SYM_AUXENT (symp
);
1340 memset (auxp
->x_sym
.x_fcnary
.x_ary
.x_dimen
, 0,
1341 sizeof (auxp
->x_sym
.x_fcnary
.x_ary
.x_dimen
));
1344 if (S_GET_STORAGE_CLASS (symp
) == C_EFCN
1345 && S_IS_DEFINED (symp
))
1347 if (coff_last_function
== 0)
1348 as_fatal (_("C_EFCN symbol for %s out of scope"),
1350 SA_SET_SYM_FSIZE (coff_last_function
,
1351 (long) (S_GET_VALUE (symp
)
1352 - S_GET_VALUE (coff_last_function
)));
1353 next_set_end
= coff_last_function
;
1354 coff_last_function
= 0;
1358 if (S_IS_EXTERNAL (symp
))
1359 S_SET_STORAGE_CLASS (symp
, C_EXT
);
1360 else if (SF_GET_LOCAL (symp
))
1363 if (SF_GET_FUNCTION (symp
))
1364 symbol_get_bfdsym (symp
)->flags
|= BSF_FUNCTION
;
1367 /* Double check weak symbols. */
1368 if (S_IS_WEAK (symp
) && S_IS_COMMON (symp
))
1369 as_bad (_("Symbol `%s' can not be both weak and common"),
1372 if (SF_GET_TAG (symp
))
1374 else if (S_GET_STORAGE_CLASS (symp
) == C_EOS
)
1375 next_set_end
= last_tagP
;
1378 /* This is pretty horrible, but we have to set *punt correctly in
1379 order to call SA_SET_SYM_ENDNDX correctly. */
1380 if (! symbol_used_in_reloc_p (symp
)
1381 && S_GET_STORAGE_CLASS (symp
) != C_DWARF
1382 && ((symbol_get_bfdsym (symp
)->flags
& BSF_SECTION_SYM
) != 0
1383 || (! (S_IS_EXTERNAL (symp
) || S_IS_WEAK (symp
))
1384 && ! symbol_get_tc (symp
)->output
1385 && S_GET_STORAGE_CLASS (symp
) != C_FILE
)))
1389 if (set_end
!= (symbolS
*) NULL
1391 && ((symbol_get_bfdsym (symp
)->flags
& BSF_NOT_AT_END
) != 0
1392 || (S_IS_DEFINED (symp
)
1393 && ! S_IS_COMMON (symp
)
1394 && (! S_IS_EXTERNAL (symp
) || SF_GET_FUNCTION (symp
)))))
1396 SA_SET_SYM_ENDNDX (set_end
, symp
);
1400 if (next_set_end
!= NULL
)
1402 if (set_end
!= NULL
)
1403 as_warn (_("Warning: internal error: forgetting to set endndx of %s"),
1404 S_GET_NAME (set_end
));
1405 set_end
= next_set_end
;
1410 && S_GET_STORAGE_CLASS (symp
) == C_FCN
1411 && streq (S_GET_NAME (symp
), ".bf"))
1413 if (coff_last_bf
!= NULL
)
1414 SA_SET_SYM_ENDNDX (coff_last_bf
, symp
);
1415 coff_last_bf
= symp
;
1418 if (coffsymbol (symbol_get_bfdsym (symp
))->lineno
)
1421 struct line_no
*lptr
;
1424 lptr
= (struct line_no
*) coffsymbol (symbol_get_bfdsym (symp
))->lineno
;
1425 for (i
= 0; lptr
; lptr
= lptr
->next
)
1427 lptr
= (struct line_no
*) coffsymbol (symbol_get_bfdsym (symp
))->lineno
;
1429 /* We need i entries for line numbers, plus 1 for the first
1430 entry which BFD will override, plus 1 for the last zero
1431 entry (a marker for BFD). */
1432 l
= XNEWVEC (alent
, (i
+ 2));
1433 coffsymbol (symbol_get_bfdsym (symp
))->lineno
= l
;
1434 l
[i
+ 1].line_number
= 0;
1435 l
[i
+ 1].u
.sym
= NULL
;
1439 lptr
->l
.u
.offset
+= lptr
->frag
->fr_address
/ OCTETS_PER_BYTE
;
1447 coff_adjust_section_syms (bfd
*abfd ATTRIBUTE_UNUSED
,
1449 void * x ATTRIBUTE_UNUSED
)
1452 segment_info_type
*seginfo
= seg_info (sec
);
1453 int nlnno
, nrelocs
= 0;
1455 /* RS/6000 gas creates a .debug section manually in ppc_frob_file in
1456 tc-ppc.c. Do not get confused by it. */
1457 if (seginfo
== NULL
)
1460 if (streq (sec
->name
, ".text"))
1461 nlnno
= coff_n_line_nos
;
1465 /* @@ Hope that none of the fixups expand to more than one reloc
1467 fixS
*fixp
= seginfo
->fix_root
;
1470 if (! fixp
->fx_done
)
1472 fixp
= fixp
->fx_next
;
1475 if (bfd_section_size (sec
) == 0
1478 && sec
!= text_section
1479 && sec
!= data_section
1480 && sec
!= bss_section
)
1483 secsym
= section_symbol (sec
);
1484 /* This is an estimate; we'll plug in the real value using
1485 SET_SECTION_RELOCS later */
1487 if (S_GET_STORAGE_CLASS (secsym
) == C_DWARF
)
1488 SA_SET_SECT_NRELOC (secsym
, nrelocs
);
1491 SA_SET_SCN_NRELOC (secsym
, nrelocs
);
1492 SA_SET_SCN_NLINNO (secsym
, nlnno
);
1495 SA_SET_SCN_NRELOC (secsym
, nrelocs
);
1496 SA_SET_SCN_NLINNO (secsym
, nlnno
);
1501 coff_frob_file_after_relocs (void)
1503 bfd_map_over_sections (stdoutput
, coff_adjust_section_syms
, NULL
);
1506 /* Implement the .section pseudo op:
1507 .section name {, "flags"}
1509 | +--- optional flags: 'b' for bss
1511 +-- section name 'l' for lib
1515 'd' (apparently m88k for data)
1518 'r' for read-only data
1519 's' for shared data (PE)
1521 '0' - '9' for power-of-two alignment (GNU extension).
1522 But if the argument is not a quoted string, treat it as a
1525 Note the 'a' flag is silently ignored. This allows the same
1526 .section directive to be parsed in both ELF and COFF formats. */
1529 obj_coff_section (int ignore ATTRIBUTE_UNUSED
)
1531 /* Strip out the section name. */
1537 flagword flags
, oldflags
;
1539 bool is_bss
= false;
1549 c
= get_symbol_name (§ion_name
);
1550 name
= xmemdup0 (section_name
, input_line_pointer
- section_name
);
1551 *input_line_pointer
= c
;
1552 SKIP_WHITESPACE_AFTER_NAME ();
1555 flags
= SEC_NO_FLAGS
;
1557 if (*input_line_pointer
== ',')
1559 ++input_line_pointer
;
1561 if (*input_line_pointer
!= '"')
1562 exp
= get_absolute_expression ();
1566 int readonly_removed
= 0;
1567 int load_removed
= 0;
1569 while (attr
= *++input_line_pointer
,
1571 && ! is_end_of_line
[attr
])
1575 alignment
= attr
- '0';
1581 /* Exclude section from linking. */
1582 flags
|= SEC_EXCLUDE
;
1586 /* Uninitialised data section. */
1593 /* Section not loaded. */
1595 flags
|= SEC_NEVER_LOAD
;
1600 /* Shared section. */
1601 flags
|= SEC_COFF_SHARED
;
1608 flags
&=~ SEC_READONLY
;
1612 /* Writable section. */
1613 flags
&=~ SEC_READONLY
;
1614 readonly_removed
= 1;
1618 /* Ignore. Here for compatibility with ELF. */
1621 case 'r': /* Read-only section. Implies a data section. */
1622 readonly_removed
= 0;
1624 case 'x': /* Executable section. */
1625 /* If we are setting the 'x' attribute or if the 'r'
1626 attribute is being used to restore the readonly status
1627 of a code section (eg "wxr") then set the SEC_CODE flag,
1628 otherwise set the SEC_DATA flag. */
1629 flags
|= (attr
== 'x' || (flags
& SEC_CODE
) ? SEC_CODE
: SEC_DATA
);
1632 /* Note - the READONLY flag is set here, even for the 'x'
1633 attribute in order to be compatible with the MSVC
1635 if (! readonly_removed
)
1636 flags
|= SEC_READONLY
;
1640 flags
|= SEC_COFF_NOREAD
| SEC_READONLY
;
1643 case 'i': /* STYP_INFO */
1644 case 'l': /* STYP_LIB */
1645 case 'o': /* STYP_OVER */
1646 as_warn (_("unsupported section attribute '%c'"), attr
);
1650 as_warn (_("unknown section attribute '%c'"), attr
);
1655 ++input_line_pointer
;
1659 sec
= subseg_new (name
, (subsegT
) exp
);
1662 seg_info (sec
)->bss
= 1;
1665 sec
->alignment_power
= alignment
;
1667 oldflags
= bfd_section_flags (sec
);
1668 if (oldflags
== SEC_NO_FLAGS
)
1670 /* Set section flags for a new section just created by subseg_new.
1671 Provide a default if no flags were parsed. */
1672 if (flags
== SEC_NO_FLAGS
)
1673 flags
= TC_COFF_SECTION_DEFAULT_ATTRIBUTES
;
1675 #ifdef COFF_LONG_SECTION_NAMES
1676 /* Add SEC_LINK_ONCE and SEC_LINK_DUPLICATES_DISCARD to .gnu.linkonce
1677 sections so adjust_reloc_syms in write.c will correctly handle
1678 relocs which refer to non-local symbols in these sections. */
1679 if (startswith (name
, ".gnu.linkonce"))
1680 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
1683 if (!bfd_set_section_flags (sec
, flags
))
1684 as_warn (_("error setting flags for \"%s\": %s"),
1685 bfd_section_name (sec
),
1686 bfd_errmsg (bfd_get_error ()));
1688 else if (flags
!= SEC_NO_FLAGS
)
1690 /* This section's attributes have already been set. Warn if the
1691 attributes don't match. */
1692 flagword matchflags
= (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
1693 | SEC_DATA
| SEC_COFF_SHARED
| SEC_NEVER_LOAD
1695 if ((flags
^ oldflags
) & matchflags
)
1696 as_warn (_("Ignoring changed section attributes for %s"), name
);
1699 demand_empty_rest_of_line ();
1703 coff_adjust_symtab (void)
1705 if (symbol_rootP
== NULL
1706 || S_GET_STORAGE_CLASS (symbol_rootP
) != C_FILE
)
1707 c_dot_file_symbol ("fake");
1711 coff_frob_section (segT sec
)
1718 /* The COFF back end in BFD requires that all section sizes be
1719 rounded up to multiples of the corresponding section alignments,
1720 supposedly because standard COFF has no other way of encoding alignment
1721 for sections. If your COFF flavor has a different way of encoding
1722 section alignment, then skip this step, as TICOFF does. */
1723 bfd_vma size
= bfd_section_size (sec
);
1724 #if !defined(TICOFF)
1725 bfd_vma align_power
= (bfd_vma
) sec
->alignment_power
+ OCTETS_PER_BYTE_POWER
;
1726 bfd_vma mask
= ((bfd_vma
) 1 << align_power
) - 1;
1728 if (!do_not_pad_sections_to_alignment
1729 && (size
& mask
) != 0)
1734 new_size
= (size
+ mask
) & ~mask
;
1735 bfd_set_section_size (sec
, new_size
);
1737 /* If the size had to be rounded up, add some padding in
1738 the last non-empty frag. */
1739 fragp
= seg_info (sec
)->frchainP
->frch_root
;
1740 last
= seg_info (sec
)->frchainP
->frch_last
;
1741 while (fragp
->fr_next
!= last
)
1742 fragp
= fragp
->fr_next
;
1743 last
->fr_address
= size
;
1744 if ((new_size
- size
) % fragp
->fr_var
== 0)
1745 fragp
->fr_offset
+= (new_size
- size
) / fragp
->fr_var
;
1751 /* If the section size is non-zero, the section symbol needs an aux
1752 entry associated with it, indicating the size. We don't know
1753 all the values yet; coff_frob_symbol will fill them in later. */
1756 || sec
== text_section
1757 || sec
== data_section
1758 || sec
== bss_section
)
1761 symbolS
*secsym
= section_symbol (sec
);
1762 unsigned char sclass
= C_STAT
;
1765 if (bfd_section_flags (sec
) & SEC_DEBUGGING
)
1768 S_SET_STORAGE_CLASS (secsym
, sclass
);
1769 S_SET_NUMBER_AUXILIARY (secsym
, 1);
1770 SF_SET_STATICS (secsym
);
1772 SA_SET_SECT_SCNLEN (secsym
, size
);
1774 SA_SET_SCN_SCNLEN (secsym
, size
);
1777 /* FIXME: These should be in a "stabs.h" file, or maybe as.h. */
1778 #ifndef STAB_SECTION_NAME
1779 #define STAB_SECTION_NAME ".stab"
1781 #ifndef STAB_STRING_SECTION_NAME
1782 #define STAB_STRING_SECTION_NAME ".stabstr"
1784 if (! streq (STAB_STRING_SECTION_NAME
, sec
->name
))
1788 sec
= subseg_get (STAB_SECTION_NAME
, 0);
1789 /* size is already rounded up, since other section will be listed first */
1790 size
= bfd_section_size (strsec
);
1792 n_entries
= bfd_section_size (sec
) / 12 - 1;
1794 /* Find first non-empty frag. It should be large enough. */
1795 fragp
= seg_info (sec
)->frchainP
->frch_root
;
1796 while (fragp
&& fragp
->fr_fix
== 0)
1797 fragp
= fragp
->fr_next
;
1798 gas_assert (fragp
!= 0 && fragp
->fr_fix
>= 12);
1800 /* Store the values. */
1801 p
= fragp
->fr_literal
;
1802 bfd_h_put_16 (stdoutput
, n_entries
, (bfd_byte
*) p
+ 6);
1803 bfd_h_put_32 (stdoutput
, size
, (bfd_byte
*) p
+ 8);
1807 obj_coff_init_stab_section (segT seg
)
1812 unsigned int stroff
;
1814 /* Make space for this first symbol. */
1818 file
= as_where ((unsigned int *) NULL
);
1819 stabstr_name
= concat (seg
->name
, "str", (char *) NULL
);
1820 stroff
= get_stab_string_offset (file
, stabstr_name
, true);
1822 md_number_to_chars (p
, stroff
, 4);
1826 const char * s_get_name (symbolS
*);
1829 s_get_name (symbolS
*s
)
1831 return ((s
== NULL
) ? "(NULL)" : S_GET_NAME (s
));
1834 void symbol_dump (void);
1841 for (symbolP
= symbol_rootP
; symbolP
; symbolP
= symbol_next (symbolP
))
1842 printf (_("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n"),
1843 (unsigned long) symbolP
,
1844 S_GET_NAME (symbolP
),
1845 (long) S_GET_DATA_TYPE (symbolP
),
1846 S_GET_STORAGE_CLASS (symbolP
),
1847 (int) S_GET_SEGMENT (symbolP
));
1852 const pseudo_typeS coff_pseudo_table
[] =
1854 {"ABORT", s_abort
, 0},
1855 /* We accept the .bss directive for backward compatibility with
1856 earlier versions of gas. */
1857 {"bss", obj_coff_bss
, 0},
1859 /* PE provides an enhanced version of .comm with alignment. */
1860 {"comm", obj_coff_comm
, 0},
1862 {"def", obj_coff_def
, 0},
1863 {"dim", obj_coff_dim
, 0},
1864 {"endef", obj_coff_endef
, 0},
1865 {"ident", obj_coff_ident
, 0},
1866 {"line", obj_coff_line
, 0},
1867 {"ln", obj_coff_ln
, 0},
1868 {"scl", obj_coff_scl
, 0},
1869 {"sect", obj_coff_section
, 0},
1870 {"sect.s", obj_coff_section
, 0},
1871 {"section", obj_coff_section
, 0},
1872 {"section.s", obj_coff_section
, 0},
1873 /* FIXME: We ignore the MRI short attribute. */
1874 {"size", obj_coff_size
, 0},
1875 {"tag", obj_coff_tag
, 0},
1876 {"type", obj_coff_type
, 0},
1877 {"val", obj_coff_val
, 0},
1878 {"version", s_ignore
, 0},
1879 {"loc", obj_coff_loc
, 0},
1880 {"optim", s_ignore
, 0}, /* For sun386i cc (?) */
1881 {"weak", obj_coff_weak
, 0},
1882 #if defined TC_TIC4X
1883 /* The tic4x uses sdef instead of def. */
1884 {"sdef", obj_coff_def
, 0},
1886 #if defined(SEH_CMDS)
1893 /* Support for a COFF emulation. */
1896 coff_pop_insert (void)
1898 pop_insert (coff_pseudo_table
);
1902 coff_separate_stab_sections (void)
1907 const struct format_ops coff_format_ops
=
1909 bfd_target_coff_flavour
,
1910 0, /* dfl_leading_underscore */
1911 1, /* emit_section_symbols */
1917 0, /* frob_file_before_adjust */
1918 0, /* frob_file_before_fix */
1919 coff_frob_file_after_relocs
,
1922 0, /* s_get_align */
1923 0, /* s_set_align */
1924 0, /* s_get_other */
1925 0, /* s_set_other */
1930 0, /* copy_symbol_attributes */
1931 0, /* generate_asm_lineno */
1932 0, /* process_stab */
1933 coff_separate_stab_sections
,
1934 obj_coff_init_stab_section
,
1935 0, /* sec_sym_ok_for_reloc */
1937 0, /* ecoff_set_ext */
1938 coff_obj_read_begin_hook
,
1939 coff_obj_symbol_new_hook
,
1940 coff_obj_symbol_clone_hook
,