home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / binutils-2.7-src.tgz / tar.out / fsf / binutils / gas / config / obj-coff.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  30KB  |  793 lines

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