X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Faout-encap.c;h=921bdd349c382f77e43d590ad504f0d94aa5d0c0;hb=dc810e3900d47ab2eea86d50231ff2e70b596847;hp=d6fe0fdd72e9bb8fb9e20757a5f2e7d51cbcbbf1;hpb=608de555e4cede078aadeb4aa91a98938b0e9077;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/aout-encap.c b/bfd/aout-encap.c index d6fe0fdd72..921bdd349c 100644 --- a/bfd/aout-encap.c +++ b/bfd/aout-encap.c @@ -1,5 +1,6 @@ /* BFD back-end for a.out files encapsulated with COFF headers. - Copyright (C) 1990-1991 Free Software Foundation, Inc. + Copyright 1990, 1991, 1994, 1995, 2000, 2001 + Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -15,97 +16,102 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* THIS MODULE IS NOT FINISHED. IT PROBABLY DOESN'T EVEN COMPILE. */ #if 0 -#define PAGE_SIZE 4096 -#define SEGMENT_SIZE PAGE_SIZE +#define TARGET_PAGE_SIZE 4096 +#define SEGMENT_SIZE TARGET_PAGE_SIZE #define TEXT_START_ADDR 0 -#define ARCH 32 #define BYTES_IN_WORD 4 #endif #include "bfd.h" -#include +#include "sysdep.h" #include "libbfd.h" -#include +#include "aout/aout64.h" #include "aout/stab_gnu.h" #include "aout/ar.h" #include "libaout.h" /* BFD a.out internal data structures */ -bfd_target *encap_real_callback (); +const bfd_target *encap_real_callback (); -bfd_target * -DEFUN(encap_object_p,(abfd), - bfd *abfd) +const bfd_target * +encap_object_p (abfd) + bfd *abfd; { unsigned char magicbuf[4]; /* Raw bytes of magic number from file */ unsigned long magic; /* Swapped magic number */ short coff_magic; struct external_exec exec_bytes; struct internal_exec exec; + bfd_size_type amt = sizeof (magicbuf); - bfd_error = system_call_error; + if (bfd_bread ((PTR) magicbuf, amt, abfd) != amt) + { + if (bfd_get_error () != bfd_error_system_call) + bfd_set_error (bfd_error_wrong_format); + return 0; + } - if (bfd_read ((PTR)magicbuf, 1, sizeof (magicbuf), abfd) != - sizeof (magicbuf)) - return 0; - - coff_magic = bfd_h_get_16 (abfd, magicbuf); + coff_magic = H_GET_16 (abfd, magicbuf); if (coff_magic != COFF_MAGIC) return 0; /* Not an encap coff file */ - __header_offset_temp==COFF_MAGIC ? sizeof(struct coffheader) : 0) - (fseek ((f), HEADER_OFFSET((f)), 1)) - - magic = bfd_h_get_32 (abfd, magicbuf); + magic = H_GET_32 (abfd, magicbuf); - if (N_BADMAG (*((struct internal_exec *) &magic))) return 0; + if (N_BADMAG (*((struct internal_exec *) &magic))) + return 0; - struct external_exec exec_bytes; - if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE) { - bfd_error = wrong_format; + if (bfd_seek (abfd, (file_ptr) sizeof (struct coffheader), SEEK_SET) != 0) return 0; - } - NAME(aout,swap_exec_header_in)(abfd, &exec_bytes, &exec); + + amt = EXEC_BYTES_SIZE; + if (bfd_bread ((PTR) &exec_bytes, amt, abfd) != amt) + { + if (bfd_get_error () != bfd_error_system_call) + bfd_set_error (bfd_error_wrong_format); + return 0; + } + NAME(aout,swap_exec_header_in) (abfd, &exec_bytes, &exec); return aout_32_some_aout_object_p (abfd, &exec, encap_realcallback); } /* Finish up the reading of a encapsulated-coff a.out file header */ -bfd_target * -DEFUN(encap_real_callback,(abfd), - bfd *abfd) +const bfd_target * +encap_real_callback (abfd) + bfd *abfd; { struct internal_exec *execp = exec_hdr (abfd); - - MY(callback)(abfd, execp); - + + MY(callback) (abfd, execp); + /* If we have a coff header, it can give us better values for text_start and exec_data_start. This is particularly useful for remote debugging of embedded systems. */ if (N_FLAGS(exec_aouthdr) & N_FLAGS_COFF_ENCAPSULATE) - { - struct coffheader ch; - int val; - val = lseek (execchan, -(sizeof (AOUTHDR) + sizeof (ch)), 1); - if (val == -1) - perror_with_name (filename); - val = myread (execchan, &ch, sizeof (ch)); - if (val < 0) - perror_with_name (filename); - text_start = ch.text_start; - exec_data_start = ch.data_start; - } else - { - text_start = - IS_OBJECT_FILE (exec_aouthdr) ? 0 : N_TXTADDR (exec_aouthdr); - exec_data_start = IS_OBJECT_FILE (exec_aouthdr) - ? exec_aouthdr.a_text : N_DATADDR (exec_aouthdr); - } + { + struct coffheader ch; + int val; + val = lseek (execchan, -(sizeof (AOUTHDR) + sizeof (ch)), 1); + if (val == -1) + perror_with_name (filename); + val = myread (execchan, &ch, sizeof (ch)); + if (val < 0) + perror_with_name (filename); + text_start = ch.text_start; + exec_data_start = ch.data_start; + } + else + { + text_start = + IS_OBJECT_FILE (exec_aouthdr) ? 0 : N_TXTADDR (exec_aouthdr); + exec_data_start = (IS_OBJECT_FILE (exec_aouthdr) + ? exec_aouthdr.a_text + : N_DATADDR (exec_aouthdr)); + } /* Determine the architecture and machine type of the object file. */ bfd_default_set_arch_mach(abfd, bfd_arch_m68k, 0); /* FIXME */ @@ -118,17 +124,17 @@ DEFUN(encap_real_callback,(abfd), file header, symbols, and relocation. */ boolean -DEFUN(encap_write_object_contents,(abfd), - bfd *abfd) +encap_write_object_contents (abfd) + bfd *abfd; { bfd_size_type data_pad = 0; struct external_exec exec_bytes; struct internal_exec *execp = exec_hdr (abfd); -/****** FIXME: Fragments from the old GNU LD program for dealing with - encap coff. */ -struct coffheader coffheader; -int need_coff_header; + /* FIXME: Fragments from the old GNU LD program for dealing with + encap coff. */ + struct coffheader coffheader; + int need_coff_header; /* Determine whether to count the header as part of the text size, and initialize the text size accordingly. @@ -145,7 +151,7 @@ int need_coff_header; { need_coff_header = 1; /* set this flag now, since it will change the values of N_TXTOFF, etc */ - N_SET_FLAGS (outheader, N_FLAGS_COFF_ENCAPSULATE); + N_SET_FLAGS (outheader, aout_backend_info (abfd)->exec_hdr_flags); text_size += sizeof (struct coffheader); } #endif @@ -229,5 +235,6 @@ int need_coff_header; #define MY_write_object_content encap_write_object_contents #define MY_object_p encap_object_p +#define MY_exec_hdr_flags N_FLAGS_COFF_ENCAPSULATE #include "aout-target.h"