~ubuntu-branches/ubuntu/hoary/binutils/hoary

« back to all changes in this revision

Viewing changes to gas/config/obj-bout.h

  • Committer: Bazaar Package Importer
  • Author(s): James Troup
  • Date: 2004-05-19 10:35:44 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040519103544-17h3o6e8pwndydrg
Tags: 2.14.90.0.7-8
debian/rules: don't use gcc-2.95 on m68k.  Thanks to Adam Conrad for
pointing this out.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* b.out object file format
 
2
   Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000,
 
3
   2002, 2003 Free Software Foundation, Inc.
 
4
 
 
5
   This file is part of GAS, the GNU Assembler.
 
6
 
 
7
   GAS is free software; you can redistribute it and/or modify
 
8
   it under the terms of the GNU General Public License as
 
9
   published by the Free Software Foundation; either version 2,
 
10
   or (at your option) any later version.
 
11
 
 
12
   GAS is distributed in the hope that it will be useful, but
 
13
   WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 
15
   the GNU General Public License for more details.
 
16
 
 
17
   You should have received a copy of the GNU General Public
 
18
   License along with GAS; see the file COPYING.  If not, write
 
19
   to the Free Software Foundation, 59 Temple Place - Suite 330, Cambridge, MA
 
20
   02139, USA.  */
 
21
 
 
22
/*
 
23
 * This file is a modified version of 'a.out.h'.  It is to be used in all GNU
 
24
 * tools modified to support the i80960 b.out format (or tools that operate on
 
25
 * object files created by such tools).
 
26
 *
 
27
 * All i80960 development is done in a CROSS-DEVELOPMENT environment.  I.e.,
 
28
 * object code is generated on, and executed under the direction of a symbolic
 
29
 * debugger running on, a host system.  We do not want to be subject to the
 
30
 * vagaries of which host it is or whether it supports COFF or a.out format, or
 
31
 * anything else.  We DO want to:
 
32
 *
 
33
 *      o always generate the same format object files, regardless of host.
 
34
 *
 
35
 *      o have an 'a.out' header that we can modify for our own purposes
 
36
 *        (the 80960 is typically an embedded processor and may require
 
37
 *        enhanced linker support that the normal a.out.h header can't
 
38
 *        accommodate).
 
39
 *
 
40
 * As for byte-ordering, the following rules apply:
 
41
 *
 
42
 *      o Text and data that is actually downloaded to the target is always
 
43
 *        in i80960 (little-endian) order.
 
44
 *
 
45
 *      o All other numbers (in the header, symbols, relocation directives)
 
46
 *        are in host byte-order:  object files CANNOT be lifted from a
 
47
 *        little-end host and used on a big-endian (or vice versa) without
 
48
 *        modification.
 
49
 * ==> THIS IS NO LONGER TRUE USING BFD.  WE CAN GENERATE ANY BYTE ORDER
 
50
 *     FOR THE HEADER, AND READ ANY BYTE ORDER.  PREFERENCE WOULD BE TO
 
51
 *     USE LITTLE-ENDIAN BYTE ORDER THROUGHOUT, REGARDLESS OF HOST.  <==
 
52
 *
 
53
 *      o The downloader ('comm960') takes care to generate a pseudo-header
 
54
 *        with correct (i80960) byte-ordering before shipping text and data
 
55
 *        off to the NINDY monitor in the target systems.  Symbols and
 
56
 *        relocation info are never sent to the target.
 
57
 */
 
58
 
 
59
#define OBJ_BOUT 1
 
60
 
 
61
#define OUTPUT_FLAVOR bfd_target_aout_flavour
 
62
 
 
63
#include "targ-cpu.h"
 
64
 
 
65
#define OBJ_DEFAULT_OUTPUT_FILE_NAME    "b.out"
 
66
 
 
67
extern const short seg_N_TYPE[];
 
68
extern const segT N_TYPE_seg[];
 
69
 
 
70
#define BMAGIC  0415
 
71
/* We don't accept the following (see N_BADMAG macro).
 
72
 * They're just here so GNU code will compile.
 
73
 */
 
74
#define OMAGIC  0407            /* old impure format */
 
75
#define NMAGIC  0410            /* read-only text */
 
76
#define ZMAGIC  0413            /* demand load format */
 
77
 
 
78
#ifndef DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE
 
79
#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE    (BMAGIC)
 
80
#endif /* DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE */
 
81
 
 
82
/* FILE HEADER
 
83
 *      All 'lengths' are given as a number of bytes.
 
84
 *      All 'alignments' are for relinkable files only;  an alignment of
 
85
 *              'n' indicates the corresponding segment must begin at an
 
86
 *              address that is a multiple of (2**n).
 
87
 */
 
