]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/obj-coff.h
Fix support for PECOFF weak symbols
[thirdparty/binutils-gdb.git] / gas / config / obj-coff.h
CommitLineData
252b5132 1/* coff object file format
f7e42eb4 2 Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
977cdf5a 3 1999, 2000, 2002, 2003, 2004
252b5132
RH
4 Free Software Foundation, Inc.
5
6 This file is part of GAS.
7
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)
11 any later version.
12
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.
17
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
21 02111-1307, USA. */
22
23#ifndef OBJ_FORMAT_H
24#define OBJ_FORMAT_H
25
26#define OBJ_COFF 1
27
28#ifndef BFD_ASSEMBLER
29
30#define WORKING_DOT_WORD
31#define WARN_SIGNED_OVERFLOW_WORD
32#define OBJ_COFF_OMIT_OPTIONAL_HEADER
33#define BFD_HEADERS
34#define BFD
35
36#endif
37
38#include "targ-cpu.h"
39
40#include "bfd.h"
41
42/* This internal_lineno crap is to stop namespace pollution from the
dcd619be 43 bfd internal coff headerfile. */
252b5132
RH
44#define internal_lineno bfd_internal_lineno
45#include "coff/internal.h"
46#undef internal_lineno
47
48/* CPU-specific setup: */
49
50#ifdef TC_ARM
51#include "coff/arm.h"
52#ifndef TARGET_FORMAT
53#define TARGET_FORMAT "coff-arm"
54#endif
55#endif
56
57#ifdef TC_PPC
58#ifdef TE_PE
59#include "coff/powerpc.h"
60#else
61#include "coff/rs6000.h"
62#endif
63#endif
64
65#ifdef TC_SPARC
66#include "coff/sparc.h"
67#endif
68
69#ifdef TC_I386
70#include "coff/i386.h"
71
72#ifdef TE_PE
73#define TARGET_FORMAT "pe-i386"
74#endif
75
76#ifndef TARGET_FORMAT
77#define TARGET_FORMAT "coff-i386"
78#endif
79#endif
80
81#ifdef TC_M68K
82#include "coff/m68k.h"
83#ifndef TARGET_FORMAT
84#define TARGET_FORMAT "coff-m68k"
85#endif
86#endif
87
88#ifdef TC_A29K
89#include "coff/a29k.h"
90#define TARGET_FORMAT "coff-a29k-big"
91#endif
92
3b16e843
NC
93#ifdef TC_OR32
94#include "coff/or32.h"
95#define TARGET_FORMAT "coff-or32-big"
96#endif
97
252b5132
RH
98#ifdef TC_I960
99#include "coff/i960.h"
100#define TARGET_FORMAT "coff-Intel-little"
101#endif
102
103#ifdef TC_Z8K
104#include "coff/z8k.h"
105#define TARGET_FORMAT "coff-z8k"
106#endif
107
108#ifdef TC_H8300
109#include "coff/h8300.h"
110#define TARGET_FORMAT "coff-h8300"
111#endif
112
113#ifdef TC_H8500
114#include "coff/h8500.h"
115#define TARGET_FORMAT "coff-h8500"
116#endif
117
118#ifdef TC_SH
056350c6
NC
119
120#ifdef TE_PE
121#define COFF_WITH_PE
122#endif
123
252b5132 124#include "coff/sh.h"
056350c6
NC
125
126#ifdef TE_PE
127#define TARGET_FORMAT "pe-shl"
128#else
94f592af 129
252b5132 130#define TARGET_FORMAT \
a245a9aa 131 (!target_big_endian \
252b5132
RH
132 ? (sh_small ? "coff-shl-small" : "coff-shl") \
133 : (sh_small ? "coff-sh-small" : "coff-sh"))
94f592af 134
252b5132 135#endif
056350c6
NC
136#endif
137
138#ifdef TC_MIPS
139#define COFF_WITH_PE
140#include "coff/mipspe.h"
141#undef TARGET_FORMAT
142#define TARGET_FORMAT "pe-mips"
143#endif
252b5132
RH
144
145#ifdef TC_M88K
146#include "coff/m88k.h"
147#define TARGET_FORMAT "coff-m88kbcs"
148#endif
149
150#ifdef TC_W65
151#include "coff/w65.h"
152#define TARGET_FORMAT "coff-w65"
153#endif
154
155#ifdef TC_TIC30
156#include "coff/tic30.h"
157#define TARGET_FORMAT "coff-tic30"
158#endif
159
026df7c5
NC
160#ifdef TC_TIC4X
161#include "coff/tic4x.h"
be33c5dd 162#define TARGET_FORMAT "coff2-tic4x"
026df7c5
NC
163#endif
164
39bec121
TW
165#ifdef TC_TIC54X
166#include "coff/tic54x.h"
167#define TARGET_FORMAT "coff1-c54x"
168#endif
169
252b5132
RH
170#ifdef TC_TIC80
171#include "coff/tic80.h"
172#define TARGET_FORMAT "coff-tic80"
173#define ALIGNMENT_IN_S_FLAGS 1
174#endif
175
176#ifdef TC_MCORE
177#include "coff/mcore.h"
178#ifndef TARGET_FORMAT
179#define TARGET_FORMAT "pe-mcore"
180#endif
181#endif
182
977cdf5a
NC
183#ifdef TE_PE
184/* PE weak symbols need USE_UNIQUE. */
185#define USE_UNIQUE 1
186#endif
187
252b5132
RH
188/* Targets may also set this. Also, if BFD_ASSEMBLER is defined, this
189 will already have been defined. */
977cdf5a 190#undef SYMBOLS_NEED_BACKPOINTERS
252b5132
RH
191#define SYMBOLS_NEED_BACKPOINTERS 1
192
193#ifndef OBJ_COFF_MAX_AUXENTRIES
194#define OBJ_COFF_MAX_AUXENTRIES 1
977cdf5a 195#endif
252b5132 196
49309057 197extern void coff_obj_symbol_new_hook PARAMS ((symbolS *));
252b5132
RH
198#define obj_symbol_new_hook coff_obj_symbol_new_hook
199
200extern void coff_obj_read_begin_hook PARAMS ((void));
201#define obj_read_begin_hook coff_obj_read_begin_hook
202
3b16e843 203/* This file really contains two implementations of the COFF back end.
252b5132
RH
204 They are in the process of being merged, but this is only a
205 preliminary, mechanical merging. Many definitions that are
206 identical between the two are still found in both versions.
207
208 The first version, with BFD_ASSEMBLER defined, uses high-level BFD
209 interfaces and data structures. The second version, with
210 BFD_ASSEMBLER not defined, also uses BFD, but mostly for swapping
211 data structures and for doing the actual I/O. The latter defines
212 the preprocessor symbols BFD and BFD_HEADERS. Try not to let this
213 confuse you.
214
215 These two are in the process of being merged, and eventually the
216 BFD_ASSEMBLER version should take over completely. Release timing
217 issues and namespace problems convinced me to merge the two
218 together in this fashion, a little sooner than I would have liked.
219 The real merge should be much better done by the time the next
220 release comes out.
221
222 For now, the structure of this file is:
223 <common>
224 #ifdef BFD_ASSEMBLER
225 <one version>
226 #else
227 <other version>
228 #endif
229 <common>
230 Unfortunately, the common portions are very small at the moment,
231 and many declarations or definitions are duplicated. The structure
232 of obj-coff.c is similar.
233
234 See doc/internals.texi for a brief discussion of the history, if
235 you care.
236
3b16e843 237 Ken Raeburn, 5 May 1994. */
252b5132
RH
238
239#ifdef BFD_ASSEMBLER
240
241#include "bfd/libcoff.h"
242
243#define OUTPUT_FLAVOR bfd_target_coff_flavour
244
245/* SYMBOL TABLE */
246
247/* Alter the field names, for now, until we've fixed up the other
248 references to use the new name. */
249#ifdef TC_I960
49309057 250#define TC_SYMFIELD_TYPE symbolS *
252b5132
RH
251#define sy_tc bal
252#endif
253
254#define OBJ_SYMFIELD_TYPE unsigned long
255#define sy_obj sy_flags
256
a161fe53
AM
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)
261#endif
262
49309057
ILT
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])
252b5132
RH
267
268#define DO_NOT_STRIP 0
269
270extern void obj_coff_section PARAMS ((int));
271
3b16e843 272/* The number of auxiliary entries. */
49309057
ILT
273#define S_GET_NUMBER_AUXILIARY(s) \
274 (coffsymbol (symbol_get_bfdsym (s))->native->u.syment.n_numaux)
3b16e843 275/* The number of auxiliary entries. */
252b5132
RH
276#define S_SET_NUMBER_AUXILIARY(s,v) (S_GET_NUMBER_AUXILIARY (s) = (v))
277
dcd619be 278/* True if a symbol name is in the string table, i.e. its length is > 8. */
252b5132
RH
279#define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0)
280
49309057
ILT
281extern int S_SET_DATA_TYPE PARAMS ((symbolS *, int));
282extern int S_SET_STORAGE_CLASS PARAMS ((symbolS *, int));
283extern int S_GET_STORAGE_CLASS PARAMS ((symbolS *));
284extern void SA_SET_SYM_ENDNDX PARAMS ((symbolS *, symbolS *));
252b5132 285
3b16e843
NC
286/* Auxiliary entry macros. SA_ stands for symbol auxiliary. */
287/* Omit the tv related fields. */
288/* Accessors. */
252b5132
RH
289
290#define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l)
291#define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno)
292#define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size)
293#define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize)
294#define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr)
295#define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx)
296#define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)])
297#define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname)
298#define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen)
299#define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc)
300#define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno)
301
302#define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno=(v))
303#define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size=(v))
304#define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize=(v))
305#define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr=(v))
306#define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v))
307#define SA_SET_FILE_FNAME(s,v) strncpy(SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN)
308#define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen=(v))
309#define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc=(v))
310#define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno=(v))
311
3b16e843 312/* Internal use only definitions. SF_ stands for symbol flags.
5d6255fe 313
3b16e843 314 These values can be assigned to sy_symbol.ost_flags field of a symbolS.
5d6255fe 315
3b16e843
NC
316 You'll break i960 if you shift the SYSPROC bits anywhere else. for
317 more on the balname/callname hack, see tc-i960.h. b.out is done
318 differently. */
252b5132 319
dcd619be 320#define SF_I960_MASK (0x000001ff) /* Bits 0-8 are used by the i960 port. */
252b5132
RH
321#define SF_SYSPROC (0x0000003f) /* bits 0-5 are used to store the sysproc number */
322#define SF_IS_SYSPROC (0x00000040) /* bit 6 marks symbols that are sysprocs */
323#define SF_BALNAME (0x00000080) /* bit 7 marks BALNAME symbols */
324#define SF_CALLNAME (0x00000100) /* bit 8 marks CALLNAME symbols */
325
dcd619be 326#define SF_NORMAL_MASK (0x0000ffff) /* bits 12-15 are general purpose. */
252b5132
RH
327
328#define SF_STATICS (0x00001000) /* Mark the .text & all symbols */
329#define SF_DEFINED (0x00002000) /* Symbol is defined in this file */
330#define SF_STRING (0x00004000) /* Symbol name length > 8 */
331#define SF_LOCAL (0x00008000) /* Symbol must not be emitted */
332
333#define SF_DEBUG_MASK (0xffff0000) /* bits 16-31 are debug info */
334
335#define SF_FUNCTION (0x00010000) /* The symbol is a function */
336#define SF_PROCESS (0x00020000) /* Process symbol before write */
337#define SF_TAGGED (0x00040000) /* Is associated with a tag */
338#define SF_TAG (0x00080000) /* Is a tag */
339#define SF_DEBUG (0x00100000) /* Is in debug or abs section */
dcd619be
KH
340#define SF_GET_SEGMENT (0x00200000) /* Get the section of the forward symbol. */
341/* All other bits are unused. */
252b5132 342
3b16e843 343/* Accessors. */
49309057
ILT
344#define SF_GET(s) (*symbol_get_obj (s))
345#define SF_GET_DEBUG(s) (symbol_get_bfdsym (s)->flags & BSF_DEBUGGING)
346#define SF_SET_DEBUG(s) (symbol_get_bfdsym (s)->flags |= BSF_DEBUGGING)
252b5132
RH
347#define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK)
348#define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK)
349#define SF_GET_FILE(s) (SF_GET (s) & SF_FILE)
350#define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS)
351#define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED)
352#define SF_GET_STRING(s) (SF_GET (s) & SF_STRING)
353#define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL)
354#define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION)
355#define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS)
356#define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED)
357#define SF_GET_TAG(s) (SF_GET (s) & SF_TAG)
358#define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT)
359#define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* used by i960 */
360#define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* used by i960 */
361#define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* used by i960 */
362#define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* used by i960 */
363#define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* used by i960 */
364
3b16e843 365/* Modifiers. */
252b5132 366#define SF_SET(s,v) (SF_GET (s) = (v))
814f6641 367#define SF_SET_NORMAL_FIELD(s,v) (SF_GET (s) |= ((v) & SF_NORMAL_MASK))
252b5132
RH
368#define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK))
369#define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE)
370#define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS)
371#define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED)
372#define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING)
373#define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL)
374#define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL)
375#define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION)
376#define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS)
377#define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED)
378#define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG)
379#define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT)
380#define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* used by i960 */
381#define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* used by i960 */
382#define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* used by i960 */
383#define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* used by i960 */
384#define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* used by i960 */
385
386/* -------------- Line number handling ------- */
387extern int text_lineno_number;
388extern int coff_line_base;
389extern int coff_n_line_nos;
390
391#define obj_emit_lineno(WHERE,LINE,FILE_START) abort ()
49309057 392extern void coff_add_linesym PARAMS ((symbolS *));
252b5132 393
5110c57e 394void c_dot_file_symbol PARAMS ((const char *filename));
252b5132
RH
395#define obj_app_file c_dot_file_symbol
396
49309057 397extern void coff_frob_symbol PARAMS ((symbolS *, int *));
252b5132
RH
398extern void coff_adjust_symtab PARAMS ((void));
399extern void coff_frob_section PARAMS ((segT));
400extern void coff_adjust_section_syms PARAMS ((bfd *, asection *, PTR));
401extern void coff_frob_file_after_relocs PARAMS ((void));
402#define obj_frob_symbol(S,P) coff_frob_symbol(S,&P)
403#ifndef obj_adjust_symtab
404#define obj_adjust_symtab() coff_adjust_symtab()
405#endif
406#define obj_frob_section(S) coff_frob_section (S)
407#define obj_frob_file_after_relocs() coff_frob_file_after_relocs ()
408
49309057 409extern symbolS *coff_last_function;
252b5132
RH
410
411/* Forward the segment of a forwarded symbol, handle assignments that
412 just copy symbol values, etc. */
2c1c4c62 413#ifndef OBJ_COPY_SYMBOL_ATTRIBUTES
252b5132
RH
414#ifndef TE_I386AIX
415#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
416 (SF_GET_GET_SEGMENT (dest) \
417 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
418 : 0)
419#else
420#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
421 (SF_GET_GET_SEGMENT (dest) && S_GET_SEGMENT (dest) == SEG_UNKNOWN \
422 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
423 : 0)
424#endif
2c1c4c62 425#endif
252b5132 426
3b16e843 427/* Sanity check. */
252b5132
RH
428
429#ifdef TC_I960
430#ifndef C_LEAFSTAT
431hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it.
432#endif /* no C_LEAFSTAT */
433#endif /* TC_I960 */
434
435#else /* not BFD_ASSEMBLER */
436
3b16e843
NC
437#if defined TC_A29K || defined TC_OR32
438/* Allow translate from aout relocs to coff relocs. */
252b5132
RH
439#define NO_RELOC 20
440#define RELOC_32 1
441#define RELOC_8 2
442#define RELOC_CONST 3
443#define RELOC_CONSTH 4
444#define RELOC_JUMPTARG 5
445#define RELOC_BASE22 6
446#define RELOC_HI22 7
447#define RELOC_LO10 8
448#define RELOC_BASE13 9
449#define RELOC_WDISP22 10
450#define RELOC_WDISP30 11
451#endif
452
453extern const segT N_TYPE_seg[];
454
dcd619be 455/* Magic number of paged executable. */
252b5132
RH
456#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE 0x8300
457
252b5132
RH
458/* SYMBOL TABLE */
459
3b16e843 460/* Symbol table entry data type. */
252b5132
RH
461
462typedef struct
463{
464 /* Basic symbol */
465 struct internal_syment ost_entry;
dcd619be 466 /* Auxiliary entry. */
252b5132 467 union internal_auxent ost_auxent[OBJ_COFF_MAX_AUXENTRIES];
3b16e843 468 /* obj_coff internal use only flags. */
252b5132
RH
469 unsigned int ost_flags;
470} obj_symbol_type;
471
472#ifndef DO_NOT_STRIP
473#define DO_NOT_STRIP 0
474#endif
3b16e843 475/* Symbol table macros and constants. */
252b5132 476
aaa2624b 477/* Possible and useful section number in symbol table
3b16e843 478 The values of TEXT, DATA and BSS may not be portable. */
252b5132
RH
479
480#define C_ABS_SECTION N_ABS
481#define C_UNDEF_SECTION N_UNDEF
482#define C_DEBUG_SECTION N_DEBUG
483#define C_NTV_SECTION N_TV
484#define C_PTV_SECTION P_TV
485#define C_REGISTER_SECTION 50
486
3b16e843 487/* Macros to extract information from a symbol table entry.
aaa2624b 488 This syntactic indirection allows independence regarding a.out or coff.
3b16e843 489 The argument (s) of all these macros is a pointer to a symbol table entry. */
252b5132 490
3b16e843
NC
491/* Predicates. */
492/* True if the symbol is external. */
a161fe53
AM
493#define S_IS_EXTERNAL(s) \
494 ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION)
495
252b5132
RH
496/* True if symbol has been defined, ie :
497 section > 0 (DATA, TEXT or BSS)
3b16e843 498 section == 0 and value > 0 (external bss symbol). */
252b5132
RH
499#define S_IS_DEFINED(s) \
500 ((s)->sy_symbol.ost_entry.n_scnum > C_UNDEF_SECTION \
501 || ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION \
502 && S_GET_VALUE (s) > 0) \
503 || ((s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION))
a161fe53
AM
504
505/* Return true for symbols that should not be reduced to section
506 symbols or eliminated from expressions, because they may be
507 overridden by the linker. */
ae6063d4
AM
508#define S_FORCE_RELOC(s, strict) \
509 (!SEG_NORMAL (S_GET_SEGMENT (s)) || (strict && S_IS_WEAK (s)))
a161fe53 510
3b16e843 511/* True if a debug special symbol entry. */
a161fe53
AM
512#define S_IS_DEBUG(s) \
513 ((s)->sy_symbol.ost_entry.n_scnum == C_DEBUG_SECTION)
514
3b16e843
NC
515/* True if a symbol is local symbol name. */
516/* A symbol name whose name includes ^A is a gas internal pseudo symbol. */
252b5132
RH
517#define S_IS_LOCAL(s) \
518 ((s)->sy_symbol.ost_entry.n_scnum == C_REGISTER_SECTION \
519 || (S_LOCAL_NAME(s) && ! flag_keep_locals && ! S_IS_DEBUG (s)) \
520 || strchr (S_GET_NAME (s), '\001') != NULL \
521 || strchr (S_GET_NAME (s), '\002') != NULL \
522 || (flag_strip_local_absolute \
523 && !S_IS_EXTERNAL(s) \
524 && (s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION))
a161fe53 525
3b16e843 526/* True if a symbol is not defined in this file. */
252b5132
RH
527#define S_IS_EXTERN(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \
528 && S_GET_VALUE (s) == 0)
a161fe53 529
3b16e843
NC
530/* True if a symbol can be multiply defined (bss symbols have this def
531 though it is bad practice). */
252b5132
RH
532#define S_IS_COMMON(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \
533 && S_GET_VALUE (s) != 0)
a161fe53 534
dcd619be 535/* True if a symbol name is in the string table, i.e. its length is > 8. */
252b5132
RH
536#define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0)
537
538/* True if a symbol is defined as weak. */
539#ifdef TE_PE
540#define S_IS_WEAK(s) \
541 ((s)->sy_symbol.ost_entry.n_sclass == C_NT_WEAK \
542 || (s)->sy_symbol.ost_entry.n_sclass == C_WEAKEXT)
543#else
544#define S_IS_WEAK(s) \
545 ((s)->sy_symbol.ost_entry.n_sclass == C_WEAKEXT)
546#endif
547
3b16e843
NC
548/* Accessors. */
549/* The name of the symbol. */
814f6641 550#define S_GET_NAME(s) ((char*) (s)->sy_symbol.ost_entry.n_offset)
a161fe53 551
3b16e843 552/* The pointer to the string table. */
252b5132 553#define S_GET_OFFSET(s) ((s)->sy_symbol.ost_entry.n_offset)
a161fe53 554
3b16e843 555/* The numeric value of the segment. */
252b5132 556#define S_GET_SEGMENT(s) s_get_segment(s)
a161fe53 557
3b16e843 558/* The data type. */
252b5132 559#define S_GET_DATA_TYPE(s) ((s)->sy_symbol.ost_entry.n_type)
a161fe53 560
3b16e843 561/* The storage class. */
252b5132 562#define S_GET_STORAGE_CLASS(s) ((s)->sy_symbol.ost_entry.n_sclass)
a161fe53 563
3b16e843 564/* The number of auxiliary entries. */
252b5132
RH
565#define S_GET_NUMBER_AUXILIARY(s) ((s)->sy_symbol.ost_entry.n_numaux)
566
3b16e843
NC
567/* Modifiers. */
568/* Set the name of the symbol. */
a161fe53
AM
569#define S_SET_NAME(s,v) \
570 ((s)->sy_symbol.ost_entry.n_offset = (unsigned long) (v))
571
3b16e843 572/* Set the offset of the symbol. */
a161fe53
AM
573#define S_SET_OFFSET(s,v) \
574 ((s)->sy_symbol.ost_entry.n_offset = (v))
575
3b16e843 576/* The numeric value of the segment. */
a161fe53
AM
577#define S_SET_SEGMENT(s,v) \
578 ((s)->sy_symbol.ost_entry.n_scnum = SEGMENT_TO_SYMBOL_TYPE(v))
579
3b16e843 580/* The data type. */
a161fe53
AM
581#define S_SET_DATA_TYPE(s,v) \
582 ((s)->sy_symbol.ost_entry.n_type = (v))
583
3b16e843 584/* The storage class. */
a161fe53
AM
585#define S_SET_STORAGE_CLASS(s,v) \
586 ((s)->sy_symbol.ost_entry.n_sclass = (v))
587
3b16e843 588/* The number of auxiliary entries. */
a161fe53
AM
589#define S_SET_NUMBER_AUXILIARY(s,v) \
590 ((s)->sy_symbol.ost_entry.n_numaux = (v))
252b5132 591
3b16e843
NC
592/* Additional modifiers. */
593/* The symbol is external (does not mean undefined). */
a161fe53
AM
594#define S_SET_EXTERNAL(s) \
595 { S_SET_STORAGE_CLASS(s, C_EXT) ; SF_CLEAR_LOCAL(s); }
252b5132 596
3b16e843
NC
597/* Auxiliary entry macros. SA_ stands for symbol auxiliary. */
598/* Omit the tv related fields. */
599/* Accessors. */
252b5132
RH
600#define SYM_AUXENT(S) (&(S)->sy_symbol.ost_auxent[0])
601
602#define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l)
603#define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno)
604#define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size)
605#define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize)
606#define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr)
607#define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l)
608#define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)])
609#define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname)
610#define SA_GET_FILE_FNAME_OFFSET(s) (SYM_AUXENT (s)->x_file.x_n.x_offset)
611#define SA_GET_FILE_FNAME_ZEROS(s) (SYM_AUXENT (s)->x_file.x_n.x_zeroes)
612#define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen)
613#define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc)
614#define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno)
615
3b16e843 616/* Modifiers. */
252b5132
RH
617#define SA_SET_SYM_TAGNDX(s,v) (SYM_AUXENT (s)->x_sym.x_tagndx.l=(v))
618#define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno=(v))
619#define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size=(v))
620#define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize=(v))
621#define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr=(v))
622#define SA_SET_SYM_ENDNDX(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l=(v))
623#define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v))
624#define SA_SET_FILE_FNAME(s,v) strncpy(SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN)
625#define SA_SET_FILE_FNAME_OFFSET(s,v) (SYM_AUXENT (s)->x_file.x_n.x_offset=(v))
626#define SA_SET_FILE_FNAME_ZEROS(s,v) (SYM_AUXENT (s)->x_file.x_n.x_zeroes=(v))
627#define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen=(v))
628#define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc=(v))
629#define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno=(v))
630
3b16e843 631/* Internal use only definitions. SF_ stands for symbol flags.
5d6255fe 632
3b16e843 633 These values can be assigned to sy_symbol.ost_flags field of a symbolS.
5d6255fe 634
3b16e843
NC
635 You'll break i960 if you shift the SYSPROC bits anywhere else. for
636 more on the balname/callname hack, see tc-i960.h. b.out is done
637 differently. */
252b5132 638
dcd619be 639#define SF_I960_MASK (0x000001ff) /* Bits 0-8 are used by the i960 port. */
252b5132
RH
640#define SF_SYSPROC (0x0000003f) /* bits 0-5 are used to store the sysproc number */
641#define SF_IS_SYSPROC (0x00000040) /* bit 6 marks symbols that are sysprocs */
642#define SF_BALNAME (0x00000080) /* bit 7 marks BALNAME symbols */
643#define SF_CALLNAME (0x00000100) /* bit 8 marks CALLNAME symbols */
644
dcd619be 645#define SF_NORMAL_MASK (0x0000ffff) /* bits 12-15 are general purpose. */
252b5132
RH
646
647#define SF_STATICS (0x00001000) /* Mark the .text & all symbols */
648#define SF_DEFINED (0x00002000) /* Symbol is defined in this file */
649#define SF_STRING (0x00004000) /* Symbol name length > 8 */
650#define SF_LOCAL (0x00008000) /* Symbol must not be emitted */
651
652#define SF_DEBUG_MASK (0xffff0000) /* bits 16-31 are debug info */
653
654#define SF_FUNCTION (0x00010000) /* The symbol is a function */
655#define SF_PROCESS (0x00020000) /* Process symbol before write */
656#define SF_TAGGED (0x00040000) /* Is associated with a tag */
657#define SF_TAG (0x00080000) /* Is a tag */
658#define SF_DEBUG (0x00100000) /* Is in debug or abs section */
dcd619be 659#define SF_GET_SEGMENT (0x00200000) /* Get the section of the forward symbol. */
252b5132 660#define SF_ADJ_LNNOPTR (0x00400000) /* Has a lnnoptr */
dcd619be 661/* All other bits are unused. */
252b5132 662
3b16e843 663/* Accessors. */
252b5132
RH
664#define SF_GET(s) ((s)->sy_symbol.ost_flags)
665#define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK)
666#define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK)
667#define SF_GET_FILE(s) (SF_GET (s) & SF_FILE)
668#define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS)
669#define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED)
670#define SF_GET_STRING(s) (SF_GET (s) & SF_STRING)
671#define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL)
672#define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION)
673#define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS)
674#define SF_GET_DEBUG(s) (SF_GET (s) & SF_DEBUG)
675#define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED)
676#define SF_GET_TAG(s) (SF_GET (s) & SF_TAG)
677#define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT)
678#define SF_GET_ADJ_LNNOPTR(s) (SF_GET (s) & SF_ADJ_LNNOPTR)
679#define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* used by i960 */
680#define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* used by i960 */
681#define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* used by i960 */
682#define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* used by i960 */
683#define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* used by i960 */
684
3b16e843 685/* Modifiers. */
252b5132 686#define SF_SET(s,v) (SF_GET (s) = (v))
814f6641 687#define SF_SET_NORMAL_FIELD(s,v) (SF_GET (s) |= ((v) & SF_NORMAL_MASK))
252b5132
RH
688#define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK))
689#define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE)
690#define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS)
691#define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED)
692#define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING)
693#define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL)
694#define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL)
695#define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION)
696#define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS)
697#define SF_SET_DEBUG(s) (SF_GET (s) |= SF_DEBUG)
698#define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED)
699#define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG)
700#define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT)
701#define SF_SET_ADJ_LNNOPTR(s) (SF_GET (s) |= SF_ADJ_LNNOPTR)
702#define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* used by i960 */
703#define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* used by i960 */
704#define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* used by i960 */
705#define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* used by i960 */
706#define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* used by i960 */
707
3b16e843 708/* File header macro and type definition. */
252b5132 709
3b16e843
NC
710/* File position calculators. Beware to use them when all the
711 appropriate fields are set in the header. */
252b5132
RH
712
713#ifdef OBJ_COFF_OMIT_OPTIONAL_HEADER
714#define OBJ_COFF_AOUTHDRSZ (0)
715#else
716#define OBJ_COFF_AOUTHDRSZ (AOUTHDRSZ)
717#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
718
719#define H_GET_FILE_SIZE(h) \
814f6641 720 (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \
252b5132
RH
721 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
722 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
723 H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h) + \
724 H_GET_SYMBOL_TABLE_SIZE(h) + \
725 (h)->string_table_size)
726#define H_GET_TEXT_FILE_OFFSET(h) \
814f6641 727 (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \
252b5132
RH
728 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ)
729#define H_GET_DATA_FILE_OFFSET(h) \
814f6641 730 (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \
252b5132
RH
731 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
732 H_GET_TEXT_SIZE(h))
733#define H_GET_BSS_FILE_OFFSET(h) 0
734#define H_GET_RELOCATION_FILE_OFFSET(h) \
814f6641 735 (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \
252b5132
RH
736 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
737 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h))
738#define H_GET_LINENO_FILE_OFFSET(h) \
814f6641 739 (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \
252b5132
RH
740 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
741 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
742 H_GET_RELOCATION_SIZE(h))
743#define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \
814f6641 744 (long) (FILHSZ + OBJ_COFF_AOUTHDRSZ + \
252b5132
RH
745 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
746 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
747 H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h))
748
3b16e843
NC
749/* Accessors. */
750/* aouthdr. */
252b5132
RH
751#define H_GET_MAGIC_NUMBER(h) ((h)->aouthdr.magic)
752#define H_GET_VERSION_STAMP(h) ((h)->aouthdr.vstamp)
753#define H_GET_TEXT_SIZE(h) ((h)->aouthdr.tsize)
754#define H_GET_DATA_SIZE(h) ((h)->aouthdr.dsize)
755#define H_GET_BSS_SIZE(h) ((h)->aouthdr.bsize)
756#define H_GET_ENTRY_POINT(h) ((h)->aouthdr.entry)
757#define H_GET_TEXT_START(h) ((h)->aouthdr.text_start)
758#define H_GET_DATA_START(h) ((h)->aouthdr.data_start)
3b16e843 759/* filehdr. */
252b5132
RH
760#define H_GET_FILE_MAGIC_NUMBER(h) ((h)->filehdr.f_magic)
761#define H_GET_NUMBER_OF_SECTIONS(h) ((h)->filehdr.f_nscns)
762#define H_GET_TIME_STAMP(h) ((h)->filehdr.f_timdat)
763#define H_GET_SYMBOL_TABLE_POINTER(h) ((h)->filehdr.f_symptr)
764#define H_GET_SYMBOL_COUNT(h) ((h)->filehdr.f_nsyms)
765#define H_GET_SYMBOL_TABLE_SIZE(h) (H_GET_SYMBOL_COUNT(h) * SYMESZ)
766#define H_GET_SIZEOF_OPTIONAL_HEADER(h) ((h)->filehdr.f_opthdr)
767#define H_GET_FLAGS(h) ((h)->filehdr.f_flags)
3b16e843 768/* Extra fields to achieve bsd a.out compatibility and for convenience. */
252b5132
RH
769#define H_GET_RELOCATION_SIZE(h) ((h)->relocation_size)
770#define H_GET_STRING_SIZE(h) ((h)->string_table_size)
771#define H_GET_LINENO_SIZE(h) ((h)->lineno_size)
772
773#ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
814f6641
KH
774#define H_GET_HEADER_SIZE(h) (sizeof (FILHDR) \
775 + sizeof (AOUTHDR)\
252b5132
RH
776 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
777#else /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
814f6641 778#define H_GET_HEADER_SIZE(h) (sizeof (FILHDR) \
252b5132
RH
779 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
780#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
781
782#define H_GET_TEXT_RELOCATION_SIZE(h) (text_section_header.s_nreloc * RELSZ)
783#define H_GET_DATA_RELOCATION_SIZE(h) (data_section_header.s_nreloc * RELSZ)
784
3b16e843
NC
785/* Modifiers. */
786/* aouthdr. */
252b5132
RH
787#define H_SET_MAGIC_NUMBER(h,v) ((h)->aouthdr.magic = (v))
788#define H_SET_VERSION_STAMP(h,v) ((h)->aouthdr.vstamp = (v))
789#define H_SET_TEXT_SIZE(h,v) ((h)->aouthdr.tsize = (v))
790#define H_SET_DATA_SIZE(h,v) ((h)->aouthdr.dsize = (v))
791#define H_SET_BSS_SIZE(h,v) ((h)->aouthdr.bsize = (v))
792#define H_SET_ENTRY_POINT(h,v) ((h)->aouthdr.entry = (v))
793#define H_SET_TEXT_START(h,v) ((h)->aouthdr.text_start = (v))
794#define H_SET_DATA_START(h,v) ((h)->aouthdr.data_start = (v))
3b16e843 795/* filehdr. */
252b5132
RH
796#define H_SET_FILE_MAGIC_NUMBER(h,v) ((h)->filehdr.f_magic = (v))
797#define H_SET_NUMBER_OF_SECTIONS(h,v) ((h)->filehdr.f_nscns = (v))
798#define H_SET_TIME_STAMP(h,v) ((h)->filehdr.f_timdat = (v))
799#define H_SET_SYMBOL_TABLE_POINTER(h,v) ((h)->filehdr.f_symptr = (v))
800#define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->filehdr.f_nsyms = (v))
801#define H_SET_SIZEOF_OPTIONAL_HEADER(h,v) ((h)->filehdr.f_opthdr = (v))
802#define H_SET_FLAGS(h,v) ((h)->filehdr.f_flags = (v))
aaa2624b 803/* Extra fields to achieve bsd a.out compatibility and for convenience. */
252b5132
RH
804#define H_SET_RELOCATION_SIZE(h,t,d) ((h)->relocation_size = (t)+(d))
805#define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v))
806#define H_SET_LINENO_SIZE(h,v) ((h)->lineno_size = (v))
807
3b16e843 808/* Segment flipping. */
252b5132
RH
809
810typedef struct
811{
812 struct internal_aouthdr aouthdr; /* a.out header */
dcd619be 813 struct internal_filehdr filehdr; /* File header, not machine dep. */
3b16e843
NC
814 long string_table_size; /* names + '\0' + sizeof (int) */
815 long relocation_size; /* Cumulated size of relocation
816 information for all sections in
817 bytes. */
818 long lineno_size; /* Size of the line number information
819 table in bytes. */
252b5132
RH
820} object_headers;
821
252b5132
RH
822struct lineno_list
823{
824 struct bfd_internal_lineno line;
3b16e843
NC
825 char *frag; /* Frag to which the line number is related. */
826 struct lineno_list *next; /* Forward chain pointer. */
252b5132
RH
827};
828
252b5132
RH
829#define obj_segment_name(i) (segment_info[(int) (i)].scnhdr.s_name)
830
831#define obj_add_segment(s) obj_coff_add_segment (s)
832
833extern segT obj_coff_add_segment PARAMS ((const char *));
834
835extern void obj_coff_section PARAMS ((int));
836
837extern void c_dot_file_symbol PARAMS ((char *filename));
838#define obj_app_file c_dot_file_symbol
839extern void obj_extra_stuff PARAMS ((object_headers * headers));
840
49309057 841extern segT s_get_segment PARAMS ((symbolS *ptr));
252b5132
RH
842
843extern void c_section_header PARAMS ((struct internal_scnhdr * header,
844 char *name,
845 long core_address,
846 long size,
847 long data_ptr,
848 long reloc_ptr,
849 long lineno_ptr,
850 long reloc_number,
851 long lineno_number,
852 long alignment));
853
854#ifndef tc_coff_symbol_emit_hook
49309057 855void tc_coff_symbol_emit_hook PARAMS ((symbolS *));
252b5132
RH
856#endif
857
3b16e843 858/* Sanity check. */
252b5132
RH
859
860#ifdef TC_I960
861#ifndef C_LEAFSTAT
862hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it.
863#endif /* no C_LEAFSTAT */
864#endif /* TC_I960 */
865extern struct internal_scnhdr data_section_header;
866extern struct internal_scnhdr text_section_header;
867
868/* Forward the segment of a forwarded symbol. */
869#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
870 (SF_GET_GET_SEGMENT (dest) \
871 ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \
872 : 0)
873
874#ifdef TE_PE
875#define obj_handle_link_once(t) obj_coff_pe_handle_link_once (t)
876extern void obj_coff_pe_handle_link_once ();
877#endif
878
879#endif /* not BFD_ASSEMBLER */
880
4c63da97
AM
881extern const pseudo_typeS coff_pseudo_table[];
882
883#ifndef obj_pop_insert
884#define obj_pop_insert() pop_insert (coff_pseudo_table)
885#endif
886
252b5132
RH
887/* In COFF, if a symbol is defined using .def/.val SYM/.endef, it's OK
888 to redefine the symbol later on. This can happen if C symbols use
889 a prefix, and a symbol is defined both with and without the prefix,
890 as in start/_start/__start in gcc/libgcc1-test.c. */
891#define RESOLVE_SYMBOL_REDEFINITION(sym) \
892(SF_GET_GET_SEGMENT (sym) \
893 ? (sym->sy_frag = frag_now, \
894 S_SET_VALUE (sym, frag_now_fix ()), \
895 S_SET_SEGMENT (sym, now_seg), \
896 0) \
897 : 0)
898
899/* Stabs in a coff file go into their own section. */
900#define SEPARATE_STAB_SECTIONS 1
901
902/* We need 12 bytes at the start of the section to hold some initial
903 information. */
904extern void obj_coff_init_stab_section PARAMS ((segT));
905#define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg)
906
945a1a6b
ILT
907/* Store the number of relocations in the section aux entry. */
908#define SET_SECTION_RELOCS(sec, relocs, n) \
909 SA_SET_SCN_NRELOC (section_symbol (sec), n)
910
252b5132 911#endif /* OBJ_FORMAT_H */