1 |
/* BFD back-end for os9000 i386 binaries. |
/* BFD back-end for os9000 i386 binaries. |
2 |
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, 2002 |
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001, 2002, |
3 |
Free Software Foundation, Inc. |
2004, 2005 Free Software Foundation, Inc. |
4 |
Written by Cygnus Support. |
Written by Cygnus Support. |
5 |
|
|
6 |
This file is part of BFD, the Binary File Descriptor library. |
This file is part of BFD, the Binary File Descriptor library. |
27 |
#include "libaout.h" /* BFD a.out internal data structures */ |
#include "libaout.h" /* BFD a.out internal data structures */ |
28 |
#include "os9k.h" |
#include "os9k.h" |
29 |
|
|
30 |
static const bfd_target * os9k_callback PARAMS ((bfd *)); |
static const bfd_target * os9k_callback |
31 |
static const bfd_target * os9k_object_p PARAMS ((bfd *)); |
PARAMS ((bfd *)); |
32 |
static int os9k_sizeof_headers PARAMS ((bfd *, boolean)); |
static const bfd_target * os9k_object_p |
33 |
boolean os9k_swap_exec_header_in PARAMS ((bfd *, mh_com *, struct internal_exec *)); |
PARAMS ((bfd *)); |
34 |
|
static int os9k_sizeof_headers |
35 |
|
PARAMS ((bfd *, bfd_boolean)); |
36 |
|
bfd_boolean os9k_swap_exec_header_in |
37 |
|
PARAMS ((bfd *, mh_com *, struct internal_exec *)); |
38 |
|
|
39 |
/* Swaps the information in an executable header taken from a raw byte |
/* Swaps the information in an executable header taken from a raw byte |
40 |
stream memory image, into the internal exec_header structure. */ |
stream memory image, into the internal exec_header structure. */ |
41 |
boolean |
bfd_boolean |
42 |
os9k_swap_exec_header_in (abfd, raw_bytes, execp) |
os9k_swap_exec_header_in (abfd, raw_bytes, execp) |
43 |
bfd *abfd; |
bfd *abfd; |
44 |
mh_com *raw_bytes; |
mh_com *raw_bytes; |
63 |
!= sizeof (dmemstart)) |
!= sizeof (dmemstart)) |
64 |
|| (bfd_bread (&dmemsize, (bfd_size_type) sizeof (dmemsize), abfd) |
|| (bfd_bread (&dmemsize, (bfd_size_type) sizeof (dmemsize), abfd) |
65 |
!= sizeof (dmemsize))) |
!= sizeof (dmemsize))) |
66 |
return false; |
return FALSE; |
67 |
|
|
68 |
execp->a_tload = 0; |
execp->a_tload = 0; |
69 |
execp->a_dload = H_GET_32 (abfd, (unsigned char *) &dmemstart); |
execp->a_dload = H_GET_32 (abfd, (unsigned char *) &dmemstart); |
74 |
execp->a_trsize = 0; |
execp->a_trsize = 0; |
75 |
execp->a_drsize = 0; |
execp->a_drsize = 0; |
76 |
|
|
77 |
return true; |
return TRUE; |
78 |
} |
} |
79 |
|
|
|
#if 0 |
|
|
/* Swaps the information in an internal exec header structure into the |
|
|
supplied buffer ready for writing to disk. */ |
|
|
|
|
|
void os9k_swap_exec_header_out |
|
|
PARAMS ((bfd *, struct internal_exec *, struct mh_com *)); |
|
|
|
|
|
void |
|
|
os9k_swap_exec_header_out (abfd, execp, raw_bytes) |
|
|
bfd *abfd; |
|
|
struct internal_exec *execp; |
|
|
mh_com *raw_bytes; |
|
|
{ |
|
|
mh_com *bytes = (mh_com *) raw_bytes; |
|
|
|
|
|
/* Now fill in fields in the raw data, from the fields in the exec struct. */ |
|
|
H_PUT_32 (abfd, execp->a_info, bytes->e_info); |
|
|
H_PUT_32 (abfd, execp->a_text, bytes->e_text); |
|
|
H_PUT_32 (abfd, execp->a_data, bytes->e_data); |
|
|
H_PUT_32 (abfd, execp->a_bss, bytes->e_bss); |
|
|
H_PUT_32 (abfd, execp->a_syms, bytes->e_syms); |
|
|
H_PUT_32 (abfd, execp->a_entry, bytes->e_entry); |
|
|
H_PUT_32 (abfd, execp->a_trsize, bytes->e_trsize); |
|
|
H_PUT_32 (abfd, execp->a_drsize, bytes->e_drsize); |
|
|
H_PUT_32 (abfd, execp->a_tload, bytes->e_tload); |
|
|
H_PUT_32 (abfd, execp->a_dload, bytes->e_dload); |
|
|
bytes->e_talign[0] = execp->a_talign; |
|
|
bytes->e_dalign[0] = execp->a_dalign; |
|
|
bytes->e_balign[0] = execp->a_balign; |
|
|
bytes->e_relaxable[0] = execp->a_relaxable; |
|
|
} |
|
|
|
|
|
#endif /* 0 */ |
|
|
|
|
80 |
static const bfd_target * |
static const bfd_target * |
81 |
os9k_object_p (abfd) |
os9k_object_p (abfd) |
82 |
bfd *abfd; |
bfd *abfd; |
136 |
obj_datasec (abfd)->vma = execp->a_dload; |
obj_datasec (abfd)->vma = execp->a_dload; |
137 |
|
|
138 |
/* And reload the sizes, since the aout module zaps them. */ |
/* And reload the sizes, since the aout module zaps them. */ |
139 |
obj_textsec (abfd)->_raw_size = execp->a_text; |
obj_textsec (abfd)->size = execp->a_text; |
140 |
|
|
141 |
bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section. */ |
bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section. */ |
142 |
obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign); |
obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign); |
156 |
return abfd->xvec; |
return abfd->xvec; |
157 |
} |
} |
158 |
|
|
|
#if 0 |
|
|
struct bout_data_struct |
|
|
{ |
|
|
struct aoutdata a; |
|
|
struct internal_exec e; |
|
|
}; |
|
|
|
|
|
static boolean |
|
|
os9k_mkobject (abfd) |
|
|
bfd *abfd; |
|
|
{ |
|
|
struct bout_data_struct *rawptr; |
|
|
bfd_size_type amt = sizeof (struct bout_data_struct); |
|
|
|
|
|
rawptr = (struct bout_data_struct *) bfd_zalloc (abfd, amt); |
|
|
if (rawptr == NULL) |
|
|
return false; |
|
|
|
|
|
abfd->tdata.bout_data = rawptr; |
|
|
exec_hdr (abfd) = &rawptr->e; |
|
|
|
|
|
obj_textsec (abfd) = (asection *) NULL; |
|
|
obj_datasec (abfd) = (asection *) NULL; |
|
|
obj_bsssec (abfd) = (asection *) NULL; |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
static boolean |
|
|
os9k_write_object_contents (abfd) |
|
|
bfd *abfd; |
|
|
{ |
|
|
struct external_exec swapped_hdr; |
|
|
|
|
|
if (! aout_32_make_sections (abfd)) |
|
|
return false; |
|
|
|
|
|
exec_hdr (abfd)->a_info = BMAGIC; |
|
|
|
|
|
exec_hdr (abfd)->a_text = obj_textsec (abfd)->_raw_size; |
|
|
exec_hdr (abfd)->a_data = obj_datasec (abfd)->_raw_size; |
|
|
exec_hdr (abfd)->a_bss = obj_bsssec (abfd)->_raw_size; |
|
|
exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) * sizeof (struct nlist); |
|
|
exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); |
|
|
exec_hdr (abfd)->a_trsize = ((obj_textsec (abfd)->reloc_count) * |
|
|
sizeof (struct relocation_info)); |
|
|
exec_hdr (abfd)->a_drsize = ((obj_datasec (abfd)->reloc_count) * |
|
|
sizeof (struct relocation_info)); |
|
|
|
|
|
exec_hdr (abfd)->a_talign = obj_textsec (abfd)->alignment_power; |
|
|
exec_hdr (abfd)->a_dalign = obj_datasec (abfd)->alignment_power; |
|
|
exec_hdr (abfd)->a_balign = obj_bsssec (abfd)->alignment_power; |
|
|
|
|
|
exec_hdr (abfd)->a_tload = obj_textsec (abfd)->vma; |
|
|
exec_hdr (abfd)->a_dload = obj_datasec (abfd)->vma; |
|
|
|
|
|
bout_swap_exec_header_out (abfd, exec_hdr (abfd), &swapped_hdr); |
|
|
|
|
|
if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 |
|
|
|| bfd_bwrite ((PTR) & swapped_hdr, (bfd_size_type) EXEC_BYTES_SIZE, |
|
|
abfd) != EXEC_BYTES_SIZE) |
|
|
return false; |
|
|
|
|
|
/* Now write out reloc info, followed by syms and strings. */ |
|
|
if (bfd_get_symcount (abfd) != 0) |
|
|
{ |
|
|
if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (*exec_hdr (abfd))), SEEK_SET) |
|
|
!= 0) |
|
|
return false; |
|
|
|
|
|
if (!aout_32_write_syms (abfd)) |
|
|
return false; |
|
|
|
|
|
if (bfd_seek (abfd, (file_ptr) (N_TROFF (*exec_hdr (abfd))), SEEK_SET) |
|
|
!= 0) |
|
|
return false; |
|
|
|
|
|
if (!b_out_squirt_out_relocs (abfd, obj_textsec (abfd))) |
|
|
return false; |
|
|
if (bfd_seek (abfd, (file_ptr) (N_DROFF (*exec_hdr (abfd))), SEEK_SET) |
|
|
!= 0) |
|
|
return false; |
|
|
|
|
|
if (!b_out_squirt_out_relocs (abfd, obj_datasec (abfd))) |
|
|
return false; |
|
|
} |
|
|
return true; |
|
|
} |
|
|
|
|
|
static boolean |
|
|
os9k_set_section_contents (abfd, section, location, offset, count) |
|
|
bfd *abfd; |
|
|
sec_ptr section; |
|
|
unsigned char *location; |
|
|
file_ptr offset; |
|
|
int count; |
|
|
{ |
|
|
|
|
|
if (! abfd->output_has_begun) |
|
|
{ /* set by bfd.c handler */ |
|
|
if (! aout_32_make_sections (abfd)) |
|
|
return false; |
|
|
|
|
|
obj_textsec (abfd)->filepos = sizeof (struct internal_exec); |
|
|
obj_datasec (abfd)->filepos = obj_textsec (abfd)->filepos |
|
|
+ obj_textsec (abfd)->_raw_size; |
|
|
|
|
|
} |
|
|
/* Regardless, once we know what we're doing, we might as well get going. */ |
|
|
if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0) |
|
|
return false; |
|
|
|
|
|
if (count != 0) |
|
|
return bfd_bwrite ((PTR) location, (bfd_size_type) count, abfd) == count; |
|
|
|
|
|
return true; |
|
|
} |
|
|
#endif /* 0 */ |
|
|
|
|
159 |
static int |
static int |
160 |
os9k_sizeof_headers (ignore_abfd, ignore) |
os9k_sizeof_headers (ignore_abfd, ignore) |
161 |
bfd *ignore_abfd ATTRIBUTE_UNUSED; |
bfd *ignore_abfd ATTRIBUTE_UNUSED; |
162 |
boolean ignore ATTRIBUTE_UNUSED; |
bfd_boolean ignore ATTRIBUTE_UNUSED; |
163 |
{ |
{ |
164 |
return sizeof (struct internal_exec); |
return sizeof (struct internal_exec); |
165 |
} |
} |
180 |
#define os9k_bfd_relax_section bfd_generic_relax_section |
#define os9k_bfd_relax_section bfd_generic_relax_section |
181 |
#define os9k_bfd_gc_sections bfd_generic_gc_sections |
#define os9k_bfd_gc_sections bfd_generic_gc_sections |
182 |
#define os9k_bfd_merge_sections bfd_generic_merge_sections |
#define os9k_bfd_merge_sections bfd_generic_merge_sections |
183 |
|
#define os9k_bfd_is_group_section bfd_generic_is_group_section |
184 |
#define os9k_bfd_discard_group bfd_generic_discard_group |
#define os9k_bfd_discard_group bfd_generic_discard_group |
185 |
|
#define os9k_section_already_linked \ |
186 |
|
_bfd_generic_section_already_linked |
187 |
#define os9k_bfd_link_hash_table_create _bfd_generic_link_hash_table_create |
#define os9k_bfd_link_hash_table_create _bfd_generic_link_hash_table_create |
188 |
#define os9k_bfd_link_hash_table_free _bfd_generic_link_hash_table_free |
#define os9k_bfd_link_hash_table_free _bfd_generic_link_hash_table_free |
189 |
#define os9k_bfd_link_add_symbols _bfd_generic_link_add_symbols |
#define os9k_bfd_link_add_symbols _bfd_generic_link_add_symbols |