88
struct exec
 
89
  {
 
90
    /* Standard stuff */
 
91
    unsigned long a_magic;      /* Identifies this as a b.out file      */
 
92
    unsigned long a_text;       /* Length of text                       */
 
93
    unsigned long a_data;       /* Length of data                       */
 
94
    unsigned long a_bss;        /* Length of runtime uninitialized data area */
 
95
    unsigned long a_syms;       /* Length of symbol table               */
 
96
    unsigned long a_entry;      /* Runtime start address                */
 
97
    unsigned long a_trsize;     /* Length of text relocation info       */
 
98
    unsigned long a_drsize;     /* Length of data relocation info       */
 
99
 
 
100
    /* Added for i960 */
 
101
    unsigned long a_tload;      /* Text runtime load address            */
 
102
    unsigned long a_dload;      /* Data runtime load address            */
 
103
    unsigned char a_talign;     /* Alignment of text segment            */
 
104
    unsigned char a_dalign;     /* Alignment of data segment            */
 
105
    unsigned char a_balign;     /* Alignment of bss segment             */
 
106
    unsigned char a_relaxable;  /* Contains enough info to relax     */
 
107
  };
 
108
 
 
109
#define N_BADMAG(x)     (((x).a_magic)!=BMAGIC)
 
110
#define N_TXTOFF(x)     ( sizeof (struct exec) )
 
111
#define N_DATOFF(x)     ( N_TXTOFF(x) + (x).a_text )
 
112
#define N_TROFF(x)      ( N_DATOFF(x) + (x).a_data )
 
113
#define N_DROFF(x)      ( N_TROFF(x) + (x).a_trsize )
 
114
#define N_SYMOFF(x)     ( N_DROFF(x) + (x).a_drsize )
 
115
#define N_STROFF(x)     ( N_SYMOFF(x) + (x).a_syms )
 
116
 
 
117
/* A single entry in the symbol table
 
118
 */
 
119
struct nlist
 
120
  {
 
121
    union
 
122
      {
 
123
        char *n_name;
 
124
        struct nlist *n_next;
 
125
        long n_strx;            /* Index into string table      */
 
126
      }
 
127
    n_un;
 
128
    unsigned char n_type;       /* See below                            */
 
129
    char n_other;               /* Used in i80960 support -- see below  */
 
130
    short n_desc;
 
131
    unsigned long n_value;
 
132
  };
 
133
 
 
134
typedef struct nlist obj_symbol_type;
 
135
 
 
136
/* Legal values of n_type
 
137
 */
 
138
#define N_UNDF  0               /* Undefined symbol     */
 
139
#define N_ABS   2               /* Absolute symbol      */
 
140
#define N_TEXT  4               /* Text symbol          */
 
141
#define N_DATA  6               /* Data symbol          */
 
142
#define N_BSS   8               /* BSS symbol           */
 
143
#define N_FN    31              /* Filename symbol      */
 
144
 
 
145
#define N_EXT   1               /* External symbol (OR'd in with one of above)  */
 
146
#define N_TYPE  036             /* Mask for all the type bits                   */
 
147
#define N_STAB  0340            /* Mask for all bits used for SDB entries       */
 
148
 
 
149
#ifndef CUSTOM_RELOC_FORMAT
 
150
struct relocation_info
 
151
  {
 
152
    int r_address;              /* File address of item to be relocated */
 
153
    unsigned
 
154
      r_index:24,               /* Index of symbol on which relocation is based*/
 
155
      r_pcrel:1,                /* 1 => relocate PC-relative; else absolute
 
156
                 *      On i960, pc-relative implies 24-bit
 
157
                 *      address, absolute implies 32-bit.
 
158
                 */
 
159
      r_length:2,               /* Number of bytes to relocate:
 
160
                 *      0 => 1 byte
 
161
                 *      1 => 2 bytes
 
162
                 *      2 => 4 bytes -- only value used for i960
 
163
                 */
 
164
      r_extern:1, r_bsr:1,      /* Something for the GNU NS32K assembler */
 
165
      r_disp:1,                 /* Something for the GNU NS32K assembler */
 
166
      r_callj:1,                /* 1 if relocation target is an i960 'callj' */
 
167
      nuthin:1;                 /* Unused                               */
 
168
  };
 
169
 
 
170
#endif /* CUSTOM_RELOC_FORMAT */
 
171
 
 
172
/*
 
173
 *  Macros to extract information from a symbol table entry.
 
174
 *  This syntaxic indirection allows independence regarding a.out or coff.
 
175
 *  The argument (s) of all these macros is a pointer to a symbol table entry.
 
176
 */
 
