1/* BFD back-end definitions used by all FreeBSD targets. 2 Copyright 1990, 1991, 1992, 1996, 1997, 2000, 2001, 2002, 2005, 2007 3 Free Software Foundation, Inc. 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, 20 USA. */ 21 22/* $FreeBSD$ */ 23 24/* FreeBSD QMAGIC files have the header in the text. */ 25#define N_HEADER_IN_TEXT(x) 1 26#define MY_text_includes_header 1 27 28#define TEXT_START_ADDR (TARGET_PAGE_SIZE + 0x20) 29 30/* 31 * FreeBSD uses a weird mix of byte orderings for its a_info field. 32 * Its assembler emits NetBSD style object files, with a big-endian 33 * a_info. Its linker seems to accept either byte ordering, but 34 * emits a little-endian a_info. 35 * 36 * Here, we accept either byte ordering, but always produce 37 * little-endian. 38 * 39 * FIXME - Probably we should always produce the _native_ byte 40 * ordering. I.e., it should be in the architecture-specific 41 * file, not here. But in reality, there is no chance 42 * that FreeBSD will ever use a.out in a new port. 43 */ 44 45#define N_MACHTYPE(exec) \ 46 ((enum machine_type) \ 47 ((freebsd_swap_magic(&(exec).a_info) >> 16) & 0x3ff)) 48#define N_FLAGS(exec) \ 49 ((enum machine_type) \ 50 ((freebsd_swap_magic(&(exec).a_info) >> 26) & 0x3f)) 51 52#define N_SET_INFO(exec, magic, type, flags) \ 53 ((exec).a_info = ((magic) & 0xffff) \ 54 | (((int)(type) & 0x3ff) << 16) \ 55 | (((flags) & 0x3f) << 26)) 56#define N_SET_MACHTYPE(exec, machtype) \ 57 ((exec).a_info = \ 58 ((exec).a_info & 0xfb00ffff) | ((((int) (machtype)) & 0x3ff) << 16)) 59#define N_SET_FLAGS(exec, flags) \ 60 ((exec).a_info = \ 61 ((exec).a_info & 0x03ffffff) | ((flags & 0x03f) << 26)) 62 63#include "sysdep.h" 64#include "bfd.h" 65#include "libbfd.h" 66#include "libaout.h" 67 68#define SWAP_MAGIC(ext) (freebsd_swap_magic(ext)) 69 70#define MY_bfd_final_link MY (bfd_final_link) 71#define MY_write_object_contents MY (write_object_contents) 72static bfd_boolean MY (bfd_final_link) (bfd *, struct bfd_link_info *); 73static bfd_boolean MY (write_object_contents) (bfd *); 74static long freebsd_swap_magic (void *); 75 76#include "aout-target.h" 77 78static bfd_boolean 79MY (bfd_final_link) (bfd *abfd, struct bfd_link_info *info) 80{ 81 obj_aout_subformat (abfd) = q_magic_format; 82 return NAME(aout,final_link) (abfd, info, MY_final_link_callback); 83} 84 85/* Swap a magic number. We accept either endian, whichever looks valid. */ 86 87static long 88freebsd_swap_magic (void *ext) 89{ 90 long linfo = bfd_getl32(ext); 91 long binfo = bfd_getb32(ext); 92 int lmagic = linfo & 0xffff; 93 int bmagic = binfo & 0xffff; 94 int lmagic_ok = lmagic == OMAGIC || lmagic == NMAGIC || 95 lmagic == ZMAGIC || lmagic == QMAGIC; 96 int bmagic_ok = bmagic == OMAGIC || bmagic == NMAGIC || 97 bmagic == ZMAGIC || bmagic == QMAGIC; 98 99 return bmagic_ok && !lmagic_ok ? binfo : linfo; 100} 101 102/* Write an object file. 103 Section contents have already been written. We write the 104 file header, symbols, and relocation. */ 105 106static bfd_boolean 107MY (write_object_contents) (bfd *abfd) 108{ 109 struct external_exec exec_bytes; 110 struct internal_exec *execp = exec_hdr (abfd); 111 112 obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; 113 114 /* Magic number, maestro, please! */ 115 switch (bfd_get_arch(abfd)) 116 { 117 case bfd_arch_m68k: 118 if (strcmp (abfd->xvec->name, "a.out-m68k4k-netbsd") == 0) 119 N_SET_MACHTYPE (*execp, M_68K4K_NETBSD); 120 else 121 N_SET_MACHTYPE (*execp, M_68K_NETBSD); 122 break; 123 case bfd_arch_sparc: 124 N_SET_MACHTYPE (*execp, M_SPARC_NETBSD); 125 break; 126 case bfd_arch_i386: 127 N_SET_MACHTYPE (*execp, M_386_NETBSD); 128 break; 129 case bfd_arch_ns32k: 130 N_SET_MACHTYPE (*execp, M_532_NETBSD); 131 break; 132 default: 133 N_SET_MACHTYPE (*execp, M_UNKNOWN); 134 break; 135 } 136 137 WRITE_HEADERS(abfd, execp); 138 139 return TRUE; 140} 141