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