177
 
 
178
/* Predicates */
 
179
/* True if the symbol is external */
 
180
#define S_IS_EXTERNAL(s)        ((s)->sy_symbol.n_type & N_EXT)
 
181
 
 
182
/* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */
 
183
#define S_IS_DEFINED(s)         ((S_GET_TYPE(s) != N_UNDF) || (S_GET_DESC(s) != 0))
 
184
 
 
185
/* Return true for symbols that should not be reduced to section
 
186
   symbols or eliminated from expressions, because they may be
 
187
   overridden by the linker.  */
 
188
#define S_FORCE_RELOC(s, strict) \
 
189
  (!SEG_NORMAL (S_GET_SEGMENT (s)))
 
190
 
 
191
#define S_IS_COMMON(s) \
 
192
  (S_GET_TYPE (s) == N_UNDF && S_GET_VALUE (s) != 0)
 
193
 
 
194
#define S_IS_REGISTER(s)        ((s)->sy_symbol.n_type == N_REGISTER)
 
195
 
 
196
/* True if a debug special symbol entry */
 
197
#define S_IS_DEBUG(s)           ((s)->sy_symbol.n_type & N_STAB)
 
198
/* True if a symbol is local symbol name */
 
199
#define S_IS_LOCAL(s)                                   \
 
200
  ((S_GET_NAME (s)                                      \
 
201
    && !S_IS_DEBUG (s)                                  \
 
202
    && (strchr (S_GET_NAME (s), '\001') != NULL         \
 
203
        || strchr (S_GET_NAME (s), '\002') != NULL      \
 
204
        || (S_LOCAL_NAME(s) && !flag_keep_locals)))     \
 
205
   || (flag_strip_local_absolute                        \
 
206
       && !S_IS_EXTERNAL(s)                             \
 
207
       && S_GET_SEGMENT(s) == absolute_section))
 
208
/* True if a symbol is not defined in this file */
 
209
#define S_IS_EXTERN(s)          ((s)->sy_symbol.n_type & N_EXT)
 
210
/* True if the symbol has been generated because of a .stabd directive */
 
211
#define S_IS_STABD(s)           (S_GET_NAME(s) == NULL)
 
212
 
 
213
/* Accessors */
 
214
/* The name of the symbol */
 
215
#define S_GET_NAME(s)           ((s)->sy_symbol.n_un.n_name)
 
216
/* The pointer to the string table */
 
217
#define S_GET_OFFSET(s)         ((s)->sy_symbol.n_un.n_strx)
 
218
/* The type of the symbol */
 
219
#define S_GET_TYPE(s)           ((s)->sy_symbol.n_type & N_TYPE)
 
220
/* The numeric value of the segment */
 
221
#define S_GET_SEGMENT(s)        (N_TYPE_seg[S_GET_TYPE(s)])
 
222
/* The n_other expression value */
 
223
#define S_GET_OTHER(s)          ((s)->sy_symbol.n_other)
 
224
/* The n_desc expression value */
 
225
#define S_GET_DESC(s)           ((s)->sy_symbol.n_desc)
 
226
 
 
227
/* Modifiers */
 
228
/* Assume that a symbol cannot be simultaneously in more than on segment */
 
229
/* set segment */
 
230
#define S_SET_SEGMENT(s,seg)    ((s)->sy_symbol.n_type &= ~N_TYPE,(s)->sy_symbol.n_type|=SEGMENT_TO_SYMBOL_TYPE(seg))
 
231
/* The symbol is external */
 
232
#define S_SET_EXTERNAL(s)       ((s)->sy_symbol.n_type |= N_EXT)
 
233
/* The symbol is not external */
 
234
#define S_CLEAR_EXTERNAL(s)     ((s)->sy_symbol.n_type &= ~N_EXT)
 
235
/* Set the name of the symbol */
 
236
#define S_SET_NAME(s,v)         ((s)->sy_symbol.n_un.n_name = (v))
 
237
/* Set the offset in the string table */
 
238
#define S_SET_OFFSET(s,v)       ((s)->sy_symbol.n_un.n_strx = (v))
 
239
/* Set the n_other expression value */
 
240
#define S_SET_OTHER(s,v)        ((s)->sy_symbol.n_other = (v))
 
241
/* Set the n_desc expression value */
 
242
#define S_SET_DESC(s,v)         ((s)->sy_symbol.n_desc = (v))
 
243
/* Set the n_type value */
 
244
#define S_SET_TYPE(s,v)         ((s)->sy_symbol.n_type = (v))
 
245
 
 
246
/* File header macro and type definition */
 
