Switch sources over to use the GPL version 3
[deliverable/binutils-gdb.git] / bfd / i386msdos.c
CommitLineData
252b5132 1/* BFD back-end for MS-DOS executables.
0f867abe 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002,
157090f7 3 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
252b5132
RH
4 Written by Bryan Ford of the University of Utah.
5
6 Contributed by the Center for Software Science at the
7 University of Utah (pa-gdb-bugs@cs.utah.edu).
8
9 This file is part of BFD, the Binary File Descriptor library.
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
cd123cb7 13 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
14 (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
cd123cb7
NC
23 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
24 MA 02110-1301, USA. */
252b5132
RH
25
26
252b5132 27#include "sysdep.h"
3db64b00 28#include "bfd.h"
252b5132
RH
29#include "libbfd.h"
30#include "libaout.h"
31
252b5132
RH
32#define EXE_MAGIC 0x5a4d
33#define EXE_LOAD_HIGH 0x0000
34#define EXE_LOAD_LOW 0xffff
35#define EXE_PAGE_SIZE 512
36
252b5132 37static int
a6b96beb
AM
38msdos_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
39 struct bfd_link_info *info ATTRIBUTE_UNUSED)
252b5132
RH
40{
41 return 0;
42}
43
b34976b6 44static bfd_boolean
a6b96beb 45msdos_write_object_contents (bfd *abfd)
252b5132
RH
46{
47 static char hdr[EXE_PAGE_SIZE];
48 file_ptr outfile_size = sizeof(hdr);
49 bfd_vma high_vma = 0;
50 asection *sec;
51
52 /* Find the total size of the program on disk and in memory. */
53 for (sec = abfd->sections; sec != (asection *) NULL; sec = sec->next)
54 {
eea6121a 55 if (sec->size == 0)
252b5132
RH
56 continue;
57 if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
58 {
eea6121a 59 bfd_vma sec_vma = bfd_get_section_vma (abfd, sec) + sec->size;
252b5132
RH
60 if (sec_vma > high_vma)
61 high_vma = sec_vma;
62 }
63 if (bfd_get_section_flags (abfd, sec) & SEC_LOAD)
64 {
911d08a7
AM
65 file_ptr sec_end = (sizeof (hdr)
66 + bfd_get_section_vma (abfd, sec)
eea6121a 67 + sec->size);
252b5132
RH
68 if (sec_end > outfile_size)
69 outfile_size = sec_end;
70 }
71 }
72
73 /* Make sure the program isn't too big. */
74 if (high_vma > (bfd_vma)0xffff)
75 {
76 bfd_set_error(bfd_error_file_too_big);
b34976b6 77 return FALSE;
252b5132
RH
78 }
79
e4b17274 80 /* Constants. */
dc810e39
AM
81 H_PUT_16 (abfd, EXE_MAGIC, &hdr[0]);
82 H_PUT_16 (abfd, EXE_PAGE_SIZE / 16, &hdr[8]);
83 H_PUT_16 (abfd, EXE_LOAD_LOW, &hdr[12]);
84 H_PUT_16 (abfd, 0x3e, &hdr[24]);
85 H_PUT_16 (abfd, 0x0001, &hdr[28]); /* XXX??? */
86 H_PUT_16 (abfd, 0x30fb, &hdr[30]); /* XXX??? */
87 H_PUT_16 (abfd, 0x726a, &hdr[32]); /* XXX??? */
252b5132 88
e4b17274 89 /* Bytes in last page (0 = full page). */
dc810e39 90 H_PUT_16 (abfd, outfile_size & (EXE_PAGE_SIZE - 1), &hdr[2]);
252b5132 91
e4b17274 92 /* Number of pages. */
dc810e39 93 H_PUT_16 (abfd, (outfile_size + EXE_PAGE_SIZE - 1) / EXE_PAGE_SIZE, &hdr[4]);
252b5132
RH
94
95 /* Set the initial stack pointer to the end of the bss.
96 The program's crt0 code must relocate it to a real stack. */
dc810e39 97 H_PUT_16 (abfd, high_vma, &hdr[16]);
252b5132
RH
98
99 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
dc810e39 100 || bfd_bwrite (hdr, (bfd_size_type) sizeof(hdr), abfd) != sizeof(hdr))
b34976b6 101 return FALSE;
252b5132 102
b34976b6 103 return TRUE;
252b5132
RH
104}
105
b34976b6 106static bfd_boolean
a6b96beb
AM
107msdos_set_section_contents (bfd *abfd,
108 sec_ptr section,
109 const void *location,
110 file_ptr offset,
111 bfd_size_type count)
252b5132
RH
112{
113
114 if (count == 0)
b34976b6 115 return TRUE;
252b5132
RH
116
117 section->filepos = EXE_PAGE_SIZE + bfd_get_section_vma (abfd, section);
118
119 if (bfd_get_section_flags (abfd, section) & SEC_LOAD)
120 {
dc810e39
AM
121 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
122 || bfd_bwrite (location, count, abfd) != count)
b34976b6 123 return FALSE;
252b5132
RH
124 }
125
b34976b6 126 return TRUE;
252b5132
RH
127}
128
129
130
131#define msdos_mkobject aout_32_mkobject
132#define msdos_make_empty_symbol aout_32_make_empty_symbol
133#define msdos_bfd_reloc_type_lookup aout_32_reloc_type_lookup
157090f7 134#define msdos_bfd_reloc_name_lookup aout_32_reloc_name_lookup
252b5132
RH
135
136#define msdos_close_and_cleanup _bfd_generic_close_and_cleanup
137#define msdos_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
138#define msdos_new_section_hook _bfd_generic_new_section_hook
139#define msdos_get_section_contents _bfd_generic_get_section_contents
140#define msdos_get_section_contents_in_window \
141 _bfd_generic_get_section_contents_in_window
142#define msdos_bfd_get_relocated_section_contents \
143 bfd_generic_get_relocated_section_contents
144#define msdos_bfd_relax_section bfd_generic_relax_section
145#define msdos_bfd_gc_sections bfd_generic_gc_sections
8550eb6e 146#define msdos_bfd_merge_sections bfd_generic_merge_sections
72adc230 147#define msdos_bfd_is_group_section bfd_generic_is_group_section
e61463e1 148#define msdos_bfd_discard_group bfd_generic_discard_group
082b7297
L
149#define msdos_section_already_linked \
150 _bfd_generic_section_already_linked
252b5132 151#define msdos_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
e2d34d7d 152#define msdos_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
252b5132 153#define msdos_bfd_link_add_symbols _bfd_generic_link_add_symbols
2d653fc7 154#define msdos_bfd_link_just_syms _bfd_generic_link_just_syms
252b5132
RH
155#define msdos_bfd_final_link _bfd_generic_final_link
156#define msdos_bfd_link_split_section _bfd_generic_link_split_section
157#define msdos_set_arch_mach _bfd_generic_set_arch_mach
158
159#define msdos_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound
6cee3f79 160#define msdos_canonicalize_symtab _bfd_nosymbols_canonicalize_symtab
252b5132
RH
161#define msdos_print_symbol _bfd_nosymbols_print_symbol
162#define msdos_get_symbol_info _bfd_nosymbols_get_symbol_info
163#define msdos_find_nearest_line _bfd_nosymbols_find_nearest_line
4ab527b0 164#define msdos_find_inliner_info _bfd_nosymbols_find_inliner_info
252b5132 165#define msdos_get_lineno _bfd_nosymbols_get_lineno
3c9458e9 166#define msdos_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
252b5132
RH
167#define msdos_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
168#define msdos_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
169#define msdos_read_minisymbols _bfd_nosymbols_read_minisymbols
170#define msdos_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol
171
172#define msdos_canonicalize_reloc _bfd_norelocs_canonicalize_reloc
173#define msdos_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound
174#define msdos_32_bfd_link_split_section _bfd_generic_link_split_section
175
176const bfd_target i386msdos_vec =
252b5132 177 {
e4b17274
NC
178 "msdos", /* name */
179 bfd_target_msdos_flavour,
180 BFD_ENDIAN_LITTLE, /* target byte order */
181 BFD_ENDIAN_LITTLE, /* target headers byte order */
182 (EXEC_P), /* object flags */
183 (SEC_CODE | SEC_DATA | SEC_HAS_CONTENTS
184 | SEC_ALLOC | SEC_LOAD), /* section flags */
185 0, /* leading underscore */
186 ' ', /* ar_pad_char */
187 16, /* ar_max_namelen */
188 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
189 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
190 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
191 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
192 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
193 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
194
195 {
196 _bfd_dummy_target,
197 _bfd_dummy_target, /* bfd_check_format */
198 _bfd_dummy_target,
199 _bfd_dummy_target,
200 },
201 {
202 bfd_false,
203 msdos_mkobject,
204 _bfd_generic_mkarchive,
205 bfd_false,
206 },
207 { /* bfd_write_contents */
208 bfd_false,
209 msdos_write_object_contents,
210 _bfd_write_archive_contents,
211 bfd_false,
212 },
213
214 BFD_JUMP_TABLE_GENERIC (msdos),
215 BFD_JUMP_TABLE_COPY (_bfd_generic),
216 BFD_JUMP_TABLE_CORE (_bfd_nocore),
217 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
218 BFD_JUMP_TABLE_SYMBOLS (msdos),
219 BFD_JUMP_TABLE_RELOCS (msdos),
220 BFD_JUMP_TABLE_WRITE (msdos),
221 BFD_JUMP_TABLE_LINK (msdos),
222 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
223
224 NULL,
dc810e39 225
e4b17274
NC
226 (PTR) 0
227 };
252b5132
RH
228
229
This page took 0.393731 seconds and 4 git commands to generate.