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