source: branches/libc-0.6/src/binutils/bfd/i386msdos.c

Last change on this file was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 8.2 KB
Line 
1/* BFD back-end for MS-DOS executables.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2002
3 Free Software Foundation, Inc.
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
13 the Free Software Foundation; either version 2 of the License, or
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
23 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24
25
26#include "bfd.h"
27#include "sysdep.h"
28#include "libbfd.h"
29#include "libaout.h"
30
31#if 0
32struct exe_header
33{
34 unsigned short magic;
35 unsigned short bytes_in_last_page;
36 unsigned short npages; /* number of 512-byte "pages" including this header */
37 unsigned short nrelocs;
38 unsigned short header_paras; /* number of 16-byte paragraphs in header */
39 unsigned short reserved;
40 unsigned short load_switch;
41 unsigned short ss_ofs;
42 unsigned short sp;
43 unsigned short checksum;
44 unsigned short ip;
45 unsigned short cs_ofs;
46 unsigned short reloc_ofs;
47 unsigned short reserved2;
48 unsigned short something1;
49 unsigned short something2;
50 unsigned short something3;
51};
52#endif
53
54#define EXE_MAGIC 0x5a4d
55#define EXE_LOAD_HIGH 0x0000
56#define EXE_LOAD_LOW 0xffff
57#define EXE_PAGE_SIZE 512
58
59static int msdos_sizeof_headers
60 PARAMS ((bfd *, bfd_boolean));
61static bfd_boolean msdos_write_object_contents
62 PARAMS ((bfd *));
63static bfd_boolean msdos_set_section_contents
64 PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
65
66static int
67msdos_sizeof_headers (abfd, exec)
68 bfd *abfd ATTRIBUTE_UNUSED;
69 bfd_boolean exec ATTRIBUTE_UNUSED;
70{
71 return 0;
72}
73
74static bfd_boolean
75msdos_write_object_contents (abfd)
76 bfd *abfd;
77{
78 static char hdr[EXE_PAGE_SIZE];
79 file_ptr outfile_size = sizeof(hdr);
80 bfd_vma high_vma = 0;
81 asection *sec;
82
83 /* Find the total size of the program on disk and in memory. */
84 for (sec = abfd->sections; sec != (asection *) NULL; sec = sec->next)
85 {
86 if (bfd_get_section_size_before_reloc (sec) == 0)
87 continue;
88 if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
89 {
90 bfd_vma sec_vma = bfd_get_section_vma (abfd, sec)
91 + bfd_get_section_size_before_reloc (sec);
92 if (sec_vma > high_vma)
93 high_vma = sec_vma;
94 }
95 if (bfd_get_section_flags (abfd, sec) & SEC_LOAD)
96 {
97 file_ptr sec_end = sizeof(hdr)
98 + bfd_get_section_vma (abfd, sec)
99 + bfd_get_section_size_before_reloc (sec);
100 if (sec_end > outfile_size)
101 outfile_size = sec_end;
102 }
103 }
104
105 /* Make sure the program isn't too big. */
106 if (high_vma > (bfd_vma)0xffff)
107 {
108 bfd_set_error(bfd_error_file_too_big);
109 return FALSE;
110 }
111
112 /* Constants. */
113 H_PUT_16 (abfd, EXE_MAGIC, &hdr[0]);
114 H_PUT_16 (abfd, EXE_PAGE_SIZE / 16, &hdr[8]);
115 H_PUT_16 (abfd, EXE_LOAD_LOW, &hdr[12]);
116 H_PUT_16 (abfd, 0x3e, &hdr[24]);
117 H_PUT_16 (abfd, 0x0001, &hdr[28]); /* XXX??? */
118 H_PUT_16 (abfd, 0x30fb, &hdr[30]); /* XXX??? */
119 H_PUT_16 (abfd, 0x726a, &hdr[32]); /* XXX??? */
120
121 /* Bytes in last page (0 = full page). */
122 H_PUT_16 (abfd, outfile_size & (EXE_PAGE_SIZE - 1), &hdr[2]);
123
124 /* Number of pages. */
125 H_PUT_16 (abfd, (outfile_size + EXE_PAGE_SIZE - 1) / EXE_PAGE_SIZE, &hdr[4]);
126
127 /* Set the initial stack pointer to the end of the bss.
128 The program's crt0 code must relocate it to a real stack. */
129 H_PUT_16 (abfd, high_vma, &hdr[16]);
130
131 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
132 || bfd_bwrite (hdr, (bfd_size_type) sizeof(hdr), abfd) != sizeof(hdr))
133 return FALSE;
134
135 return TRUE;
136}
137
138static bfd_boolean
139msdos_set_section_contents (abfd, section, location, offset, count)
140 bfd *abfd;
141 sec_ptr section;
142 PTR location;
143 file_ptr offset;
144 bfd_size_type count;
145{
146
147 if (count == 0)
148 return TRUE;
149
150 section->filepos = EXE_PAGE_SIZE + bfd_get_section_vma (abfd, section);
151
152 if (bfd_get_section_flags (abfd, section) & SEC_LOAD)
153 {
154 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
155 || bfd_bwrite (location, count, abfd) != count)
156 return FALSE;
157 }
158
159 return TRUE;
160}
161
162
163
164#define msdos_mkobject aout_32_mkobject
165#define msdos_make_empty_symbol aout_32_make_empty_symbol
166#define msdos_bfd_reloc_type_lookup aout_32_reloc_type_lookup
167
168#define msdos_close_and_cleanup _bfd_generic_close_and_cleanup
169#define msdos_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
170#define msdos_new_section_hook _bfd_generic_new_section_hook
171#define msdos_get_section_contents _bfd_generic_get_section_contents
172#define msdos_get_section_contents_in_window \
173 _bfd_generic_get_section_contents_in_window
174#define msdos_bfd_get_relocated_section_contents \
175 bfd_generic_get_relocated_section_contents
176#define msdos_bfd_relax_section bfd_generic_relax_section
177#define msdos_bfd_gc_sections bfd_generic_gc_sections
178#define msdos_bfd_merge_sections bfd_generic_merge_sections
179#define msdos_bfd_discard_group bfd_generic_discard_group
180#define msdos_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
181#define msdos_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
182#define msdos_bfd_link_add_symbols _bfd_generic_link_add_symbols
183#define msdos_bfd_link_just_syms _bfd_generic_link_just_syms
184#define msdos_bfd_final_link _bfd_generic_final_link
185#define msdos_bfd_link_split_section _bfd_generic_link_split_section
186#define msdos_set_arch_mach _bfd_generic_set_arch_mach
187
188#define msdos_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound
189#define msdos_get_symtab _bfd_nosymbols_get_symtab
190#define msdos_print_symbol _bfd_nosymbols_print_symbol
191#define msdos_get_symbol_info _bfd_nosymbols_get_symbol_info
192#define msdos_find_nearest_line _bfd_nosymbols_find_nearest_line
193#define msdos_get_lineno _bfd_nosymbols_get_lineno
194#define msdos_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
195#define msdos_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
196#define msdos_read_minisymbols _bfd_nosymbols_read_minisymbols
197#define msdos_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol
198
199#define msdos_canonicalize_reloc _bfd_norelocs_canonicalize_reloc
200#define msdos_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound
201#define msdos_32_bfd_link_split_section _bfd_generic_link_split_section
202
203const bfd_target i386msdos_vec =
204 {
205 "msdos", /* name */
206 bfd_target_msdos_flavour,
207 BFD_ENDIAN_LITTLE, /* target byte order */
208 BFD_ENDIAN_LITTLE, /* target headers byte order */
209 (EXEC_P), /* object flags */
210 (SEC_CODE | SEC_DATA | SEC_HAS_CONTENTS
211 | SEC_ALLOC | SEC_LOAD), /* section flags */
212 0, /* leading underscore */
213 ' ', /* ar_pad_char */
214 16, /* ar_max_namelen */
215 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
216 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
217 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
218 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
219 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
220 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
221
222 {
223 _bfd_dummy_target,
224 _bfd_dummy_target, /* bfd_check_format */
225 _bfd_dummy_target,
226 _bfd_dummy_target,
227 },
228 {
229 bfd_false,
230 msdos_mkobject,
231 _bfd_generic_mkarchive,
232 bfd_false,
233 },
234 { /* bfd_write_contents */
235 bfd_false,
236 msdos_write_object_contents,
237 _bfd_write_archive_contents,
238 bfd_false,
239 },
240
241 BFD_JUMP_TABLE_GENERIC (msdos),
242 BFD_JUMP_TABLE_COPY (_bfd_generic),
243 BFD_JUMP_TABLE_CORE (_bfd_nocore),
244 BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
245 BFD_JUMP_TABLE_SYMBOLS (msdos),
246 BFD_JUMP_TABLE_RELOCS (msdos),
247 BFD_JUMP_TABLE_WRITE (msdos),
248 BFD_JUMP_TABLE_LINK (msdos),
249 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
250
251 NULL,
252
253 (PTR) 0
254 };
255
256
Note: See TracBrowser for help on using the repository browser.