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, 59 Temple Place - Suite 330, Boston, MA
30 #define WORKING_DOT_WORD
31 #define WARN_SIGNED_OVERFLOW_WORD
32 #define OBJ_COFF_OMIT_OPTIONAL_HEADER
42 /* This internal_lineno crap is to stop namespace pollution from the
43 bfd internal coff headerfile. */
44 #define internal_lineno bfd_internal_lineno
45 #include "coff/internal.h"
46 #undef internal_lineno
48 /* CPU-specific setup: */
53 #define TARGET_FORMAT "coff-arm"
59 #include "coff/powerpc.h"
61 #include "coff/rs6000.h"
66 #include "coff/sparc.h"
70 #include "coff/i386.h"
73 #define TARGET_FORMAT "pe-i386"
77 #define TARGET_FORMAT "coff-i386"
82 #include "coff/m68k.h"
84 #define TARGET_FORMAT "coff-m68k"
89 #include "coff/a29k.h"
90 #define TARGET_FORMAT "coff-a29k-big"
94 #include "coff/or32.h"
95 #define TARGET_FORMAT "coff-or32-big"
99 #include "coff/i960.h"
100 #define TARGET_FORMAT "coff-Intel-little"
104 #include "coff/z8k.h"
105 #define TARGET_FORMAT "coff-z8k"
109 #include "coff/h8300.h"
110 #define TARGET_FORMAT "coff-h8300"
114 #include "coff/h8500.h"
115 #define TARGET_FORMAT "coff-h8500"
119 #include "coff/maxq.h"
120 #define TARGET_FORMAT "coff-maxq"
132 #define TARGET_FORMAT "pe-shl"
135 #define TARGET_FORMAT \
136 (!target_big_endian \
137 ? (sh_small ? "coff-shl-small" : "coff-shl") \
138 : (sh_small ? "coff-sh-small" : "coff-sh"))
145 #include "coff/mipspe.h"
147 #define TARGET_FORMAT "pe-mips"
151 #include "coff/m88k.h"
152 #define TARGET_FORMAT "coff-m88kbcs"
156 #include "coff/w65.h"
157 #define TARGET_FORMAT "coff-w65"
161 #include "coff/tic30.h"
162 #define TARGET_FORMAT "coff-tic30"
166 #include "coff/tic4x.h"
167 #define TARGET_FORMAT "coff2-tic4x"
171 #include "coff/tic54x.h"
172 #define TARGET_FORMAT "coff1-c54x"
176 #include "coff/tic80.h"
177 #define TARGET_FORMAT "coff-tic80"
178 #define ALIGNMENT_IN_S_FLAGS 1
182 #include "coff/mcore.h"
183 #ifndef TARGET_FORMAT
184 #define TARGET_FORMAT "pe-mcore"
189 /* PE weak symbols need USE_UNIQUE. */
193 /* Targets may also set this. Also, if BFD_ASSEMBLER is defined, this
194 will already have been defined. */
195 #undef SYMBOLS_NEED_BACKPOINTERS
196 #define SYMBOLS_NEED_BACKPOINTERS 1
198 #ifndef OBJ_COFF_MAX_AUXENTRIES
199 #define OBJ_COFF_MAX_AUXENTRIES 1
202 #define obj_symbol_new_hook coff_obj_symbol_new_hook
203 #define obj_read_begin_hook coff_obj_read_begin_hook
205 /* This file really contains two implementations of the COFF back end.
206 They are in the process of being merged, but this is only a
207 preliminary, mechanical merging. Many definitions that are
208 identical between the two are still found in both versions.
210 The first version, with BFD_ASSEMBLER defined, uses high-level BFD
211 interfaces and data structures. The second version, with
212 BFD_ASSEMBLER not defined, also uses BFD, but mostly for swapping
213 data structures and for doing the actual I/O. The latter defines
214 the preprocessor symbols BFD and BFD_HEADERS. Try not to let this
217 These two are in the process of being merged, and eventually the
218 BFD_ASSEMBLER version should take over completely. Release timing
219 issues and namespace problems convinced me to merge the two
220 together in this fashion, a little sooner than I would have liked.
221 The real merge should be much better done by the time the next
224 For now, the structure of this file is:
232 Unfortunately, the common portions are very small at the moment,
233 and many declarations or definitions are duplicated. The structure
234 of obj-coff.c is similar.
236 See doc/internals.texi for a brief discussion of the history, if
239 Ken Raeburn, 5 May 1994. */
243 #include "bfd/libcoff.h"
245 #define OUTPUT_FLAVOR bfd_target_coff_flavour
247 /* Alter the field names, for now, until we've fixed up the other
248 references to use the new name. */
250 #define TC_SYMFIELD_TYPE symbolS *
254 #define OBJ_SYMFIELD_TYPE unsigned long
255 #define sy_obj sy_flags
257 /* We can't use the predefined section symbols in bfd/section.c, as
258 COFF symbols have extra fields. See bfd/libcoff.h:coff_symbol_type. */
259 #ifndef obj_sec_sym_ok_for_reloc
260 #define obj_sec_sym_ok_for_reloc(SEC) ((SEC)->owner != 0)
263 #define SYM_AUXENT(S) \
264 (&coffsymbol (symbol_get_bfdsym (S))->native[1].u.auxent)
265 #define SYM_AUXINFO(S) \
266 (&coffsymbol (symbol_get_bfdsym (S))->native[1])
268 #define DO_NOT_STRIP 0
270 /* The number of auxiliary entries. */
271 #define S_GET_NUMBER_AUXILIARY(s) \
272 (coffsymbol (symbol_get_bfdsym (s))->native->u.syment.n_numaux)
273 /* The number of auxiliary entries. */
274 #define S_SET_NUMBER_AUXILIARY(s, v) (S_GET_NUMBER_AUXILIARY (s) = (v))
276 /* True if a symbol name is in the string table, i.e. its length is > 8. */
277 #define S_IS_STRING(s) (strlen (S_GET_NAME (s)) > 8 ? 1 : 0)
279 /* Auxiliary entry macros. SA_ stands for symbol auxiliary. */
280 /* Omit the tv related fields. */
283 #define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l)
284 #define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno)
285 #define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size)
286 #define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize)
287 #define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr)
288 #define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx)
289 #define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)])
290 #define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname)
291 #define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen)
292 #define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc)
293 #define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno)
295 #define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno = (v))
296 #define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size = (v))
297 #define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize = (v))
298 #define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr = (v))
299 #define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)] = (v))
300 #define SA_SET_FILE_FNAME(s,v) strncpy (SYM_AUXENT (s)->x_file.x_fname, (v), FILNMLEN)
301 #define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen = (v))
302 #define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc = (v))
303 #define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno = (v))
305 /* Internal use only definitions. SF_ stands for symbol flags.
307 These values can be assigned to sy_symbol.ost_flags field of a symbolS.
309 You'll break i960 if you shift the SYSPROC bits anywhere else. for
310 more on the balname/callname hack, see tc-i960.h. b.out is done
313 #define SF_I960_MASK 0x000001ff /* Bits 0-8 are used by the i960 port. */
314 #define SF_SYSPROC 0x0000003f /* bits 0-5 are used to store the sysproc number. */
315 #define SF_IS_SYSPROC 0x00000040 /* bit 6 marks symbols that are sysprocs. */
316 #define SF_BALNAME 0x00000080 /* bit 7 marks BALNAME symbols. */
317 #define SF_CALLNAME 0x00000100 /* bit 8 marks CALLNAME symbols. */
319 #define SF_NORMAL_MASK 0x0000ffff /* bits 12-15 are general purpose. */
321 #define SF_STATICS 0x00001000 /* Mark the .text & all symbols. */
322 #define SF_DEFINED 0x00002000 /* Symbol is defined in this file. */
323 #define SF_STRING 0x00004000 /* Symbol name length > 8. */
324 #define SF_LOCAL 0x00008000 /* Symbol must not be emitted. */
326 #define SF_DEBUG_MASK 0xffff0000 /* bits 16-31 are debug info. */
328 #define SF_FUNCTION 0x00010000 /* The symbol is a function. */
329 #define SF_PROCESS 0x00020000 /* Process symbol before write. */
330 #define SF_TAGGED 0x00040000 /* Is associated with a tag. */
331 #define SF_TAG 0x00080000 /* Is a tag. */
332 #define SF_DEBUG 0x00100000 /* Is in debug or abs section. */
333 #define SF_GET_SEGMENT 0x00200000 /* Get the section of the forward symbol. */
334 /* All other bits are unused. */
337 #define SF_GET(s) (* symbol_get_obj (s))
338 #define SF_GET_DEBUG(s) (symbol_get_bfdsym (s)->flags & BSF_DEBUGGING)
339 #define SF_SET_DEBUG(s) (symbol_get_bfdsym (s)->flags |= BSF_DEBUGGING)
340 #define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK)
341 #define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK)
342 #define SF_GET_FILE(s) (SF_GET (s) & SF_FILE)
343 #define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS)
344 #define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED)
345 #define SF_GET_STRING(s) (SF_GET (s) & SF_STRING)
346 #define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL)
347 #define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION)
348 #define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS)
349 #define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED)
350 #define SF_GET_TAG(s) (SF_GET (s) & SF_TAG)
351 #define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT)
352 #define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* Used by i960. */
353 #define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* Used by i960. */
354 #define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* Used by i960. */
355 #define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* Used by i960. */
356 #define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* Used by i960. */
359 #define SF_SET(s,v) (SF_GET (s) = (v))
360 #define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK))
361 #define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK))
362 #define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE)
363 #define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS)
364 #define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED)
365 #define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING)
366 #define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL)
367 #define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL)
368 #define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION)
369 #define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS)
370 #define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED)
371 #define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG)
372 #define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT)
373 #define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* Used by i960. */
374 #define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* Used by i960. */
375 #define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* Used by i960. */
376 #define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* Used by i960. */
377 #define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* Used by i960. */
380 /* Line number handling. */
381 extern int text_lineno_number
;
382 extern int coff_line_base
;
383 extern int coff_n_line_nos
;
384 extern symbolS
*coff_last_function
;
386 #define obj_emit_lineno(WHERE, LINE, FILE_START) abort ()
387 #define obj_app_file(name, app) c_dot_file_symbol (name, app)
388 #define obj_frob_symbol(S,P) coff_frob_symbol (S, & P)
389 #define obj_frob_section(S) coff_frob_section (S)
390 #define obj_frob_file_after_relocs() coff_frob_file_after_relocs ()
391 #ifndef obj_adjust_symtab
392 #define obj_adjust_symtab() coff_adjust_symtab ()
395 /* Forward the segment of a forwarded symbol, handle assignments that
396 just copy symbol values, etc. */
397 #ifndef OBJ_COPY_SYMBOL_ATTRIBUTES
399 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest, src) \
400 (SF_GET_GET_SEGMENT (dest) \
401 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
404 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest, src) \
405 (SF_GET_GET_SEGMENT (dest) && S_GET_SEGMENT (dest) == SEG_UNKNOWN \
406 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
415 hey
! Where is the C_LEAFSTAT definition
? i960
- coff support is depending on it
.
416 #endif /* no C_LEAFSTAT */
419 #else /* not BFD_ASSEMBLER */
421 #if defined TC_A29K || defined TC_OR32
422 /* Allow translate from aout relocs to coff relocs. */
426 #define RELOC_CONST 3
427 #define RELOC_CONSTH 4
428 #define RELOC_JUMPTARG 5
429 #define RELOC_BASE22 6
432 #define RELOC_BASE13 9
433 #define RELOC_WDISP22 10
434 #define RELOC_WDISP30 11
437 extern const segT N_TYPE_seg
[];
439 /* Magic number of paged executable. */
440 #define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE 0x8300
444 /* Symbol table entry data type. */
449 struct internal_syment ost_entry
;
450 /* Auxiliary entry. */
451 union internal_auxent ost_auxent
[OBJ_COFF_MAX_AUXENTRIES
];
452 /* obj_coff internal use only flags. */
453 unsigned int ost_flags
;
457 #define DO_NOT_STRIP 0
459 /* Symbol table macros and constants. */
461 /* Possible and useful section number in symbol table
462 The values of TEXT, DATA and BSS may not be portable. */
464 #define C_ABS_SECTION N_ABS
465 #define C_UNDEF_SECTION N_UNDEF
466 #define C_DEBUG_SECTION N_DEBUG
467 #define C_NTV_SECTION N_TV
468 #define C_PTV_SECTION P_TV
469 #define C_REGISTER_SECTION 50
471 /* Macros to extract information from a symbol table entry.
472 This syntactic indirection allows independence regarding a.out or coff.
473 The argument (s) of all these macros is a pointer to a symbol table entry. */
476 /* True if the symbol is external. */
477 #define S_IS_EXTERNAL(s) \
478 ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION)
480 /* True if symbol has been defined, ie :
481 section > 0 (DATA, TEXT or BSS)
482 section == 0 and value > 0 (external bss symbol). */
483 #define S_IS_DEFINED(s) \
484 ((s)->sy_symbol.ost_entry.n_scnum > C_UNDEF_SECTION \
485 || ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION \
486 && S_GET_VALUE (s) > 0) \
487 || ((s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION))
489 /* Return true for symbols that should not be reduced to section
490 symbols or eliminated from expressions, because they may be
491 overridden by the linker. */
492 #define S_FORCE_RELOC(s, strict) \
493 (!SEG_NORMAL (S_GET_SEGMENT (s)) || (strict && S_IS_WEAK (s)))
495 /* True if a debug special symbol entry. */
496 #define S_IS_DEBUG(s) \
497 ((s)->sy_symbol.ost_entry.n_scnum == C_DEBUG_SECTION)
499 /* True if a symbol is local symbol name. */
500 /* A symbol name whose name includes ^A is a gas internal pseudo symbol. */
501 #define S_IS_LOCAL(s) \
502 ((s)->sy_symbol.ost_entry.n_scnum == C_REGISTER_SECTION \
503 || (S_LOCAL_NAME(s) && ! flag_keep_locals && ! S_IS_DEBUG (s)) \
504 || strchr (S_GET_NAME (s), '\001') != NULL \
505 || strchr (S_GET_NAME (s), '\002') != NULL \
506 || (flag_strip_local_absolute \
507 && !S_IS_EXTERNAL (s) \
508 && (s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION))
510 /* True if a symbol is not defined in this file. */
511 #define S_IS_EXTERN(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \
512 && S_GET_VALUE (s) == 0)
514 /* True if a symbol can be multiply defined (bss symbols have this def
515 though it is bad practice). */
516 #define S_IS_COMMON(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \
517 && S_GET_VALUE (s) != 0)
519 /* True if a symbol name is in the string table, i.e. its length is > 8. */
520 #define S_IS_STRING(s) (strlen (S_GET_NAME (s)) > 8 ? 1 : 0)
522 /* True if a symbol is defined as weak. */
524 #define S_IS_WEAK(s) \
525 ( (s)->sy_symbol.ost_entry.n_sclass == C_NT_WEAK \
526 || (s)->sy_symbol.ost_entry.n_sclass == C_WEAKEXT)
528 #define S_IS_WEAK(s) \
529 ((s)->sy_symbol.ost_entry.n_sclass == C_WEAKEXT)
533 /* The name of the symbol. */
534 #define S_GET_NAME(s) ((char *) (s)->sy_symbol.ost_entry.n_offset)
536 /* The pointer to the string table. */
537 #define S_GET_OFFSET(s) ((s)->sy_symbol.ost_entry.n_offset)
539 /* The numeric value of the segment. */
540 #define S_GET_SEGMENT(s) s_get_segment (s)
543 #define S_GET_DATA_TYPE(s) ((s)->sy_symbol.ost_entry.n_type)
545 /* The storage class. */
546 #define S_GET_STORAGE_CLASS(s) ((s)->sy_symbol.ost_entry.n_sclass)
548 /* The number of auxiliary entries. */
549 #define S_GET_NUMBER_AUXILIARY(s) ((s)->sy_symbol.ost_entry.n_numaux)
552 /* Set the name of the symbol. */
553 #define S_SET_NAME(s, v) \
554 ((s)->sy_symbol.ost_entry.n_offset = (unsigned long) (v))
556 /* Set the offset of the symbol. */
557 #define S_SET_OFFSET(s, v) \
558 ((s)->sy_symbol.ost_entry.n_offset = (v))
560 /* The numeric value of the segment. */
561 #define S_SET_SEGMENT(s, v) \
562 ((s)->sy_symbol.ost_entry.n_scnum = SEGMENT_TO_SYMBOL_TYPE (v))
565 #define S_SET_DATA_TYPE(s, v) \
566 ((s)->sy_symbol.ost_entry.n_type = (v))
568 /* The storage class. */
569 #define S_SET_STORAGE_CLASS(s, v) \
570 ((s)->sy_symbol.ost_entry.n_sclass = (v))
572 /* The number of auxiliary entries. */
573 #define S_SET_NUMBER_AUXILIARY(s, v) \
574 ((s)->sy_symbol.ost_entry.n_numaux = (v))
576 /* Additional modifiers. */
577 /* The symbol is external (does not mean undefined). */
578 #define S_SET_EXTERNAL(s) \
581 S_SET_STORAGE_CLASS (s, C_EXT); \
582 SF_CLEAR_LOCAL (s); \
586 /* Auxiliary entry macros. SA_ stands for symbol auxiliary. */
587 /* Omit the tv related fields. */
589 #define SYM_AUXENT(S) (&(S)->sy_symbol.ost_auxent[0])
591 #define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l)
592 #define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno)
593 #define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size)
594 #define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize)
595 #define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr)
596 #define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l)
597 #define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)])
598 #define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname)
599 #define SA_GET_FILE_FNAME_OFFSET(s) (SYM_AUXENT (s)->x_file.x_n.x_offset)
600 #define SA_GET_FILE_FNAME_ZEROS(s) (SYM_AUXENT (s)->x_file.x_n.x_zeroes)
601 #define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen)
602 #define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc)
603 #define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno)
606 #define SA_SET_SYM_TAGNDX(s,v) (SYM_AUXENT (s)->x_sym.x_tagndx.l = (v))
607 #define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno = (v))
608 #define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size = (v))
609 #define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize = (v))
610 #define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr = (v))
611 #define SA_SET_SYM_ENDNDX(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l = (v))
612 #define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)] = (v))
613 #define SA_SET_FILE_FNAME(s,v) strncpy (SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN)
614 #define SA_SET_FILE_FNAME_OFFSET(s,v) (SYM_AUXENT (s)->x_file.x_n.x_offset = (v))
615 #define SA_SET_FILE_FNAME_ZEROS(s,v) (SYM_AUXENT (s)->x_file.x_n.x_zeroes = (v))
616 #define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen = (v))
617 #define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc = (v))
618 #define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno = (v))
620 /* Internal use only definitions. SF_ stands for symbol flags.
622 These values can be assigned to sy_symbol.ost_flags field of a symbolS.
624 You'll break i960 if you shift the SYSPROC bits anywhere else. for
625 more on the balname/callname hack, see tc-i960.h. b.out is done
628 #define SF_I960_MASK 0x000001ff /* Bits 0-8 are used by the i960 port. */
629 #define SF_SYSPROC 0x0000003f /* bits 0-5 are used to store the sysproc number. */
630 #define SF_IS_SYSPROC 0x00000040 /* bit 6 marks symbols that are sysprocs. */
631 #define SF_BALNAME 0x00000080 /* bit 7 marks BALNAME symbols. */
632 #define SF_CALLNAME 0x00000100 /* bit 8 marks CALLNAME symbols. */
634 #define SF_NORMAL_MASK 0x0000ffff /* bits 12-15 are general purpose. */
636 #define SF_STATICS 0x00001000 /* Mark the .text & all symbols. */
637 #define SF_DEFINED 0x00002000 /* Symbol is defined in this file. */
638 #define SF_STRING 0x00004000 /* Symbol name length > 8. */
639 #define SF_LOCAL 0x00008000 /* Symbol must not be emitted. */
641 #define SF_DEBUG_MASK 0xffff0000 /* bits 16-31 are debug info. */
643 #define SF_FUNCTION 0x00010000 /* The symbol is a function. */
644 #define SF_PROCESS 0x00020000 /* Process symbol before write. */
645 #define SF_TAGGED 0x00040000 /* Is associated with a tag. */
646 #define SF_TAG 0x00080000 /* Is a tag. */
647 #define SF_DEBUG 0x00100000 /* Is in debug or abs section. */
648 #define SF_GET_SEGMENT 0x00200000 /* Get the section of the forward symbol. */
649 #define SF_ADJ_LNNOPTR 0x00400000 /* Has a lnnoptr. */
650 /* All other bits are unused. */
653 #define SF_GET(s) ((s)->sy_symbol.ost_flags)
654 #define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK)
655 #define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK)
656 #define SF_GET_FILE(s) (SF_GET (s) & SF_FILE)
657 #define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS)
658 #define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED)
659 #define SF_GET_STRING(s) (SF_GET (s) & SF_STRING)
660 #define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL)
661 #define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION)
662 #define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS)
663 #define SF_GET_DEBUG(s) (SF_GET (s) & SF_DEBUG)
664 #define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED)
665 #define SF_GET_TAG(s) (SF_GET (s) & SF_TAG)
666 #define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT)
667 #define SF_GET_ADJ_LNNOPTR(s) (SF_GET (s) & SF_ADJ_LNNOPTR)
668 #define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* Used by i960. */
669 #define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* Used by i960. */
670 #define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* Used by i960. */
671 #define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* Used by i960. */
672 #define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* Used by i960. */
675 #define SF_SET(s,v) (SF_GET (s) = (v))
676 #define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK))
677 #define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK))
678 #define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE)
679 #define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS)
680 #define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED)
681 #define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING)
682 #define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL)
683 #define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL)
684 #define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION)
685 #define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS)
686 #define SF_SET_DEBUG(s) (SF_GET (s) |= SF_DEBUG)
687 #define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED)
688 #define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG)
689 #define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT)
690 #define SF_SET_ADJ_LNNOPTR(s) (SF_GET (s) |= SF_ADJ_LNNOPTR)
691 #define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* Used by i960. */
692 #define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* Used by i960. */
693 #define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* Used by i960. */
694 #define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* Used by i960. */
695 #define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* Used by i960. */
697 /* File header macro and type definition. */
699 /* File position calculators. Beware to use them when all the
700 appropriate fields are set in the header. */
702 #ifdef OBJ_COFF_OMIT_OPTIONAL_HEADER
703 #define OBJ_COFF_AOUTHDRSZ (0)
705 #define OBJ_COFF_AOUTHDRSZ (AOUTHDRSZ)
708 #define H_GET_TEXT_FILE_OFFSET(h) \
710 + OBJ_COFF_AOUTHDRSZ \
711 + H_GET_NUMBER_OF_SECTIONS (h) * SCNHSZ)
713 #define H_GET_DATA_FILE_OFFSET(h) \
714 (long) (H_GET_TEXT_FILE_OFFSET (h) \
715 + H_GET_TEXT_SIZE (h))
717 #define H_GET_BSS_FILE_OFFSET(h) 0
719 #define H_GET_RELOCATION_FILE_OFFSET(h) \
720 (long) (H_GET_DATA_FILE_OFFSET (h) \
721 + H_GET_DATA_SIZE (h))
723 #define H_GET_LINENO_FILE_OFFSET(h) \
724 (long) (H_GET_RELOCATION_FILE_OFFSET (h) \
725 + H_GET_RELOCATION_SIZE (h))
727 #define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \
728 (long) (H_GET_LINENO_FILE_OFFSET (h) \
729 + H_GET_LINENO_SIZE (h))
731 #define H_GET_FILE_SIZE(h) \
732 (long) (H_GET_SYMBOL_TABLE_FILE_OFFSET (h) \
733 + H_GET_SYMBOL_TABLE_SIZE (h) \
734 + (h)->string_table_size)
738 #define H_GET_MAGIC_NUMBER(h) ((h)->aouthdr.magic)
739 #define H_GET_VERSION_STAMP(h) ((h)->aouthdr.vstamp)
740 #define H_GET_TEXT_SIZE(h) ((h)->aouthdr.tsize)
741 #define H_GET_DATA_SIZE(h) ((h)->aouthdr.dsize)
742 #define H_GET_BSS_SIZE(h) ((h)->aouthdr.bsize)
743 #define H_GET_ENTRY_POINT(h) ((h)->aouthdr.entry)
744 #define H_GET_TEXT_START(h) ((h)->aouthdr.text_start)
745 #define H_GET_DATA_START(h) ((h)->aouthdr.data_start)
747 #define H_GET_FILE_MAGIC_NUMBER(h) ((h)->filehdr.f_magic)
748 #define H_GET_NUMBER_OF_SECTIONS(h) ((h)->filehdr.f_nscns)
749 #define H_GET_TIME_STAMP(h) ((h)->filehdr.f_timdat)
750 #define H_GET_SYMBOL_TABLE_POINTER(h) ((h)->filehdr.f_symptr)
751 #define H_GET_SYMBOL_COUNT(h) ((h)->filehdr.f_nsyms)
752 #define H_GET_SYMBOL_TABLE_SIZE(h) (H_GET_SYMBOL_COUNT(h) * SYMESZ)
753 #define H_GET_SIZEOF_OPTIONAL_HEADER(h) ((h)->filehdr.f_opthdr)
754 #define H_GET_FLAGS(h) ((h)->filehdr.f_flags)
755 /* Extra fields to achieve bsd a.out compatibility and for convenience. */
756 #define H_GET_RELOCATION_SIZE(h) ((h)->relocation_size)
757 #define H_GET_STRING_SIZE(h) ((h)->string_table_size)
758 #define H_GET_LINENO_SIZE(h) ((h)->lineno_size)
760 #ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
761 #define H_GET_HEADER_SIZE(h) (sizeof (FILHDR) \
763 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
764 #else /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
765 #define H_GET_HEADER_SIZE(h) (sizeof (FILHDR) \
766 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
767 #endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
769 #define H_GET_TEXT_RELOCATION_SIZE(h) (text_section_header.s_nreloc * RELSZ)
770 #define H_GET_DATA_RELOCATION_SIZE(h) (data_section_header.s_nreloc * RELSZ)
774 #define H_SET_MAGIC_NUMBER(h,v) ((h)->aouthdr.magic = (v))
775 #define H_SET_VERSION_STAMP(h,v) ((h)->aouthdr.vstamp = (v))
776 #define H_SET_TEXT_SIZE(h,v) ((h)->aouthdr.tsize = (v))
777 #define H_SET_DATA_SIZE(h,v) ((h)->aouthdr.dsize = (v))
778 #define H_SET_BSS_SIZE(h,v) ((h)->aouthdr.bsize = (v))
779 #define H_SET_ENTRY_POINT(h,v) ((h)->aouthdr.entry = (v))
780 #define H_SET_TEXT_START(h,v) ((h)->aouthdr.text_start = (v))
781 #define H_SET_DATA_START(h,v) ((h)->aouthdr.data_start = (v))
783 #define H_SET_FILE_MAGIC_NUMBER(h,v) ((h)->filehdr.f_magic = (v))
784 #define H_SET_NUMBER_OF_SECTIONS(h,v) ((h)->filehdr.f_nscns = (v))
785 #define H_SET_TIME_STAMP(h,v) ((h)->filehdr.f_timdat = (v))
786 #define H_SET_SYMBOL_TABLE_POINTER(h,v) ((h)->filehdr.f_symptr = (v))
787 #define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->filehdr.f_nsyms = (v))
788 #define H_SET_SIZEOF_OPTIONAL_HEADER(h,v) ((h)->filehdr.f_opthdr = (v))
789 #define H_SET_FLAGS(h,v) ((h)->filehdr.f_flags = (v))
790 /* Extra fields to achieve bsd a.out compatibility and for convenience. */
791 #define H_SET_RELOCATION_SIZE(h,t,d) ((h)->relocation_size = (t)+(d))
792 #define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v))
793 #define H_SET_LINENO_SIZE(h,v) ((h)->lineno_size = (v))
795 /* Segment flipping. */
799 struct internal_aouthdr aouthdr
; /* a.out header. */
800 struct internal_filehdr filehdr
; /* File header, not machine dep. */
801 long string_table_size
; /* names + '\0' + sizeof (int). */
802 long relocation_size
; /* Cumulated size of relocation
803 information for all sections in
805 long lineno_size
; /* Size of the line number information
811 struct bfd_internal_lineno line
;
812 char *frag
; /* Frag to which the line number is related. */
813 struct lineno_list
*next
; /* Forward chain pointer. */
816 #define obj_segment_name(i) (segment_info[(int) (i)].scnhdr.s_name)
818 #define obj_add_segment(s) obj_coff_add_segment (s)
823 hey
! Where is the C_LEAFSTAT definition
? i960
- coff support is depending on it
.
824 #endif /* no C_LEAFSTAT */
827 extern struct internal_scnhdr data_section_header
;
828 extern struct internal_scnhdr text_section_header
;
830 /* Forward the segment of a forwarded symbol. */
831 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
832 (SF_GET_GET_SEGMENT (dest) \
833 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
837 #define obj_handle_link_once(t) obj_coff_pe_handle_link_once (t)
840 #endif /* not BFD_ASSEMBLER */
842 extern const pseudo_typeS coff_pseudo_table
[];
844 #ifndef obj_pop_insert
845 #define obj_pop_insert() pop_insert (coff_pseudo_table)
848 /* In COFF, if a symbol is defined using .def/.val SYM/.endef, it's OK
849 to redefine the symbol later on. This can happen if C symbols use
850 a prefix, and a symbol is defined both with and without the prefix,
851 as in start/_start/__start in gcc/libgcc1-test.c. */
852 #define RESOLVE_SYMBOL_REDEFINITION(sym) \
853 (SF_GET_GET_SEGMENT (sym) \
854 ? (sym->sy_frag = frag_now, \
855 S_SET_VALUE (sym, frag_now_fix ()), \
856 S_SET_SEGMENT (sym, now_seg), \
860 /* Stabs in a coff file go into their own section. */
861 #define SEPARATE_STAB_SECTIONS 1
863 /* We need 12 bytes at the start of the section to hold some initial
865 #define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg)
867 /* Store the number of relocations in the section aux entry. */
868 #define SET_SECTION_RELOCS(sec, relocs, n) \
869 SA_SET_SCN_NRELOC (section_symbol (sec), n)
871 #define obj_app_file(name, app) c_dot_file_symbol (name, app)
874 extern int S_SET_DATA_TYPE (symbolS
*, int);
875 extern int S_SET_STORAGE_CLASS (symbolS
*, int);
876 extern int S_GET_STORAGE_CLASS (symbolS
*);
877 extern void SA_SET_SYM_ENDNDX (symbolS
*, symbolS
*);
878 extern void coff_add_linesym (symbolS
*);
879 extern void c_dot_file_symbol (const char *, int);
880 extern void coff_frob_symbol (symbolS
*, int *);
881 extern void coff_adjust_symtab (void);
882 extern void coff_frob_section (segT
);
883 extern void coff_adjust_section_syms (bfd
*, asection
*, void *);
884 extern void coff_frob_file_after_relocs (void);
886 extern void obj_extra_stuff (object_headers
*);
888 extern void coff_obj_symbol_new_hook (symbolS
*);
889 extern void coff_obj_read_begin_hook (void);
890 extern void obj_coff_section (int);
891 extern segT
obj_coff_add_segment (const char *);
892 extern void obj_coff_section (int);
893 extern void c_dot_file_symbol (const char *, int);
894 extern segT
s_get_segment (symbolS
*);
895 extern void tc_coff_symbol_emit_hook (symbolS
*);
896 extern void obj_coff_pe_handle_link_once (void);
897 extern void obj_coff_init_stab_section (segT
);
898 extern void c_section_header (struct internal_scnhdr
*,
899 char *, long, long, long, long,
900 long, long, long, long);
901 #endif /* OBJ_FORMAT_H */