Wed Dec 30 12:46:30 1992 Ian Lance Taylor (ian@cygnus.com)
[deliverable/binutils-gdb.git] / gas / config / obj-coffbfd.h
CommitLineData
355afbcd 1
db40ba14 2/* coff object file format
01170860 3 Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
355afbcd 4
a39116f1 5 This file is part of GAS.
355afbcd 6
a39116f1
RP
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
355afbcd 11
a39116f1
RP
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
355afbcd 16
a39116f1
RP
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
db40ba14 20
01170860
RP
21#ifndef OBJ_FORMAT_H
22#define OBJ_FORMAT_H
23
db40ba14
SC
24#define OBJ_COFF 1
25
3ad9ec6a 26#define WORKING_DOT_WORD
e41474b7 27#define WARN_SIGNED_OVERFLOW_WORD
3ad9ec6a 28
db40ba14
SC
29#include "targ-cpu.h"
30
31#include "bfd.h"
32
db40ba14
SC
33/* This internal_lineno crap is to stop namespace pollution from the
34 bfd internal coff headerfile. */
35
36#define internal_lineno bfd_internal_lineno
37#include "coff/internal.h"
38#undef internal_lineno
2cb0bdc7
SC
39
40#ifdef TC_Z8K
163107a1
SC
41#include "coff/z8k.h"
42#define TARGET_FORMAT "coff-z8k"
2cb0bdc7
SC
43#endif
44
45#ifdef C_H8300
db40ba14
SC
46#include "coff/h8300.h"
47#define TARGET_FORMAT "coff-h8300"
2cb0bdc7
SC
48#endif
49
50#ifdef TC_M68K
3ad9ec6a
ILT
51#include "coff/m68k.h"
52#define TARGET_FORMAT "coff-m68k"
2cb0bdc7 53#endif
3ad9ec6a 54
2cb0bdc7 55#ifdef TC_I386
28c8c50b
SC
56#include "coff/i386.h"
57#define TARGET_FORMAT "coff-i386"
2cb0bdc7
SC
58#endif
59
60#ifdef TC_A29K
db40ba14
SC
61#include "coff/a29k.h"
62#define TARGET_FORMAT "coff-a29k-big"
c593cf41
SC
63
64/* Allow translate from aout relocs to coff relocs */
65#define NO_RELOC 20
66#define RELOC_32 1
67#define RELOC_8 2
68#define RELOC_CONST 3
69#define RELOC_CONSTH 4
70#define RELOC_JUMPTARG 5
71#define RELOC_BASE22 6
72#define RELOC_HI22 7
73#define RELOC_LO10 8
74#define RELOC_BASE13 9
75#define RELOC_WDISP22 10
76#define RELOC_WDISP30 11
db40ba14 77#endif
355afbcd 78
355afbcd 79
2cb0bdc7 80
355afbcd 81
db40ba14
SC
82#ifndef OBJ_COFF_MAX_AUXENTRIES
83#define OBJ_COFF_MAX_AUXENTRIES 1
84#endif /* OBJ_COFF_MAX_AUXENTRIES */
355afbcd
KR
85
86
87extern const segT N_TYPE_seg[];
db40ba14
SC
88
89/* Magic number of paged executable. */
90#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE 0x8300
91
92
93/* SYMBOL TABLE */
94
a39116f1 95/* targets may also set this */
db40ba14
SC
96#ifndef SYMBOLS_NEED_BACKPOINTERS
97#define SYMBOLS_NEED_BACKPOINTERS 1
98#endif /* SYMBOLS_NEED_BACKPOINTERS */
99
100/* Symbol table entry data type */
101
355afbcd 102typedef struct
db40ba14 103{
355afbcd
KR
104 struct internal_syment ost_entry; /* Basic symbol */
105 union internal_auxent ost_auxent[OBJ_COFF_MAX_AUXENTRIES]; /* Auxiliary entry. */
106
107 unsigned int ost_flags; /* obj_coff internal use only flags */
108}
109
110obj_symbol_type;
db40ba14 111
410e67eb 112#ifndef DO_NOT_STRIP
db40ba14
SC
113#define DO_NOT_STRIP 0
114#define DO_STRIP 1
410e67eb 115#endif
db40ba14
SC
116/* Symbol table macros and constants */
117
355afbcd 118/* Possible and usefull section number in symbol table
db40ba14
SC
119 * The values of TEXT, DATA and BSS may not be portable.
120 */
121
122#define C_ABS_SECTION N_ABS
123#define C_UNDEF_SECTION N_UNDEF
124#define C_DEBUG_SECTION N_DEBUG
125#define C_NTV_SECTION N_TV
126#define C_PTV_SECTION P_TV
127#define C_REGISTER_SECTION 20
128
129/*
130 * Macros to extract information from a symbol table entry.
131 * This syntaxic indirection allows independence regarding a.out or coff.
132 * The argument (s) of all these macros is a pointer to a symbol table entry.
133 */
134
135/* Predicates */
136/* True if the symbol is external */
137#define S_IS_EXTERNAL(s) ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION)
138/* True if symbol has been defined, ie :
a39116f1
RP
139 section > 0 (DATA, TEXT or BSS)
140 section == 0 and value > 0 (external bss symbol) */
db40ba14
SC
141#define S_IS_DEFINED(s) ((s)->sy_symbol.ost_entry.n_scnum > C_UNDEF_SECTION || \
142 ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION && \
143 (s)->sy_symbol.ost_entry.n_value > 0))
144/* True if a debug special symbol entry */
145#define S_IS_DEBUG(s) ((s)->sy_symbol.ost_entry.n_scnum == C_DEBUG_SECTION)
146/* True if a symbol is local symbol name */
147/* A symbol name whose name begin with ^A is a gas internal pseudo symbol */
148#define S_IS_LOCAL(s) (S_GET_NAME(s)[0] == '\001' || \
149 (s)->sy_symbol.ost_entry.n_scnum == C_REGISTER_SECTION || \
150 (S_LOCAL_NAME(s) && !flagseen['L']))
151/* True if a symbol is not defined in this file */
152#define S_IS_EXTERN(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 && (s)->sy_symbol.ost_entry.n_value == 0)
153/*
154 * True if a symbol can be multiply defined (bss symbols have this def
155 * though it is bad practice)
156 */
157#define S_IS_COMMON(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 && (s)->sy_symbol.ost_entry.n_value != 0)
158/* True if a symbol name is in the string table, i.e. its length is > 8. */
159#define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0)
160
161/* Accessors */
162/* The name of the symbol */
163#define S_GET_NAME(s) ((char*)(s)->sy_symbol.ost_entry.n_offset)
164/* The pointer to the string table */
165#define S_GET_OFFSET(s) ((s)->sy_symbol.ost_entry.n_offset)
166/* The zeroes if symbol name is longer than 8 chars */
167#define S_GET_ZEROES(s) ((s)->sy_symbol.ost_entry.n_zeroes)
168/* The value of the symbol */
355afbcd 169#define S_GET_VALUE(s) ((unsigned) ((s)->sy_symbol.ost_entry.n_value))
db40ba14
SC
170/* The numeric value of the segment */
171#define S_GET_SEGMENT(s) s_get_segment(s)
172/* The data type */
173#define S_GET_DATA_TYPE(s) ((s)->sy_symbol.ost_entry.n_type)
174/* The storage class */
175#define S_GET_STORAGE_CLASS(s) ((s)->sy_symbol.ost_entry.n_sclass)
176/* The number of auxiliary entries */
177#define S_GET_NUMBER_AUXILIARY(s) ((s)->sy_symbol.ost_entry.n_numaux)
178
179/* Modifiers */
180/* Set the name of the symbol */
181#define S_SET_NAME(s,v) ((s)->sy_symbol.ost_entry.n_offset = (unsigned long)(v))
182/* Set the offset of the symbol */
183#define S_SET_OFFSET(s,v) ((s)->sy_symbol.ost_entry.n_offset = (v))
184/* The zeroes if symbol name is longer than 8 chars */
185#define S_SET_ZEROES(s,v) ((s)->sy_symbol.ost_entry.n_zeroes = (v))
186/* Set the value of the symbol */
187#define S_SET_VALUE(s,v) ((s)->sy_symbol.ost_entry.n_value = (v))
188/* The numeric value of the segment */
189#define S_SET_SEGMENT(s,v) ((s)->sy_symbol.ost_entry.n_scnum = SEGMENT_TO_SYMBOL_TYPE(v))
190/* The data type */
191#define S_SET_DATA_TYPE(s,v) ((s)->sy_symbol.ost_entry.n_type = (v))
192/* The storage class */
193#define S_SET_STORAGE_CLASS(s,v) ((s)->sy_symbol.ost_entry.n_sclass = (v))
194/* The number of auxiliary entries */
195#define S_SET_NUMBER_AUXILIARY(s,v) ((s)->sy_symbol.ost_entry.n_numaux = (v))
196
197/* Additional modifiers */
198/* The symbol is external (does not mean undefined) */
199#define S_SET_EXTERNAL(s) { S_SET_STORAGE_CLASS(s, C_EXT) ; SF_CLEAR_LOCAL(s); }
200
201/* Auxiliary entry macros. SA_ stands for symbol auxiliary */
202/* Omit the tv related fields */
203/* Accessors */
204#ifdef BFD_HEADERS
205#define SA_GET_SYM_TAGNDX(s) ((s)->sy_symbol.ost_auxent[0].x_sym.x_tagndx.l)
206#else
207#define SA_GET_SYM_TAGNDX(s) ((s)->sy_symbol.ost_auxent[0].x_sym.x_tagndx)
208#endif
209#define SA_GET_SYM_LNNO(s) ((s)->sy_symbol.ost_auxent[0].x_sym.x_misc.x_lnsz.x_lnno)
210#define SA_GET_SYM_SIZE(s) ((s)->sy_symbol.ost_auxent[0].x_sym.x_misc.x_lnsz.x_size)
211#define SA_GET_SYM_FSIZE(s) ((s)->sy_symbol.ost_auxent[0].x_sym.x_misc.x_fsize)
212#define SA_GET_SYM_LNNOPTR(s) ((s)->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_fcn.x_lnnoptr)
213#ifdef BFD_HEADERS
214#define SA_GET_SYM_ENDNDX(s) ((s)->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_fcn.x_endndx.l)
215#else
216#define SA_GET_SYM_ENDNDX(s) ((s)->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_fcn.x_endndx)
217#endif
218#define SA_GET_SYM_DIMEN(s,i) ((s)->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen[(i)])
219#define SA_GET_FILE_FNAME(s) ((s)->sy_symbol.ost_auxent[0].x_file.x_fname)
220#define SA_GET_SCN_SCNLEN(s) ((s)->sy_symbol.ost_auxent[0].x_scn.x_scnlen)
221#define SA_GET_SCN_NRELOC(s) ((s)->sy_symbol.ost_auxent[0].x_scn.x_nreloc)
222#define SA_GET_SCN_NLINNO(s) ((s)->sy_symbol.ost_auxent[0].x_scn.x_nlinno)
223
224/* Modifiers */
225#ifdef BFD_HEADERS
226#define SA_SET_SYM_TAGNDX(s,v) ((s)->sy_symbol.ost_auxent[0].x_sym.x_tagndx.l=(v))
227#else
228#define SA_SET_SYM_TAGNDX(s,v) ((s)->sy_symbol.ost_auxent[0].x_sym.x_tagndx=(v))
229#endif
230#define SA_SET_SYM_LNNO(s,v) ((s)->sy_symbol.ost_auxent[0].x_sym.x_misc.x_lnsz.x_lnno=(v))
231#define SA_SET_SYM_SIZE(s,v) ((s)->sy_symbol.ost_auxent[0].x_sym.x_misc.x_lnsz.x_size=(v))
232#define SA_SET_SYM_FSIZE(s,v) ((s)->sy_symbol.ost_auxent[0].x_sym.x_misc.x_fsize=(v))
233#define SA_SET_SYM_LNNOPTR(s,v) ((s)->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_fcn.x_lnnoptr=(v))
234#ifdef BFD_HEADERS
235#define SA_SET_SYM_ENDNDX(s,v) ((s)->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_fcn.x_endndx.l=(v))
236#else
237#define SA_SET_SYM_ENDNDX(s,v) ((s)->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_fcn.x_endndx=(v))
238#endif
239#define SA_SET_SYM_DIMEN(s,i,v) ((s)->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v))
240#define SA_SET_FILE_FNAME(s,v) strncpy((s)->sy_symbol.ost_auxent[0].x_file.x_fname,(v),FILNMLEN)
241#define SA_SET_SCN_SCNLEN(s,v) ((s)->sy_symbol.ost_auxent[0].x_scn.x_scnlen=(v))
242#define SA_SET_SCN_NRELOC(s,v) ((s)->sy_symbol.ost_auxent[0].x_scn.x_nreloc=(v))
243#define SA_SET_SCN_NLINNO(s,v) ((s)->sy_symbol.ost_auxent[0].x_scn.x_nlinno=(v))
244
245/*
246 * Internal use only definitions. SF_ stands for symbol flags.
247 *
248 * These values can be assigned to sy_symbol.ost_flags field of a symbolS.
249 *
250 * You'll break i960 if you shift the SYSPROC bits anywhere else. for
251 * more on the balname/callname hack, see tc-i960.h. b.out is done
252 * differently.
253 */
254
355afbcd
KR
255#define SF_I960_MASK (0x000001ff) /* Bits 0-8 are used by the i960 port. */
256#define SF_SYSPROC (0x0000003f) /* bits 0-5 are used to store the sysproc number */
257#define SF_IS_SYSPROC (0x00000040) /* bit 6 marks symbols that are sysprocs */
258#define SF_BALNAME (0x00000080) /* bit 7 marks BALNAME symbols */
259#define SF_CALLNAME (0x00000100) /* bit 8 marks CALLNAME symbols */
db40ba14 260
355afbcd 261#define SF_NORMAL_MASK (0x0000ffff) /* bits 12-15 are general purpose. */
db40ba14 262
355afbcd
KR
263#define SF_STATICS (0x00001000) /* Mark the .text & all symbols */
264#define SF_DEFINED (0x00002000) /* Symbol is defined in this file */
265#define SF_STRING (0x00004000) /* Symbol name length > 8 */
266#define SF_LOCAL (0x00008000) /* Symbol must not be emitted */
db40ba14 267
355afbcd 268#define SF_DEBUG_MASK (0xffff0000) /* bits 16-31 are debug info */
db40ba14 269
355afbcd
KR
270#define SF_FUNCTION (0x00010000) /* The symbol is a function */
271#define SF_PROCESS (0x00020000) /* Process symbol before write */
272#define SF_TAGGED (0x00040000) /* Is associated with a tag */
273#define SF_TAG (0x00080000) /* Is a tag */
274#define SF_DEBUG (0x00100000) /* Is in debug or abs section */
275#define SF_GET_SEGMENT (0x00200000) /* Get the section of the forward symbol. */
a39116f1 276/* All other bits are unused. */
db40ba14
SC
277
278/* Accessors */
279#define SF_GET(s) ((s)->sy_symbol.ost_flags)
280#define SF_GET_NORMAL_FIELD(s) ((s)->sy_symbol.ost_flags & SF_NORMAL_MASK)
281#define SF_GET_DEBUG_FIELD(s) ((s)->sy_symbol.ost_flags & SF_DEBUG_MASK)
282#define SF_GET_FILE(s) ((s)->sy_symbol.ost_flags & SF_FILE)
283#define SF_GET_STATICS(s) ((s)->sy_symbol.ost_flags & SF_STATICS)
284#define SF_GET_DEFINED(s) ((s)->sy_symbol.ost_flags & SF_DEFINED)
285#define SF_GET_STRING(s) ((s)->sy_symbol.ost_flags & SF_STRING)
286#define SF_GET_LOCAL(s) ((s)->sy_symbol.ost_flags & SF_LOCAL)
287#define SF_GET_FUNCTION(s) ((s)->sy_symbol.ost_flags & SF_FUNCTION)
288#define SF_GET_PROCESS(s) ((s)->sy_symbol.ost_flags & SF_PROCESS)
289#define SF_GET_DEBUG(s) ((s)->sy_symbol.ost_flags & SF_DEBUG)
290#define SF_GET_TAGGED(s) ((s)->sy_symbol.ost_flags & SF_TAGGED)
291#define SF_GET_TAG(s) ((s)->sy_symbol.ost_flags & SF_TAG)
292#define SF_GET_GET_SEGMENT(s) ((s)->sy_symbol.ost_flags & SF_GET_SEGMENT)
355afbcd
KR
293#define SF_GET_I960(s) ((s)->sy_symbol.ost_flags & SF_I960_MASK) /* used by i960 */
294#define SF_GET_BALNAME(s) ((s)->sy_symbol.ost_flags & SF_BALNAME) /* used by i960 */
295#define SF_GET_CALLNAME(s) ((s)->sy_symbol.ost_flags & SF_CALLNAME) /* used by i960 */
296#define SF_GET_IS_SYSPROC(s) ((s)->sy_symbol.ost_flags & SF_IS_SYSPROC) /* used by i960 */
297#define SF_GET_SYSPROC(s) ((s)->sy_symbol.ost_flags & SF_SYSPROC) /* used by i960 */
db40ba14
SC
298
299/* Modifiers */
300#define SF_SET(s,v) ((s)->sy_symbol.ost_flags = (v))
301#define SF_SET_NORMAL_FIELD(s,v)((s)->sy_symbol.ost_flags |= ((v) & SF_NORMAL_MASK))
302#define SF_SET_DEBUG_FIELD(s,v) ((s)->sy_symbol.ost_flags |= ((v) & SF_DEBUG_MASK))
303#define SF_SET_FILE(s) ((s)->sy_symbol.ost_flags |= SF_FILE)
304#define SF_SET_STATICS(s) ((s)->sy_symbol.ost_flags |= SF_STATICS)
305#define SF_SET_DEFINED(s) ((s)->sy_symbol.ost_flags |= SF_DEFINED)
306#define SF_SET_STRING(s) ((s)->sy_symbol.ost_flags |= SF_STRING)
307#define SF_SET_LOCAL(s) ((s)->sy_symbol.ost_flags |= SF_LOCAL)
308#define SF_CLEAR_LOCAL(s) ((s)->sy_symbol.ost_flags &= ~SF_LOCAL)
309#define SF_SET_FUNCTION(s) ((s)->sy_symbol.ost_flags |= SF_FUNCTION)
310#define SF_SET_PROCESS(s) ((s)->sy_symbol.ost_flags |= SF_PROCESS)
311#define SF_SET_DEBUG(s) ((s)->sy_symbol.ost_flags |= SF_DEBUG)
312#define SF_SET_TAGGED(s) ((s)->sy_symbol.ost_flags |= SF_TAGGED)
313#define SF_SET_TAG(s) ((s)->sy_symbol.ost_flags |= SF_TAG)
314#define SF_SET_GET_SEGMENT(s) ((s)->sy_symbol.ost_flags |= SF_GET_SEGMENT)
355afbcd
KR
315#define SF_SET_I960(s,v) ((s)->sy_symbol.ost_flags |= ((v) & SF_I960_MASK)) /* used by i960 */
316#define SF_SET_BALNAME(s) ((s)->sy_symbol.ost_flags |= SF_BALNAME) /* used by i960 */
317#define SF_SET_CALLNAME(s) ((s)->sy_symbol.ost_flags |= SF_CALLNAME) /* used by i960 */
318#define SF_SET_IS_SYSPROC(s) ((s)->sy_symbol.ost_flags |= SF_IS_SYSPROC) /* used by i960 */
319#define SF_SET_SYSPROC(s,v) ((s)->sy_symbol.ost_flags |= ((v) & SF_SYSPROC)) /* used by i960 */
db40ba14
SC
320
321/* File header macro and type definition */
322
323/*
324 * File position calculators. Beware to use them when all the
325 * appropriate fields are set in the header.
326 */
327
328#ifdef OBJ_COFF_OMIT_OPTIONAL_HEADER
329#define OBJ_COFF_AOUTHDRSZ (0)
330#else
331#define OBJ_COFF_AOUTHDRSZ (AOUTHDRSZ)
332#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
333
334#define H_GET_FILE_SIZE(h) \
335 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
336 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
337 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
338 H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h) + \
339 H_GET_SYMBOL_TABLE_SIZE(h) + \
340 (h)->string_table_size)
341#define H_GET_TEXT_FILE_OFFSET(h) \
342 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
343 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ)
344#define H_GET_DATA_FILE_OFFSET(h) \
345 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
346 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
347 H_GET_TEXT_SIZE(h))
348#define H_GET_BSS_FILE_OFFSET(h) 0
349#define H_GET_RELOCATION_FILE_OFFSET(h) \
350 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
351 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
352 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h))
353#define H_GET_LINENO_FILE_OFFSET(h) \
354 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
355 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
356 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
357 H_GET_RELOCATION_SIZE(h))
358#define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \
359 (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \
360 H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
361 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
362 H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h))
363
364/* Accessors */
365/* aouthdr */
366#define H_GET_MAGIC_NUMBER(h) ((h)->aouthdr.magic)
367#define H_GET_VERSION_STAMP(h) ((h)->aouthdr.vstamp)
368#define H_GET_TEXT_SIZE(h) ((h)->aouthdr.tsize)
369#define H_GET_DATA_SIZE(h) ((h)->aouthdr.dsize)
370#define H_GET_BSS_SIZE(h) ((h)->aouthdr.bsize)
371#define H_GET_ENTRY_POINT(h) ((h)->aouthdr.entry)
372#define H_GET_TEXT_START(h) ((h)->aouthdr.text_start)
373#define H_GET_DATA_START(h) ((h)->aouthdr.data_start)
374/* filehdr */
375#define H_GET_FILE_MAGIC_NUMBER(h) ((h)->filehdr.f_magic)
376#define H_GET_NUMBER_OF_SECTIONS(h) ((h)->filehdr.f_nscns)
377#define H_GET_TIME_STAMP(h) ((h)->filehdr.f_timdat)
378#define H_GET_SYMBOL_TABLE_POINTER(h) ((h)->filehdr.f_symptr)
379#define H_GET_SYMBOL_COUNT(h) ((h)->filehdr.f_nsyms)
380#define H_GET_SYMBOL_TABLE_SIZE(h) (H_GET_SYMBOL_COUNT(h) * SYMESZ)
381#define H_GET_SIZEOF_OPTIONAL_HEADER(h) ((h)->filehdr.f_opthdr)
382#define H_GET_FLAGS(h) ((h)->filehdr.f_flags)
383/* Extra fields to achieve bsd a.out compatibility and for convenience */
384#define H_GET_RELOCATION_SIZE(h) ((h)->relocation_size)
385#define H_GET_STRING_SIZE(h) ((h)->string_table_size)
386#define H_GET_LINENO_SIZE(h) ((h)->lineno_size)
387
388#ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER
389#define H_GET_HEADER_SIZE(h) (sizeof(FILHDR) \
390 + sizeof(AOUTHDR)\
391 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
392#else /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
393#define H_GET_HEADER_SIZE(h) (sizeof(FILHDR) \
394 + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ))
395#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */
396
397#define H_GET_TEXT_RELOCATION_SIZE(h) (text_section_header.s_nreloc * RELSZ)
398#define H_GET_DATA_RELOCATION_SIZE(h) (data_section_header.s_nreloc * RELSZ)
399
400/* Modifiers */
401/* aouthdr */
402#define H_SET_MAGIC_NUMBER(h,v) ((h)->aouthdr.magic = (v))
403#define H_SET_VERSION_STAMP(h,v) ((h)->aouthdr.vstamp = (v))
404#define H_SET_TEXT_SIZE(h,v) ((h)->aouthdr.tsize = (v))
405#define H_SET_DATA_SIZE(h,v) ((h)->aouthdr.dsize = (v))
406#define H_SET_BSS_SIZE(h,v) ((h)->aouthdr.bsize = (v))
407#define H_SET_ENTRY_POINT(h,v) ((h)->aouthdr.entry = (v))
408#define H_SET_TEXT_START(h,v) ((h)->aouthdr.text_start = (v))
409#define H_SET_DATA_START(h,v) ((h)->aouthdr.data_start = (v))
410/* filehdr */
411#define H_SET_FILE_MAGIC_NUMBER(h,v) ((h)->filehdr.f_magic = (v))
412#define H_SET_NUMBER_OF_SECTIONS(h,v) ((h)->filehdr.f_nscns = (v))
413#define H_SET_TIME_STAMP(h,v) ((h)->filehdr.f_timdat = (v))
414#define H_SET_SYMBOL_TABLE_POINTER(h,v) ((h)->filehdr.f_symptr = (v))
415#define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->filehdr.f_nsyms = (v))
416#define H_SET_SIZEOF_OPTIONAL_HEADER(h,v) ((h)->filehdr.f_opthdr = (v))
417#define H_SET_FLAGS(h,v) ((h)->filehdr.f_flags = (v))
418/* Extra fields to achieve bsd a.out compatibility and for convinience */
419#define H_SET_RELOCATION_SIZE(h,t,d) ((h)->relocation_size = (t)+(d))
420#define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v))
421#define H_SET_LINENO_SIZE(h,v) ((h)->lineno_size = (v))
422
a39116f1 423/* Segment flipping */
db40ba14
SC
424#define segment_name(v) (seg_name[(int) (v)])
425
355afbcd
KR
426typedef struct
427 {
db40ba14 428#ifdef BFD_HEADERS
355afbcd
KR
429 struct internal_aouthdr aouthdr; /* a.out header */
430 struct internal_filehdr filehdr; /* File header, not machine dep. */
db40ba14 431#else
355afbcd
KR
432 AOUTHDR aouthdr; /* a.out header */
433 FILHDR filehdr; /* File header, not machine dep. */
db40ba14 434#endif
355afbcd
KR
435 long string_table_size; /* names + '\0' + sizeof(int) */
436 long relocation_size; /* Cumulated size of relocation
db40ba14
SC
437 information for all sections in
438 bytes. */
355afbcd 439 long lineno_size; /* Size of the line number information
db40ba14 440 table in bytes */
355afbcd
KR
441 }
442
443object_headers;
db40ba14
SC
444
445
446
447struct lineno_list
448{
355afbcd
KR
449
450 struct bfd_internal_lineno line;
451 char *frag; /* Frag to which the line number is related */
452 struct lineno_list *next; /* Forward chain pointer */
453};
db40ba14
SC
454
455
456
457
a39116f1 458/* stack stuff */
355afbcd
KR
459typedef struct
460 {
461 unsigned long chunk_size;
462 unsigned long element_size;
463 unsigned long size;
464 char *data;
465 unsigned long pointer;
466 }
467
468stack;
469
db40ba14
SC
470
471
355afbcd
KR
472char *EXFUN (stack_pop, (stack * st));
473char *EXFUN (stack_push, (stack * st, char *element));
474char *EXFUN (stack_top, (stack * st));
475stack *EXFUN (stack_init, (unsigned long chunk_size, unsigned long element_size));
476void EXFUN (c_dot_file_symbol, (char *filename));
477void EXFUN (obj_extra_stuff, (object_headers * headers));
478void EXFUN (stack_delete, (stack * st));
db40ba14 479
db40ba14
SC
480
481
355afbcd 482void EXFUN (c_section_header, (
db40ba14 483
355afbcd
KR
484 struct internal_scnhdr * header,
485 char *name,
486 long core_address,
487 long size,
488 long data_ptr,
489 long reloc_ptr,
490 long lineno_ptr,
491 long reloc_number,
492 long lineno_number,
493 long alignment));
db40ba14
SC
494
495
a39116f1 496/* sanity check */
db40ba14
SC
497
498#ifdef TC_I960
499#ifndef C_LEAFSTAT
355afbcd 500hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it.
db40ba14
SC
501#endif /* no C_LEAFSTAT */
502#endif /* TC_I960 */
503#ifdef BFD_HEADERS
355afbcd 504extern struct internal_scnhdr data_section_header;
db40ba14
SC
505extern struct internal_scnhdr text_section_header;
506#else
507extern SCNHDR data_section_header;
508extern SCNHDR text_section_header;
509#endif
a39116f1
RP
510#endif
511
db40ba14
SC
512/*
513 * Local Variables:
514 * comment-column: 0
515 * fill-column: 131
516 * End:
517 */
518
8b228fe9 519/* end of obj-coffbfd.h */
This page took 0.068638 seconds and 4 git commands to generate.