xref: /openbsd-src/gnu/usr.bin/binutils/bfd/sparclynx.c (revision 007c2a4539b8b8aaa95c5e73e77620090abe113b)
12159047fSniklas /* BFD support for Sparc binaries under LynxOS.
2c074d1c9Sdrahn    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000,
3c074d1c9Sdrahn    2001, 2002, 2003 Free Software Foundation, Inc.
42159047fSniklas 
52159047fSniklas This file is part of BFD, the Binary File Descriptor library.
62159047fSniklas 
72159047fSniklas This program is free software; you can redistribute it and/or modify
82159047fSniklas it under the terms of the GNU General Public License as published by
92159047fSniklas the Free Software Foundation; either version 2 of the License, or
102159047fSniklas (at your option) any later version.
112159047fSniklas 
122159047fSniklas This program is distributed in the hope that it will be useful,
132159047fSniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
142159047fSniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
152159047fSniklas GNU General Public License for more details.
162159047fSniklas 
172159047fSniklas You should have received a copy of the GNU General Public License
182159047fSniklas along with this program; if not, write to the Free Software
192159047fSniklas Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
202159047fSniklas 
212159047fSniklas #if 0
222159047fSniklas #define N_SHARED_LIB(x) 0
232159047fSniklas 
242159047fSniklas #define TEXT_START_ADDR 0
252159047fSniklas #define TARGET_PAGE_SIZE 4096
262159047fSniklas #define SEGMENT_SIZE TARGET_PAGE_SIZE
272159047fSniklas #define DEFAULT_ARCH bfd_arch_sparc
282159047fSniklas 
292159047fSniklas #endif
302159047fSniklas 
31c074d1c9Sdrahn /* Do not "beautify" the CONCAT* macro args.  Traditional C will not
32c074d1c9Sdrahn    remove whitespace added here, and thus will fail to concatenate
33c074d1c9Sdrahn    the tokens.  */
34c074d1c9Sdrahn #define MY(OP) CONCAT2 (sparclynx_aout_,OP)
352159047fSniklas #define TARGETNAME "a.out-sparc-lynx"
362159047fSniklas 
372159047fSniklas #include "bfd.h"
382159047fSniklas #include "sysdep.h"
392159047fSniklas #include "libbfd.h"
402159047fSniklas 
412159047fSniklas #include "aout/sun4.h"
422159047fSniklas #include "libaout.h"		/* BFD a.out internal data structures */
432159047fSniklas 
442159047fSniklas #include "aout/aout64.h"
452159047fSniklas #include "aout/stab_gnu.h"
462159047fSniklas #include "aout/ar.h"
472159047fSniklas 
48c074d1c9Sdrahn void NAME (lynx,set_arch_mach) PARAMS ((bfd *, unsigned long));
49c074d1c9Sdrahn static void choose_reloc_size PARAMS ((bfd *));
50c074d1c9Sdrahn static bfd_boolean NAME (aout,sparclynx_write_object_contents) PARAMS ((bfd *));
51c074d1c9Sdrahn 
522159047fSniklas /* This is needed to reject a NewsOS file, e.g. in
532159047fSniklas    gdb/testsuite/gdb.t10/crossload.exp. <kingdon@cygnus.com>
542159047fSniklas    I needed to add M_UNKNOWN to recognize a 68000 object, so this will
552159047fSniklas    probably no longer reject a NewsOS object.  <ian@cygnus.com>.  */
562159047fSniklas #define MACHTYPE_OK(mtype) ((mtype) == M_UNKNOWN \
572159047fSniklas 			    || (mtype) == M_68010 \
582159047fSniklas 			    || (mtype) == M_68020 \
592159047fSniklas 			    || (mtype) == M_SPARC)
602159047fSniklas 
61c074d1c9Sdrahn /* The file @code{aoutf1.h} contains the code for BFD's
622159047fSniklas    a.out back end. Control over the generated back end is given by these
632159047fSniklas    two preprocessor names:
642159047fSniklas    @table @code
652159047fSniklas    @item ARCH_SIZE
662159047fSniklas    This value should be either 32 or 64, depending upon the size of an
672159047fSniklas    int in the target format. It changes the sizes of the structs which
682159047fSniklas    perform the memory/disk mapping of structures.
692159047fSniklas 
702159047fSniklas    The 64 bit backend may only be used if the host compiler supports 64
712159047fSniklas    ints (eg long long with gcc), by defining the name @code{BFD_HOST_64_BIT} in @code{bfd.h}.
722159047fSniklas    With this name defined, @emph{all} bfd operations are performed with 64bit
732159047fSniklas    arithmetic, not just those to a 64bit target.
742159047fSniklas 
752159047fSniklas    @item TARGETNAME
762159047fSniklas    The name put into the target vector.
772159047fSniklas    @item
78c074d1c9Sdrahn    @end table  */
792159047fSniklas 
802159047fSniklas void
812159047fSniklas NAME(lynx,set_arch_mach) (abfd, machtype)
822159047fSniklas      bfd *abfd;
83c074d1c9Sdrahn      unsigned long machtype;
842159047fSniklas {
852159047fSniklas   /* Determine the architecture and machine type of the object file.  */
862159047fSniklas   enum bfd_architecture arch;
87c074d1c9Sdrahn   unsigned long machine;
88c074d1c9Sdrahn 
892159047fSniklas   switch (machtype)
902159047fSniklas     {
912159047fSniklas     case M_UNKNOWN:
922159047fSniklas       /* Some Sun3s make magic numbers without cpu types in them, so
932159047fSniklas 	 we'll default to the 68000.  */
942159047fSniklas       arch = bfd_arch_m68k;
95f7cc78ecSespie       machine = bfd_mach_m68000;
962159047fSniklas       break;
972159047fSniklas 
982159047fSniklas     case M_68010:
992159047fSniklas     case M_HP200:
1002159047fSniklas       arch = bfd_arch_m68k;
101f7cc78ecSespie       machine = bfd_mach_m68010;
1022159047fSniklas       break;
1032159047fSniklas 
1042159047fSniklas     case M_68020:
1052159047fSniklas     case M_HP300:
1062159047fSniklas       arch = bfd_arch_m68k;
107f7cc78ecSespie       machine = bfd_mach_m68020;
1082159047fSniklas       break;
1092159047fSniklas 
1102159047fSniklas     case M_SPARC:
1112159047fSniklas       arch = bfd_arch_sparc;
1122159047fSniklas       machine = 0;
1132159047fSniklas       break;
1142159047fSniklas 
1152159047fSniklas     case M_386:
1162159047fSniklas     case M_386_DYNIX:
1172159047fSniklas       arch = bfd_arch_i386;
1182159047fSniklas       machine = 0;
1192159047fSniklas       break;
1202159047fSniklas 
1212159047fSniklas     case M_29K:
1222159047fSniklas       arch = bfd_arch_a29k;
1232159047fSniklas       machine = 0;
1242159047fSniklas       break;
1252159047fSniklas 
1262159047fSniklas     case M_HPUX:
1272159047fSniklas       arch = bfd_arch_m68k;
1282159047fSniklas       machine = 0;
1292159047fSniklas       break;
1302159047fSniklas 
1312159047fSniklas     default:
1322159047fSniklas       arch = bfd_arch_obscure;
1332159047fSniklas       machine = 0;
1342159047fSniklas       break;
1352159047fSniklas     }
1362159047fSniklas   bfd_set_arch_mach (abfd, arch, machine);
1372159047fSniklas }
1382159047fSniklas 
1392159047fSniklas #define SET_ARCH_MACH(ABFD, EXEC) \
1402159047fSniklas   NAME(lynx,set_arch_mach) (ABFD, N_MACHTYPE (EXEC)); \
1412159047fSniklas   choose_reloc_size(ABFD);
1422159047fSniklas 
143c074d1c9Sdrahn /* Determine the size of a relocation entry, based on the architecture.  */
144c074d1c9Sdrahn 
1452159047fSniklas static void
choose_reloc_size(abfd)1462159047fSniklas choose_reloc_size (abfd)
1472159047fSniklas      bfd *abfd;
1482159047fSniklas {
1492159047fSniklas   switch (bfd_get_arch (abfd))
1502159047fSniklas     {
1512159047fSniklas     case bfd_arch_sparc:
1522159047fSniklas     case bfd_arch_a29k:
1532159047fSniklas       obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
1542159047fSniklas       break;
1552159047fSniklas     default:
1562159047fSniklas       obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
1572159047fSniklas       break;
1582159047fSniklas     }
1592159047fSniklas }
1602159047fSniklas 
1612159047fSniklas /* Write an object file in LynxOS format.
1622159047fSniklas   Section contents have already been written.  We write the
1632159047fSniklas   file header, symbols, and relocation.  */
1642159047fSniklas 
165c074d1c9Sdrahn static bfd_boolean
1662159047fSniklas NAME(aout,sparclynx_write_object_contents) (abfd)
1672159047fSniklas      bfd *abfd;
1682159047fSniklas {
1692159047fSniklas   struct external_exec exec_bytes;
1702159047fSniklas   struct internal_exec *execp = exec_hdr (abfd);
1712159047fSniklas 
1722159047fSniklas   /* Magic number, maestro, please!  */
1732159047fSniklas   switch (bfd_get_arch (abfd))
1742159047fSniklas     {
1752159047fSniklas     case bfd_arch_m68k:
1762159047fSniklas       switch (bfd_get_mach (abfd))
1772159047fSniklas 	{
178f7cc78ecSespie 	case bfd_mach_m68010:
1792159047fSniklas 	  N_SET_MACHTYPE (*execp, M_68010);
1802159047fSniklas 	  break;
1812159047fSniklas 	default:
182f7cc78ecSespie 	case bfd_mach_m68020:
1832159047fSniklas 	  N_SET_MACHTYPE (*execp, M_68020);
1842159047fSniklas 	  break;
1852159047fSniklas 	}
1862159047fSniklas       break;
1872159047fSniklas     case bfd_arch_sparc:
1882159047fSniklas       N_SET_MACHTYPE (*execp, M_SPARC);
1892159047fSniklas       break;
1902159047fSniklas     case bfd_arch_i386:
1912159047fSniklas       N_SET_MACHTYPE (*execp, M_386);
1922159047fSniklas       break;
1932159047fSniklas     case bfd_arch_a29k:
1942159047fSniklas       N_SET_MACHTYPE (*execp, M_29K);
1952159047fSniklas       break;
1962159047fSniklas     default:
1972159047fSniklas       N_SET_MACHTYPE (*execp, M_UNKNOWN);
1982159047fSniklas     }
1992159047fSniklas 
2002159047fSniklas   choose_reloc_size (abfd);
2012159047fSniklas 
2022159047fSniklas   N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags);
2032159047fSniklas 
2042159047fSniklas   WRITE_HEADERS (abfd, execp);
2052159047fSniklas 
206c074d1c9Sdrahn   return TRUE;
2072159047fSniklas }
2082159047fSniklas 
2092159047fSniklas #define MY_set_sizes sparclynx_set_sizes
210c074d1c9Sdrahn static bfd_boolean sparclynx_set_sizes PARAMS ((bfd *));
211c074d1c9Sdrahn 
212c074d1c9Sdrahn static bfd_boolean
sparclynx_set_sizes(abfd)2132159047fSniklas sparclynx_set_sizes (abfd)
2142159047fSniklas      bfd *abfd;
2152159047fSniklas {
2162159047fSniklas   switch (bfd_get_arch (abfd))
2172159047fSniklas     {
2182159047fSniklas     default:
219c074d1c9Sdrahn       return FALSE;
2202159047fSniklas     case bfd_arch_sparc:
2212159047fSniklas       adata (abfd).page_size = 0x2000;
2222159047fSniklas       adata (abfd).segment_size = 0x2000;
2232159047fSniklas       adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE;
224c074d1c9Sdrahn       return TRUE;
2252159047fSniklas     case bfd_arch_m68k:
2262159047fSniklas       adata (abfd).page_size = 0x2000;
2272159047fSniklas       adata (abfd).segment_size = 0x20000;
2282159047fSniklas       adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE;
229c074d1c9Sdrahn       return TRUE;
2302159047fSniklas     }
2312159047fSniklas }
2322159047fSniklas 
233c074d1c9Sdrahn static const struct aout_backend_data sparclynx_aout_backend =
2342159047fSniklas   {
235fddef416Sniklas     0, 1, 0, 1, 0, sparclynx_set_sizes, 0,
2362159047fSniklas     0,				/* add_dynamic_symbols */
2372159047fSniklas     0,				/* add_one_symbol */
2382159047fSniklas     0,				/* link_dynamic_object */
2392159047fSniklas     0,				/* write_dynamic_symbol */
2402159047fSniklas     0,				/* check_dynamic_reloc */
2412159047fSniklas     0				/* finish_dynamic_link */
2422159047fSniklas   };
2432159047fSniklas 
2442159047fSniklas 
2452159047fSniklas #define MY_bfd_debug_info_start		bfd_void
2462159047fSniklas #define MY_bfd_debug_info_end		bfd_void
2472159047fSniklas #define MY_bfd_debug_info_accumulate	\
248*007c2a45Smiod 		(void (*) PARAMS ((bfd *, struct bfd_section *))) bfd_void
2492159047fSniklas 
2502159047fSniklas #define MY_write_object_contents	NAME(aout,sparclynx_write_object_contents)
2512159047fSniklas #define MY_backend_data			&sparclynx_aout_backend
2522159047fSniklas 
2532159047fSniklas #define TARGET_IS_BIG_ENDIAN_P
2542159047fSniklas 
2552159047fSniklas #ifdef LYNX_CORE
2562159047fSniklas 
2572159047fSniklas char * lynx_core_file_failing_command ();
2582159047fSniklas int lynx_core_file_failing_signal ();
259c074d1c9Sdrahn bfd_boolean lynx_core_file_matches_executable_p ();
2602159047fSniklas const bfd_target * lynx_core_file_p ();
2612159047fSniklas 
2622159047fSniklas #define	MY_core_file_failing_command lynx_core_file_failing_command
2632159047fSniklas #define	MY_core_file_failing_signal lynx_core_file_failing_signal
2642159047fSniklas #define	MY_core_file_matches_executable_p lynx_core_file_matches_executable_p
2652159047fSniklas #define	MY_core_file_p lynx_core_file_p
2662159047fSniklas 
2672159047fSniklas #endif /* LYNX_CORE */
2682159047fSniklas 
2692159047fSniklas #include "aout-target.h"
270