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
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 /* The number of auxiliary entries. */
269 #define S_GET_NUMBER_AUXILIARY(s) \
270 (coffsymbol (symbol_get_bfdsym (s))->native->u.syment.n_numaux)
271 /* The number of auxiliary entries. */
272 #define S_SET_NUMBER_AUXILIARY(s, v) (S_GET_NUMBER_AUXILIARY (s) = (v))
274 /* True if a symbol name is in the string table, i.e. its length is > 8. */
275 #define S_IS_STRING(s) (strlen (S_GET_NAME (s)) > 8 ? 1 : 0)
277 /* Auxiliary entry macros. SA_ stands for symbol auxiliary. */
278 /* Omit the tv related fields. */
281 #define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l)
282 #define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno)
283 #define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size)
284 #define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize)
285 #define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr)
286 #define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx)
287 #define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)])
288 #define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname)
289 #define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen)
290 #define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc)
291 #define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno)
293 #define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno = (v))
294 #define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size = (v))
295 #define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize = (v))
296 #define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr = (v))
297 #define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)] = (v))
298 #define SA_SET_FILE_FNAME(s,v) strncpy (SYM_AUXENT (s)->x_file.x_fname, (v), FILNMLEN)
299 #define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen = (v))
300 #define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc = (v))
301 #define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno = (v))
303 /* Internal use only definitions. SF_ stands for symbol flags.
305 These values can be assigned to sy_symbol.ost_flags field of a symbolS.
307 You'll break i960 if you shift the SYSPROC bits anywhere else. for
308 more on the balname/callname hack, see tc-i960.h. b.out is done
311 #define SF_I960_MASK 0x000001ff /* Bits 0-8 are used by the i960 port. */
312 #define SF_SYSPROC 0x0000003f /* bits 0-5 are used to store the sysproc number. */
313 #define SF_IS_SYSPROC 0x00000040 /* bit 6 marks symbols that are sysprocs. */
314 #define SF_BALNAME 0x00000080 /* bit 7 marks BALNAME symbols. */
315 #define SF_CALLNAME 0x00000100 /* bit 8 marks CALLNAME symbols. */
317 #define SF_NORMAL_MASK 0x0000ffff /* bits 12-15 are general purpose. */
319 #define SF_STATICS 0x00001000 /* Mark the .text & all symbols. */
320 #define SF_DEFINED 0x00002000 /* Symbol is defined in this file. */
321 #define SF_STRING 0x00004000 /* Symbol name length > 8. */
322 #define SF_LOCAL 0x00008000 /* Symbol must not be emitted. */
324 #define SF_DEBUG_MASK 0xffff0000 /* bits 16-31 are debug info. */
326 #define SF_FUNCTION 0x00010000 /* The symbol is a function. */
327 #define SF_PROCESS 0x00020000 /* Process symbol before write. */
328 #define SF_TAGGED 0x00040000 /* Is associated with a tag. */
329 #define SF_TAG 0x00080000 /* Is a tag. */
330 #define SF_DEBUG 0x00100000 /* Is in debug or abs section. */
331 #define SF_GET_SEGMENT 0x00200000 /* Get the section of the forward symbol. */
332 /* All other bits are unused. */
335 #define SF_GET(s) (* symbol_get_obj (s))
336 #define SF_GET_DEBUG(s) (symbol_get_bfdsym (s)->flags & BSF_DEBUGGING)
337 #define SF_SET_DEBUG(s) (symbol_get_bfdsym (s)->flags |= BSF_DEBUGGING)
338 #define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK)
339 #define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK)
340 #define SF_GET_FILE(s) (SF_GET (s) & SF_FILE)
341 #define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS)
342 #define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED)
343 #define SF_GET_STRING(s) (SF_GET (s) & SF_STRING)
344 #define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL)
345 #define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION)
346 #define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS)
347 #define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED)
348 #define SF_GET_TAG(s) (SF_GET (s) & SF_TAG)
349 #define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT)
350 #define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* Used by i960. */
351 #define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* Used by i960. */
352 #define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* Used by i960. */
353 #define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* Used by i960. */
354 #define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* Used by i960. */
357 #define SF_SET(s,v) (SF_GET (s) = (v))
358 #define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK))
359 #define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK))
360 #define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE)
361 #define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS)
362 #define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED)
363 #define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING)
364 #define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL)
365 #define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL)
366 #define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION)
367 #define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS)
368 #define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED)
369 #define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG)
370 #define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT)
371 #define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* Used by i960. */
372 #define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* Used by i960. */
373 #define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* Used by i960. */
374 #define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* Used by i960. */
375 #define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* Used by i960. */
378 /* Line number handling. */
379 extern int text_lineno_number
;
380 extern int coff_line_base
;
381 extern int coff_n_line_nos
;
382 extern symbolS
*coff_last_function
;
384 #define obj_emit_lineno(WHERE, LINE, FILE_START) abort ()
385 #define obj_app_file(name, app) c_dot_file_symbol (name, app)
386 #define obj_frob_symbol(S,P) coff_frob_symbol (S, & P)
387 #define obj_frob_section(S) coff_frob_section (S)
388 #define obj_frob_file_after_relocs() coff_frob_file_after_relocs ()
389 #ifndef obj_adjust_symtab
390 #define obj_adjust_symtab() coff_adjust_symtab ()
393 /* Forward the segment of a forwarded symbol, handle assignments that
394 just copy symbol values, etc. */
395 #ifndef OBJ_COPY_SYMBOL_ATTRIBUTES
397 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest, src) \
398 (SF_GET_GET_SEGMENT (dest) \
399 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
402 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest, src) \
403 (SF_GET_GET_SEGMENT (dest) && S_GET_SEGMENT (dest) == SEG_UNKNOWN \
404 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
413 hey
! Where is the C_LEAFSTAT definition
? i960
- coff support is depending on it
.
414 #endif /* no C_LEAFSTAT */
417 #else /* not BFD_ASSEMBLER */
419 #if defined TC_A29K || defined TC_OR32
420 /* Allow translate from aout relocs to coff relocs. */
424 #define RELOC_CONST 3
425 #define RELOC_CONSTH 4
426 #define RELOC_JUMPTARG 5
427 #define RELOC_BASE22 6
430 #define RELOC_BASE13 9
431 #define RELOC_WDISP22 10
432 #define RELOC_WDISP30 11
435 extern const segT N_TYPE_seg
[];
437 /* Magic number of paged executable. */
438 #define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE 0x8300
442 /* Symbol table entry data type. */
447 struct internal_syment ost_entry
;
448 /* Auxiliary entry. */
449 union internal_auxent ost_auxent
[OBJ_COFF_MAX_AUXENTRIES
];
450 /* obj_coff internal use only flags. */
451 unsigned int ost_flags
;
454 /* Symbol table macros and constants. */
456 /* Possible and useful section number in symbol table
457 The values of TEXT, DATA and BSS may not be portable. */
459 #define C_ABS_SECTION N_ABS
460 #define C_UNDEF_SECTION N_UNDEF
461 #define C_DEBUG_SECTION N_DEBUG
462 #define C_NTV_SECTION N_TV
463 #define C_PTV_SECTION P_TV
464 #define C_REGISTER_SECTION 50
466 /* Macros to extract information from a symbol table entry.
467 This syntactic indirection allows independence regarding a.out or coff.
468 The argument (s) of all these macros is a pointer to a symbol table entry. */
471 /* True if the symbol is external. */
472 #define S_IS_EXTERNAL(s) \
473 ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION)
475 /* True if symbol has been defined, ie :
476 section > 0 (DATA, TEXT or BSS)
477 section == 0 and value > 0 (external bss symbol). */
478 #define S_IS_DEFINED(s) \
479 ((s)->sy_symbol.ost_entry.n_scnum > C_UNDEF_SECTION \
480 || ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION \
481 && S_GET_VALUE (s) > 0) \
482 || ((s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION))
484 /* Return true for symbols that should not be reduced to section
485 symbols or eliminated from expressions, because they may be
486 overridden by the linker. */
487 #define S_FORCE_RELOC(s, strict) \
488 (!SEG_NORMAL (S_GET_SEGMENT (s)) || (strict && S_IS_WEAK (s)))
490 /* True if a debug special symbol entry. */
491 #define S_IS_DEBUG(s) \
492 ((s)->sy_symbol.ost_entry.n_scnum == C_DEBUG_SECTION)
494 /* True if a symbol is local symbol name. */
495 /* A symbol name whose name includes ^A is a gas internal pseudo symbol. */
496 #define S_IS_LOCAL(s) \
497 ((s)->sy_symbol.ost_entry.n_scnum == C_REGISTER_SECTION \
498 || (S_LOCAL_NAME(s) && ! flag_keep_locals && ! S_IS_DEBUG (s)) \
499 || strchr (S_GET_NAME (s), '\001') != NULL \
500 || strchr (S_GET_NAME (s), '\002') != NULL \
501 || (flag_strip_local_absolute \
502 && !S_IS_EXTERNAL (s) \
503 && (s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION))
505 /* True if a symbol can be multiply defined (bss symbols have this def
506 though it is bad practice). */
507 #define S_IS_COMMON(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \
508 && S_GET_VALUE (s) != 0)
510 /* True if a symbol name is in the string table, i.e. its length is > 8. */
511 #define S_IS_STRING(s) (strlen (S_GET_NAME (s)) > 8 ? 1 : 0)
513 /* True if a symbol is defined as weak. */
515 #define S_IS_WEAK(s) \
516 ( (s)->sy_symbol.ost_entry.n_sclass == C_NT_WEAK \
517 || (s)->sy_symbol.ost_entry.n_sclass == C_WEAKEXT)
519 #define S_IS_WEAK(s) \
520 ((s)->sy_symbol.ost_entry.n_sclass == C_WEAKEXT)
524 /* The name of the symbol. */
525 #define S_GET_NAME(s) ((char *) (s)->sy_symbol.ost_entry.n_offset)
527 /* The pointer to the string table. */
528 #define S_GET_OFFSET(s) ((s)->sy_symbol.ost_entry.n_offset)
530 /* The numeric value of the segment. */
531 #define S_GET_SEGMENT(s) s_get_segment (s)
534 #define S_GET_DATA_TYPE(s) ((s)->sy_symbol.ost_entry.n_type)
536 /* The storage class. */
537 #define S_GET_STORAGE_CLASS(s) ((s)->sy_symbol.ost_entry.n_sclass)
539 /* The number of auxiliary entries. */
540 #define S_GET_NUMBER_AUXILIARY(s) ((s)->sy_symbol.ost_entry.n_numaux)
543 /* Set the name of the symbol. */
544 #define S_SET_NAME(s, v) \
545 ((s)->sy_symbol.ost_entry.n_offset = (unsigned long) (v))
547 /* Set the offset of the symbol. */
548 #define S_SET_OFFSET(s, v) \
549 ((s)->sy_symbol.ost_entry.n_offset = (v))
551 /* The numeric value of the segment. */
552 #define S_SET_SEGMENT(s, v) \
553 ((s)->sy_symbol.ost_entry.n_scnum = SEGMENT_TO_SYMBOL_TYPE (v))
556 #define S_SET_DATA_TYPE(s, v) \
557 ((s)->sy_symbol.ost_entry.n_type = (v))
559 /* The storage class. */
560 #define S_SET_STORAGE_CLASS(s, v) \
561 ((s)->sy_symbol.ost_entry.n_sclass = (v))
563 /* The number of auxiliary entries. */
564 #define S_SET_NUMBER_AUXILIARY(s, v) \
565 ((s)->sy_symbol.ost_entry.n_numaux = (v))
567 /* Additional modifiers. */
568 /* The symbol is external (does not mean undefined). */
569 #define S_SET_EXTERNAL(s) \
572 S_SET_STORAGE_CLASS (s, C_EXT); \
573 SF_CLEAR_LOCAL (s); \
577 /* Auxiliary entry macros. SA_ stands for symbol auxiliary. */
578 /* Omit the tv related fields. */
580 #define SYM_AUXENT(S) (&(S)->sy_symbol.ost_auxent[0])
582 #define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l)
583 #define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno)
584 #define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size)
585 #define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize)
586 #define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr)
587 #define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l)
588 #define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)])
589 #define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname)
590 #define SA_GET_FILE_FNAME_OFFSET(s) (SYM_AUXENT (s)->x_file.x_n.x_offset)
591 #define SA_GET_FILE_FNAME_ZEROS(s) (SYM_AUXENT (s)->x_file.x_n.x_zeroes)
592 #define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen)
593 #define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc)
594 #define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno)
597 #define SA_SET_SYM_TAGNDX(s,v) (SYM_AUXENT (s)->x_sym.x_tagndx.l = (v))
598 #define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno = (v))
599 #define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size = (v))
600 #define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize = (v))
601 #define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr = (v))
602 #define SA_SET_SYM_ENDNDX(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l = (v))
603 #define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)] = (v))
604 #define SA_SET_FILE_FNAME(s,v) strncpy (SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN)
605 #define SA_SET_FILE_FNAME_OFFSET(s,v) (SYM_AUXENT (s)->x_file.x_n.x_offset = (v))
606 #define SA_SET_FILE_FNAME_ZEROS(s,v) (SYM_AUXENT (s)->x_file.x_n.x_zeroes = (v))
607 #define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen = (v))
608 #define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc = (v))
609 #define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno = (v))
611 /* Internal use only definitions. SF_ stands for symbol flags.
613 These values can be assigned to sy_symbol.ost_flags field of a symbolS.
615 You'll break i960 if you shift the SYSPROC bits anywhere else. for
616 more on the balname/callname hack, see tc-i960.h. b.out is done
619 #define SF_I960_MASK 0x000001ff /* Bits 0-8 are used by the i960 port. */
620 #define SF_SYSPROC 0x0000003f /* bits 0-5 are used to store the sysproc number. */
621 #define SF_IS_SYSPROC 0x00000040 /* bit 6 marks symbols that are sysprocs. */
622 #define SF_BALNAME 0x00000080 /* bit 7 marks BALNAME symbols. */
623 #define SF_CALLNAME 0x00000100 /* bit 8 marks CALLNAME symbols. */
625 #define SF_NORMAL_MASK 0x0000ffff /* bits 12-15 are general purpose. */
627 #define SF_STATICS 0x00001000 /* Mark the .text & all symbols. */
628 #define SF_DEFINED 0x00002000 /* Symbol is defined in this file. */
629 #define SF_STRING 0x00004000 /* Symbol name length > 8. */
630 #define SF_LOCAL 0x00008000 /* Symbol must not be emitted. */
632 #define SF_DEBUG_MASK 0xffff0000 /* bits 16-31 are debug info. */
634 #define SF_FUNCTION 0x00010000 /* The symbol is a function. */
635 #define SF_PROCESS 0x00020000 /* Process symbol before write. */
636 #define SF_TAGGED 0x00040000 /* Is associated with a tag. */
637 #define SF_TAG 0x00080000 /* Is a tag. */
638 #define SF_DEBUG 0x00100000 /* Is in debug or abs section. */
639 #define SF_GET_SEGMENT 0x00200000 /* Get the section of the forward symbol. */
640 #define SF_ADJ_LNNOPTR 0x00400000 /* Has a lnnoptr. */
641 /* All other bits are unused. */
644 #define SF_GET(s) ((s)->sy_symbol.ost_flags)
645 #define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK)
646 #define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK)
647 #define SF_GET_FILE(s) (SF_GET (s) & SF_FILE)
648 #define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS)
649 #define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED)
650 #define SF_GET_STRING(s) (SF_GET (s) & SF_STRING)
651 #define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL)
652 #define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION)
653 #define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS)
654 #define SF_GET_DEBUG(s) (SF_GET (s) & SF_DEBUG)
655 #define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED)
656 #define SF_GET_TAG(s) (SF_GET (s) & SF_TAG)
657 #define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT)
658 #define SF_GET_ADJ_LNNOPTR(s) (SF_GET (s) & SF_ADJ_LNNOPTR)
659 #define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* Used by i960. */
660 #define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* Used by i960. */
661 #define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* Used by i960. */
662 #define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* Used by i960. */
663 #define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* Used by i960. */
666 #define SF_SET(s,v) (SF_GET (s) = (v))
667 #define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK))
668 #define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK))
669 #define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE)
670 #define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS)
671 #define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED)
672 #define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING)
673 #define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL)
674 #define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL)
675 #define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION)
676 #define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS)
677 #define SF_SET_DEBUG(s) (SF_GET (s) |= SF_DEBUG)
678 #define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED)
679 #define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG)
680 #define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT)
681 #define SF_SET_ADJ_LNNOPTR(s) (SF_GET (s) |= SF_ADJ_LNNOPTR)
682 #define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* Used by i960. */
683 #define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* Used by i960. */
684 #define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* Used by i960. */
685 #define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* Used by i960. */
686 #define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* Used by i960. */
688 /* File header macro and type definition. */
690 /* File position calculators. Beware to use them when all the
691 appropriate fields are set in the header. */
693 #ifdef OBJ_COFF_OMIT_OPTIONAL_HEADER
694 #define OBJ_COFF_AOUTHDRSZ (0)
696 #define OBJ_COFF_AOUTHDRSZ (AOUTHDRSZ)
699 #define H_GET_TEXT_FILE_OFFSET(h) \
701 + OBJ_COFF_AOUTHDRSZ \
702 + H_GET_NUMBER_OF_SECTIONS (h) * SCNHSZ)
704 #define H_GET_DATA_FILE_OFFSET(h) \
705 (long) (H_GET_TEXT_FILE_OFFSET (h) \
706 + H_GET_TEXT_SIZE (h))
708 #define H_GET_BSS_FILE_OFFSET(h) 0
710 #define H_GET_RELOCATION_FILE_OFFSET(h) \
711 (long) (H_GET_DATA_FILE_OFFSET (h) \
712 + H_GET_DATA_SIZE (h))
714 #define H_GET_LINENO_FILE_OFFSET(h) \
715 (long) (H_GET_RELOCATION_FILE_OFFSET (h) \
716 + H_GET_RELOCATION_SIZE (h))
718 #define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \
719 (long) (H_GET_LINENO_FILE_OFFSET (h) \
720 + H_GET_LINENO_SIZE (h))
722 #define H_GET_FILE_SIZE(h) \
723 (long) (H_GET_SYMBOL_TABLE_FILE_OFFSET (h) \
724 + H_GET_SYMBOL_TABLE_SIZE (h) \
725 + (h)->string_table_size)
729 #define H_GET_MAGIC_NUMBER(h) ((h)->aouthdr.magic)
730 #define H_GET_VERSION_STAMP(h) ((h)->aouthdr.vstamp)
731 #define H_GET_TEXT_SIZE(h) ((h)->aouthdr.tsize)
732 #define H_GET_DATA_SIZE(h) ((h)->aouthdr.dsize)
733 #define H_GET_BSS_SIZE(h) ((h)->aouthdr.bsize)
734 #define H_GET_ENTRY_POINT(h) ((h)->aouthdr.entry)
735 #define H_GET_TEXT_START(h) ((h)->aouthdr.text_start)
736 #define H_GET_DATA_START(h) ((h)->aouthdr.data_start)
738 #define H_GET_FILE_MAGIC_NUMBER(h) ((h)->filehdr.f_magic)
739 #define H_GET_NUMBER_OF_SECTIONS(h) ((h)->filehdr.f_nscns)
740 #define H_GET_TIME_STAMP(h) ((h)->filehdr.f_timdat)
741 #define H_GET_SYMBOL_TABLE_POINTER(h) ((h)->filehdr.f_symptr)
742 #define H_GET_SYMBOL_COUNT(h) ((h)->filehdr.f_nsyms)
743 #define H_GET_SYMBOL_TABLE_SIZE(h) (H_GET_SYMBOL_COUNT(h) * SYMESZ)
744 #define H_GET_SIZEOF_OPTIONAL_HEADER(h) ((h)->filehdr.f_opthdr)
745 #define H_GET_FLAGS(h) ((h)->filehdr.f_flags)
746 /* Extra fields to achieve bsd a.out compatibility and for convenience. */
747 #define H_GET_RELOCATION_SIZE(h) ((h)->relocation_size)
748 #define H_GET_STRING_SIZE(h) ((h)->string_table_size)
749 #define H_GET_LINENO_SIZE(h) ((h)->lineno_size)
751 #ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
752 #define H_GET_HEADER_SIZE(h) (sizeof (FILHDR) \
754 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
755 #else /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
756 #define H_GET_HEADER_SIZE(h) (sizeof (FILHDR) \
757 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
758 #endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
760 #define H_GET_TEXT_RELOCATION_SIZE(h) (text_section_header.s_nreloc * RELSZ)
761 #define H_GET_DATA_RELOCATION_SIZE(h) (data_section_header.s_nreloc * RELSZ)
765 #define H_SET_MAGIC_NUMBER(h,v) ((h)->aouthdr.magic = (v))
766 #define H_SET_VERSION_STAMP(h,v) ((h)->aouthdr.vstamp = (v))
767 #define H_SET_TEXT_SIZE(h,v) ((h)->aouthdr.tsize = (v))
768 #define H_SET_DATA_SIZE(h,v) ((h)->aouthdr.dsize = (v))
769 #define H_SET_BSS_SIZE(h,v) ((h)->aouthdr.bsize = (v))
770 #define H_SET_ENTRY_POINT(h,v) ((h)->aouthdr.entry = (v))
771 #define H_SET_TEXT_START(h,v) ((h)->aouthdr.text_start = (v))
772 #define H_SET_DATA_START(h,v) ((h)->aouthdr.data_start = (v))
774 #define H_SET_FILE_MAGIC_NUMBER(h,v) ((h)->filehdr.f_magic = (v))
775 #define H_SET_NUMBER_OF_SECTIONS(h,v) ((h)->filehdr.f_nscns = (v))
776 #define H_SET_TIME_STAMP(h,v) ((h)->filehdr.f_timdat = (v))
777 #define H_SET_SYMBOL_TABLE_POINTER(h,v) ((h)->filehdr.f_symptr = (v))
778 #define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->filehdr.f_nsyms = (v))
779 #define H_SET_SIZEOF_OPTIONAL_HEADER(h,v) ((h)->filehdr.f_opthdr = (v))
780 #define H_SET_FLAGS(h,v) ((h)->filehdr.f_flags = (v))
781 /* Extra fields to achieve bsd a.out compatibility and for convenience. */
782 #define H_SET_RELOCATION_SIZE(h,t,d) ((h)->relocation_size = (t)+(d))
783 #define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v))
784 #define H_SET_LINENO_SIZE(h,v) ((h)->lineno_size = (v))
786 /* Segment flipping. */
790 struct internal_aouthdr aouthdr
; /* a.out header. */
791 struct internal_filehdr filehdr
; /* File header, not machine dep. */
792 long string_table_size
; /* names + '\0' + sizeof (int). */
793 long relocation_size
; /* Cumulated size of relocation
794 information for all sections in
796 long lineno_size
; /* Size of the line number information
802 struct bfd_internal_lineno line
;
803 char *frag
; /* Frag to which the line number is related. */
804 struct lineno_list
*next
; /* Forward chain pointer. */
807 #define obj_segment_name(i) (segment_info[(int) (i)].scnhdr.s_name)
809 #define obj_add_segment(s) obj_coff_add_segment (s)
814 hey
! Where is the C_LEAFSTAT definition
? i960
- coff support is depending on it
.
815 #endif /* no C_LEAFSTAT */
818 extern struct internal_scnhdr data_section_header
;
819 extern struct internal_scnhdr text_section_header
;
821 /* Forward the segment of a forwarded symbol. */
822 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
823 (SF_GET_GET_SEGMENT (dest) \
824 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
828 #define obj_handle_link_once(t) obj_coff_pe_handle_link_once (t)
831 #endif /* not BFD_ASSEMBLER */
833 extern const pseudo_typeS coff_pseudo_table
[];
835 #ifndef obj_pop_insert
836 #define obj_pop_insert() pop_insert (coff_pseudo_table)
839 /* In COFF, if a symbol is defined using .def/.val SYM/.endef, it's OK
840 to redefine the symbol later on. This can happen if C symbols use
841 a prefix, and a symbol is defined both with and without the prefix,
842 as in start/_start/__start in gcc/libgcc1-test.c. */
843 #define RESOLVE_SYMBOL_REDEFINITION(sym) \
844 (SF_GET_GET_SEGMENT (sym) \
845 ? (sym->sy_frag = frag_now, \
846 S_SET_VALUE (sym, frag_now_fix ()), \
847 S_SET_SEGMENT (sym, now_seg), \
851 /* Stabs in a coff file go into their own section. */
852 #define SEPARATE_STAB_SECTIONS 1
854 /* We need 12 bytes at the start of the section to hold some initial
856 #define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg)
858 /* Store the number of relocations in the section aux entry. */
859 #define SET_SECTION_RELOCS(sec, relocs, n) \
860 SA_SET_SCN_NRELOC (section_symbol (sec), n)
862 #define obj_app_file(name, app) c_dot_file_symbol (name, app)
865 extern int S_SET_DATA_TYPE (symbolS
*, int);
866 extern int S_SET_STORAGE_CLASS (symbolS
*, int);
867 extern int S_GET_STORAGE_CLASS (symbolS
*);
868 extern void SA_SET_SYM_ENDNDX (symbolS
*, symbolS
*);
869 extern void coff_add_linesym (symbolS
*);
870 extern void c_dot_file_symbol (const char *, int);
871 extern void coff_frob_symbol (symbolS
*, int *);
872 extern void coff_adjust_symtab (void);
873 extern void coff_frob_section (segT
);
874 extern void coff_adjust_section_syms (bfd
*, asection
*, void *);
875 extern void coff_frob_file_after_relocs (void);
877 extern void obj_extra_stuff (object_headers
*);
879 extern void coff_obj_symbol_new_hook (symbolS
*);
880 extern void coff_obj_read_begin_hook (void);
881 extern void obj_coff_section (int);
882 extern segT
obj_coff_add_segment (const char *);
883 extern void obj_coff_section (int);
884 extern void c_dot_file_symbol (const char *, int);
885 extern segT
s_get_segment (symbolS
*);
886 #ifndef tc_coff_symbol_emit_hook
887 extern void tc_coff_symbol_emit_hook (symbolS
*);
889 extern void obj_coff_pe_handle_link_once (void);
890 extern void obj_coff_init_stab_section (segT
);
891 extern void c_section_header (struct internal_scnhdr
*,
892 char *, long, long, long, long,
893 long, long, long, long);
894 #endif /* OBJ_FORMAT_H */