obj-aout.h revision 78828
1168404Spjd/* obj-aout.h, a.out object file format for gas, the assembler.
2168404Spjd   Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000
3168404Spjd   Free Software Foundation, Inc.
4168404Spjd
5168404Spjd   This file is part of GAS, the GNU Assembler.
6168404Spjd
7168404Spjd   GAS is free software; you can redistribute it and/or modify
8168404Spjd   it under the terms of the GNU General Public License as
9168404Spjd   published by the Free Software Foundation; either version 2,
10168404Spjd   or (at your option) any later version.
11168404Spjd
12168404Spjd   GAS is distributed in the hope that it will be useful, but
13168404Spjd   WITHOUT ANY WARRANTY; without even the implied warranty of
14168404Spjd   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
15168404Spjd   the GNU General Public License for more details.
16168404Spjd
17168404Spjd   You should have received a copy of the GNU General Public License
18168404Spjd   along with GAS; see the file COPYING.  If not, write to the Free
19168404Spjd   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20168404Spjd   02111-1307, USA.  */
21168404Spjd
22168404Spjd/* Tag to validate a.out object file format processing */
23219089Spjd#define OBJ_AOUT 1
24229578Smm
25249643Smm#include "targ-cpu.h"
26248369Smm
27168404Spjd#ifdef BFD_ASSEMBLER
28168404Spjd
29168404Spjd#include "bfd/libaout.h"
30168404Spjd
31168404Spjd#define OUTPUT_FLAVOR bfd_target_aout_flavour
32168404Spjd
33168404Spjd#else /* ! BFD_ASSEMBLER */
34168404Spjd
35168404Spjd#ifndef VMS
36168404Spjd#include "aout_gnu.h"		/* Needed to define struct nlist. Sigh.  */
37168404Spjd#else
38168404Spjd#include "a_out.h"
39168404Spjd#endif
40168404Spjd
41168404Spjd#ifndef AOUT_MACHTYPE
42168404Spjd#define AOUT_MACHTYPE 0
43185029Spjd#endif /* AOUT_MACHTYPE */
44213197Smm
45219089Spjdextern const short seg_N_TYPE[];
46251419Ssmhextern const segT N_TYPE_seg[];
47168404Spjd
48168404Spjd#ifndef DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE
49168404Spjd#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE	(OMAGIC)
50168404Spjd#endif /* DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE */
51168404Spjd
52168404Spjd#endif /* ! BFD_ASSEMBLER */
53168404Spjd
54168404Spjdextern const pseudo_typeS aout_pseudo_table[];
55262081Savg
56262081Savg#ifndef obj_pop_insert
57262081Savg#define obj_pop_insert() pop_insert (aout_pseudo_table)
58262081Savg#endif
59262081Savg
60262081Savg/* SYMBOL TABLE */
61262081Savg/* Symbol table entry data type */
62262081Savg
63262081Savgtypedef struct nlist obj_symbol_type;	/* Symbol table entry */
64262081Savg
65262081Savg/* Symbol table macros and constants */
66262081Savg
67262081Savg#ifdef BFD_ASSEMBLER
68262081Savg
69262081Savg#define S_SET_OTHER(S,V) \
70262081Savg  (aout_symbol (symbol_get_bfdsym (S))->other = (V))
71262081Savg#define S_SET_TYPE(S,T) \
72262081Savg  (aout_symbol (symbol_get_bfdsym (S))->type = (T))
73262081Savg#define S_SET_DESC(S,D)	\
74262081Savg  (aout_symbol (symbol_get_bfdsym (S))->desc = (D))
75262081Savg#define S_GET_OTHER(S) \
76262081Savg  (aout_symbol (symbol_get_bfdsym (S))->other)
77262081Savg#define S_GET_TYPE(S) \
78262081Savg  (aout_symbol (symbol_get_bfdsym (S))->type)
79262081Savg#define S_GET_DESC(S) \
80262081Savg  (aout_symbol (symbol_get_bfdsym (S))->desc)
81262081Savg
82262081Savgasection *text_section, *data_section, *bss_section;
83262081Savg
84262081Savg#define obj_frob_symbol(S,PUNT)	obj_aout_frob_symbol (S, &PUNT)
85262081Savg#define obj_frob_file()		obj_aout_frob_file ()
86262081Savgextern void obj_aout_frob_symbol PARAMS ((symbolS *, int *));
87262081Savgextern void obj_aout_frob_file PARAMS ((void));
88262081Savg
89262081Savg#define obj_sec_sym_ok_for_reloc(SEC)	(1)
90262081Savg
91262081Savg#else
92262081Savg
93262081Savg/* We use the sy_obj field to record whether a symbol is weak.  */
94262081Savg#define OBJ_SYMFIELD_TYPE char
95262081Savg
96262081Savg/*
97262081Savg *  Macros to extract information from a symbol table entry.
98262081Savg *  This syntaxic indirection allows independence regarding a.out or coff.
99262081Savg *  The argument (s) of all these macros is a pointer to a symbol table entry.
100168404Spjd */
101168404Spjd
102168404Spjd/* True if the symbol is external */
103168404Spjd#define S_IS_EXTERNAL(s)	((s)->sy_symbol.n_type & N_EXT)
104168404Spjd
105168404Spjd/* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */
106168404Spjd#define S_IS_DEFINED(s) \
107168404Spjd  (S_GET_TYPE (s) != N_UNDF || S_GET_DESC (s) != 0)
108168404Spjd
109168404Spjd#define S_IS_COMMON(s) \
110185029Spjd  (S_GET_TYPE (s) == N_UNDF && S_GET_VALUE (s) != 0)
111168404Spjd
112168404Spjd#define S_IS_REGISTER(s)	((s)->sy_symbol.n_type == N_REGISTER)
113219089Spjd
114168404Spjd/* True if a debug special symbol entry */
115168404Spjd#define S_IS_DEBUG(s)		((s)->sy_symbol.n_type & N_STAB)
116168404Spjd/* True if a symbol is local symbol name */
117168404Spjd#define S_IS_LOCAL(s) 					\
118168404Spjd  ((S_GET_NAME (s) 					\
119168404Spjd    && !S_IS_DEBUG (s) 					\
120168404Spjd    && (strchr (S_GET_NAME (s), '\001') != NULL		\
121168404Spjd        || strchr (S_GET_NAME (s), '\002') != NULL	\
122168404Spjd        || (S_LOCAL_NAME(s) && !flag_keep_locals)))	\
123168404Spjd   || (flag_strip_local_absolute			\
124168404Spjd       && ! S_IS_EXTERNAL(s)				\
125168404Spjd       && S_GET_SEGMENT (s) == absolute_section))
126168404Spjd/* True if a symbol is not defined in this file */
127168404Spjd#define S_IS_EXTERN(s)		((s)->sy_symbol.n_type & N_EXT)
128168404Spjd/* True if the symbol has been generated because of a .stabd directive */
129168404Spjd#define S_IS_STABD(s)		(S_GET_NAME(s) == (char *)0)
130168404Spjd
131168404Spjd/* Accessors */
132168404Spjd/* The name of the symbol */
133168404Spjd#define S_GET_NAME(s)		((s)->sy_symbol.n_un.n_name)
134168404Spjd/* The pointer to the string table */
135168404Spjd#define S_GET_OFFSET(s)		((s)->sy_symbol.n_un.n_strx)
136168404Spjd/* The type of the symbol */
137168404Spjd#define S_GET_TYPE(s)		((s)->sy_symbol.n_type & N_TYPE)
138168404Spjd/* The numeric value of the segment */
139168404Spjd#define S_GET_SEGMENT(s)	(N_TYPE_seg[S_GET_TYPE(s)])
140168404Spjd/* The n_other expression value */
141168404Spjd#define S_GET_OTHER(s)		((s)->sy_symbol.n_other)
142168404Spjd/* The n_desc expression value */
143219089Spjd#define S_GET_DESC(s)		((s)->sy_symbol.n_desc)
144168404Spjd/* Whether the symbol is weak.  */
145168404Spjd#define S_GET_WEAK(s)		((s)->sy_obj)
146168404Spjd
147168404Spjd/* Modifiers */
148168404Spjd/* Assume that a symbol cannot be simultaneously in more than on segment */
149168404Spjd/* set segment */
150168404Spjd#define S_SET_SEGMENT(s,seg)	((s)->sy_symbol.n_type &= ~N_TYPE,(s)->sy_symbol.n_type|=SEGMENT_TO_SYMBOL_TYPE(seg))
151168404Spjd/* The symbol is external */
152219089Spjd#define S_SET_EXTERNAL(s)	((s)->sy_symbol.n_type |= N_EXT)
153219089Spjd/* The symbol is not external */
154219089Spjd#define S_CLEAR_EXTERNAL(s)	((s)->sy_symbol.n_type &= ~N_EXT)
155219089Spjd/* Set the name of the symbol */
156168404Spjd#define S_SET_NAME(s,v)		((s)->sy_symbol.n_un.n_name = (v))
157168404Spjd/* Set the offset in the string table */
158219089Spjd#define S_SET_OFFSET(s,v)	((s)->sy_symbol.n_un.n_strx = (v))
159168404Spjd/* Set the n_type field */
160219089Spjd#define S_SET_TYPE(s,t)		((s)->sy_symbol.n_type = (t))
161168404Spjd/* Set the n_other expression value */
162219089Spjd#define S_SET_OTHER(s,v)	((s)->sy_symbol.n_other = (v))
163236839Smm/* Set the n_desc expression value */
164219089Spjd#define S_SET_DESC(s,v)		((s)->sy_symbol.n_desc = (v))
165219089Spjd/* Mark the symbol as weak.  This causes n_type to be adjusted when
166219089Spjd   the symbol is written out.  */
167219089Spjd#define S_SET_WEAK(s)		((s)->sy_obj = 1)
168168404Spjd
169168404Spjd/* File header macro and type definition */
170219089Spjd
171219089Spjd#define H_GET_FILE_SIZE(h)	(H_GET_HEADER_SIZE(h) \
172168404Spjd				 + H_GET_TEXT_SIZE(h) \
173219089Spjd				 + H_GET_DATA_SIZE(h) \
174219089Spjd				 + H_GET_SYMBOL_TABLE_SIZE(h) \
175168404Spjd				 + H_GET_TEXT_RELOCATION_SIZE(h) \
176219089Spjd				 + H_GET_DATA_RELOCATION_SIZE(h) \
177219089Spjd				 + H_GET_STRING_SIZE(h))
178219089Spjd
179219089Spjd#define H_GET_HEADER_SIZE(h)		(EXEC_BYTES_SIZE)
180219089Spjd#define H_GET_TEXT_SIZE(h)		((h)->header.a_text)
181219089Spjd#define H_GET_DATA_SIZE(h)		((h)->header.a_data)
182168404Spjd#define H_GET_BSS_SIZE(h)		((h)->header.a_bss)
183219089Spjd#define H_GET_TEXT_RELOCATION_SIZE(h)	((h)->header.a_trsize)
184219089Spjd#define H_GET_DATA_RELOCATION_SIZE(h)	((h)->header.a_drsize)
185168404Spjd#define H_GET_SYMBOL_TABLE_SIZE(h)	((h)->header.a_syms)
186219089Spjd#define H_GET_ENTRY_POINT(h)		((h)->header.a_entry)
187219089Spjd#define H_GET_STRING_SIZE(h)		((h)->string_table_size)
188219089Spjd#define H_GET_LINENO_SIZE(h)		(0)
189219089Spjd
190219089Spjd#define H_GET_DYNAMIC(h)		((h)->header.a_info >> 31)
191219089Spjd#define H_GET_VERSION(h)		(((h)->header.a_info >> 24) & 0x7f)
192219089Spjd#define H_GET_MACHTYPE(h)		(((h)->header.a_info >> 16) & 0xff)
193168404Spjd#define H_GET_MAGIC_NUMBER(h)		((h)->header.a_info & 0xffff)
194168404Spjd
195168404Spjd#define H_SET_DYNAMIC(h,v)		((h)->header.a_info = (((v) << 31) \
196168404Spjd							       | (H_GET_VERSION(h) << 24) \
197168404Spjd							       | (H_GET_MACHTYPE(h) << 16) \
198168404Spjd							       | (H_GET_MAGIC_NUMBER(h))))
199168404Spjd
200185029Spjd#define H_SET_VERSION(h,v)		((h)->header.a_info = ((H_GET_DYNAMIC(h) << 31) \
201185029Spjd							       | ((v) << 24) \
202185029Spjd							       | (H_GET_MACHTYPE(h) << 16) \
203185029Spjd							       | (H_GET_MAGIC_NUMBER(h))))
204168404Spjd
205185029Spjd#define H_SET_MACHTYPE(h,v)		((h)->header.a_info = ((H_GET_DYNAMIC(h) << 31) \
206168404Spjd							       | (H_GET_VERSION(h) << 24) \
207168404Spjd							       | ((v) << 16) \
208168404Spjd							       | (H_GET_MAGIC_NUMBER(h))))
209168404Spjd
210168404Spjd#define H_SET_MAGIC_NUMBER(h,v)		((h)->header.a_info = ((H_GET_DYNAMIC(h) << 31) \
211168404Spjd							       | (H_GET_VERSION(h) << 24) \
212168404Spjd							       | (H_GET_MACHTYPE(h) << 16) \
213168404Spjd							       | ((v))))
214168404Spjd
215168404Spjd#define H_SET_TEXT_SIZE(h,v)		((h)->header.a_text = md_section_align(SEG_TEXT, (v)))
216168404Spjd#define H_SET_DATA_SIZE(h,v)		((h)->header.a_data = md_section_align(SEG_DATA, (v)))
217168404Spjd#define H_SET_BSS_SIZE(h,v)		((h)->header.a_bss = md_section_align(SEG_BSS, (v)))
218219089Spjd
219168404Spjd#define H_SET_RELOCATION_SIZE(h,t,d)	(H_SET_TEXT_RELOCATION_SIZE((h),(t)),\
220168404Spjd					 H_SET_DATA_RELOCATION_SIZE((h),(d)))
221168404Spjd
222168404Spjd#define H_SET_TEXT_RELOCATION_SIZE(h,v)	((h)->header.a_trsize = (v))
223168404Spjd#define H_SET_DATA_RELOCATION_SIZE(h,v)	((h)->header.a_drsize = (v))
224168404Spjd#define H_SET_SYMBOL_TABLE_SIZE(h,v)	((h)->header.a_syms = (v) * 12)
225168404Spjd
226168404Spjd#define H_SET_ENTRY_POINT(h,v)		((h)->header.a_entry = (v))
227168404Spjd#define H_SET_STRING_SIZE(h,v)		((h)->string_table_size = (v))
228168404Spjd
229168404Spjdtypedef struct
230168404Spjd  {
231168404Spjd    struct exec header;		/* a.out header */
232168404Spjd    long string_table_size;	/* names + '\0' + sizeof (int) */
233185029Spjd  }
234168404Spjd
235168404Spjdobject_headers;
236168404Spjd
237168404Spjd/* line numbering stuff.  */
238168404Spjd#define OBJ_EMIT_LINENO(a, b, c)	{;}
239168404Spjd
240168404Spjdstruct fix;
241168404Spjdvoid tc_aout_fix_to_chars PARAMS ((char *where, struct fix *fixP, relax_addressT segment_address));
242168404Spjd
243168404Spjd#endif
244168404Spjd
245168404Spjd#define obj_read_begin_hook()	{;}
246168404Spjd#define obj_symbol_new_hook(s)	{;}
247168404Spjd
248168404Spjd#define EMIT_SECTION_SYMBOLS		0
249168404Spjd
250168404Spjd#define AOUT_STABS
251168404Spjd