247
 
 
248
#define H_GET_FILE_SIZE(h)      (sizeof (struct exec) + \
 
249
                                 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
 
250
                                 H_GET_SYMBOL_TABLE_SIZE(h) + \
 
251
                                 H_GET_TEXT_RELOCATION_SIZE(h) + \
 
252
                                 H_GET_DATA_RELOCATION_SIZE(h) + \
 
253
                                 (h)->string_table_size)
 
254
 
 
255
#define H_GET_HEADER_SIZE(h)            (sizeof (struct exec))
 
256
#define H_GET_TEXT_SIZE(h)              ((h)->header.a_text)
 
257
#define H_GET_DATA_SIZE(h)              ((h)->header.a_data)
 
258
#define H_GET_BSS_SIZE(h)               ((h)->header.a_bss)
 
259
#define H_GET_TEXT_RELOCATION_SIZE(h)   ((h)->header.a_trsize)
 
260
#define H_GET_DATA_RELOCATION_SIZE(h)   ((h)->header.a_drsize)
 
261
#define H_GET_SYMBOL_TABLE_SIZE(h)      ((h)->header.a_syms)
 
262
#define H_GET_MAGIC_NUMBER(h)           ((h)->header.a_info)
 
263
#define H_GET_ENTRY_POINT(h)            ((h)->header.a_entry)
 
264
#define H_GET_STRING_SIZE(h)            ((h)->string_table_size)
 
265
#define H_GET_LINENO_SIZE(h)            (0)
 
266
 
 
267
#ifdef EXEC_MACHINE_TYPE
 
268
#define H_GET_MACHINE_TYPE(h)           ((h)->header.a_machtype)
 
269
#endif /* EXEC_MACHINE_TYPE */
 
270
#ifdef EXEC_VERSION
 
271
#define H_GET_VERSION(h)                ((h)->header.a_version)
 
272
#endif /* EXEC_VERSION */
 
273
 
 
274
#define H_SET_TEXT_SIZE(h,v)            ((h)->header.a_text = (v))
 
275
#define H_SET_DATA_SIZE(h,v)            ((h)->header.a_data = (v))
 
276
#define H_SET_BSS_SIZE(h,v)             ((h)->header.a_bss = (v))
 
277
 
 
278
#define H_SET_RELOCATION_SIZE(h,t,d)    (H_SET_TEXT_RELOCATION_SIZE((h),(t)),\
 
279
                                         H_SET_DATA_RELOCATION_SIZE((h),(d)))
 
280
 
 
281
#define H_SET_TEXT_RELOCATION_SIZE(h,v) ((h)->header.a_trsize = (v))
 
282
#define H_SET_DATA_RELOCATION_SIZE(h,v) ((h)->header.a_drsize = (v))
 
283
#define H_SET_SYMBOL_TABLE_SIZE(h,v)    ((h)->header.a_syms = (v) * \
 
284
                                         sizeof (struct nlist))
 
285
 
 
286
#define H_SET_MAGIC_NUMBER(h,v)         ((h)->header.a_magic = (v))
 
287
 
 
288
#define H_SET_ENTRY_POINT(h,v)          ((h)->header.a_entry = (v))
 
289
#define H_SET_STRING_SIZE(h,v)          ((h)->string_table_size = (v))
 
290
#ifdef EXEC_MACHINE_TYPE
 
291
#define H_SET_MACHINE_TYPE(h,v)         ((h)->header.a_machtype = (v))
 
292
#endif /* EXEC_MACHINE_TYPE */
 
293
#ifdef EXEC_VERSION
 
294
#define H_SET_VERSION(h,v)              ((h)->header.a_version = (v))
 
295
#endif /* EXEC_VERSION */
 
296
 
 
297
typedef struct
 
298
  {
 
299
    struct exec header;         /* a.out header */
 
300
    long string_table_size;     /* names + '\0' + sizeof (int) */
 
301
  }
 
302
 
 
303
object_headers;
 
304
 
 
305
/* unused hooks.  */
 
306
#define OBJ_EMIT_LINENO(a, b, c)        {;}
 
307
#define obj_pre_write_hook(a)           {;}
 
308
 
 
309
#if __STDC__
 
310
struct fix;
 
311
#endif
 
312
extern void tc_aout_fix_to_chars PARAMS ((char *where,
 
313
                                          struct fix *fixP,
 
314
                                          relax_addressT segment_address));
 
315
extern void tc_bout_fix_to_chars PARAMS ((char *where,
 
316
                                          struct fix *fixP,
 
317
                                          relax_addressT segment_address));
 
318
 
 
319
#define AOUT_STABS