mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-14 12:53:34 +08:00
08dedd6631
bfd/ChangeLog: * bfd-in.h (startswith): Add startswith function. (CONST_STRNEQ): Remove. * bfd-in2.h (startswith): Regenerate with make headers. * archive.c (bfd_slurp_armap): Replace usage of CONST_STRNEQ with startswith. (_bfd_slurp_extended_name_table): Likewise. * archive64.c (_bfd_archive_64_bit_slurp_armap): Likewise. * bfd.c (bfd_get_sign_extend_vma): Likewise. (bfd_convert_section_size): Likewise. (bfd_convert_section_contents): Likewise. * coff-stgo32.c (go32exe_create_stub): Likewise. (go32exe_check_format): Likewise. * coffcode.h (styp_to_sec_flags): Likewise. (GNU_DEBUGALTLINK): Likewise. * coffgen.c (_bfd_coff_section_already_linked): Likewise. (coff_gc_sweep): Likewise. (bfd_coff_gc_sections): Likewise. * cofflink.c (coff_link_add_symbols): Likewise. (process_embedded_commands): Likewise. * compress.c (bfd_is_section_compressed_with_header): Likewise. (bfd_init_section_decompress_status): Likewise. * dwarf2.c (find_debug_info): Likewise. (place_sections): Likewise. * ecoff.c (_bfd_ecoff_slurp_armap): Likewise. * elf-m10300.c (_bfd_mn10300_elf_size_dynamic_sections): Likewise. * elf.c (_bfd_elf_make_section_from_shdr): Likewise. (assign_section_numbers): Likewise. (elfcore_grok_win32pstatus): Likewise. * elf32-arm.c (cmse_scan): Likewise. (elf32_arm_gc_mark_extra_sections): Likewise. (elf32_arm_size_dynamic_sections): Likewise. (is_arm_elf_unwind_section_name): Likewise. * elf32-bfin.c (bfin_size_dynamic_sections): Likewise. * elf32-cr16.c (_bfd_cr16_elf_size_dynamic_sections): Likewise. * elf32-cris.c (elf_cris_size_dynamic_sections): Likewise. * elf32-csky.c (csky_elf_size_dynamic_sections): Likewise. * elf32-hppa.c (elf32_hppa_size_dynamic_sections): Likewise. * elf32-iq2000.c (iq2000_elf_check_relocs): Likewise. * elf32-lm32.c (lm32_elf_size_dynamic_sections): Likewise. * elf32-m32r.c (m32r_elf_size_dynamic_sections): Likewise. * elf32-m68k.c (elf_m68k_size_dynamic_sections): Likewise. * elf32-metag.c (elf_metag_size_dynamic_sections): Likewise. * elf32-msp430.c (msp430_elf_relax_delete_bytes): Likewise. * elf32-nios2.c (nios2_elf32_size_dynamic_sections): Likewise. * elf32-or1k.c (or1k_elf_size_dynamic_sections): Likewise. * elf32-ppc.c (ppc_elf_size_dynamic_sections): Likewise. * elf32-s390.c (elf_s390_size_dynamic_sections): Likewise. * elf32-score.c (s3_bfd_score_elf_size_dynamic_sections): Likewise. * elf32-score7.c (s7_bfd_score_elf_size_dynamic_sections): Likewise. * elf32-sh.c (sh_elf_size_dynamic_sections): Likewise. * elf32-tic6x.c (is_tic6x_elf_unwind_section_name): Likewise. (elf32_tic6x_size_dynamic_sections): Likewise. * elf32-vax.c (elf_vax_size_dynamic_sections): Likewise. * elf32-xtensa.c (elf_xtensa_size_dynamic_sections): Likewise. (xtensa_is_insntable_section): Likewise. (xtensa_is_littable_section): Likewise. (xtensa_is_proptable_section): Likewise. (xtensa_property_section_name): Likewise. (xtensa_callback_required_dependence): Likewise. * elf64-alpha.c (elf64_alpha_size_dynamic_sections): Likewise. * elf64-hppa.c (elf64_hppa_size_dynamic_sections): Likewise. * elf64-ia64-vms.c (is_unwind_section_name): Likewise. (get_reloc_section): Likewise. (elf64_ia64_size_dynamic_sections): Likewise. (elf64_ia64_object_p): Likewise. * elf64-mmix.c (mmix_elf_add_symbol_hook): Likewise. * elf64-ppc.c (ppc64_elf_size_dynamic_sections): Likewise. * elf64-s390.c (elf_s390_size_dynamic_sections): Likewise. * elflink.c (elf_link_add_object_symbols): Likewise. (_bfd_elf_gc_mark_extra_sections): Likewise. (bfd_elf_parse_eh_frame_entries): Likewise. (_bfd_elf_section_already_linked): Likewise. * elfnn-aarch64.c (elfNN_aarch64_size_dynamic_sections): Likewise. * elfnn-ia64.c (is_unwind_section_name): Likewise. (elfNN_ia64_size_dynamic_sections): Likewise. (elfNN_ia64_object_p): Likewise. * elfxx-mips.c (FN_STUB_P): Likewise. (CALL_STUB_P): Likewise. (CALL_FP_STUB_P): Likewise. (_bfd_mips_elf_section_from_shdr): Likewise. (_bfd_mips_elf_fake_sections): Likewise. (_bfd_mips_elf_size_dynamic_sections): Likewise. (_bfd_mips_final_write_processing): Likewise. (_bfd_mips_elf_final_link): Likewise. * elfxx-sparc.c (_bfd_sparc_elf_size_dynamic_sections): Likewise. * elfxx-x86.c (elf_i386_is_reloc_section): Likewise. (elf_x86_64_is_reloc_section): Likewise. * hpux-core.c (thread_section_p): Likewise. * libcoff.h (bfd_pei_p): Likewise. * linker.c (REAL): Likewise. (unwrap_hash_lookup): Likewise. (_bfd_generic_link_add_one_symbol): Likewise. * mmo.c (mmo_internal_write_section): Likewise. * osf-core.c (osf_core_core_file_p): Likewise. * pef.c (bfd_pef_print_symbol): Likewise. * pei-x86_64.c (pex64_print_all_pdata_sections): Likewise. * som.c (som_slurp_symbol_table): Likewise. (som_slurp_armap): Likewise. * wasm-module.c (wasm_compute_custom_section_file_position): Likewise. binutils/ChangeLog: * dlltool.c (scan_drectve_symbols): Replace usage of CONST_STRNEQ with startswith. * emul_aix.c (ar_emul_aix_parse_arg): Likewise. * objcopy.c (is_mergeable_note_section): Likewise. * objdump.c (dump_dwarf_section): Likewise. * prdbg.c (pr_method_type): Likewise. (pr_class_baseclass): Likewise. (tg_class_baseclass): Likewise. * readelf.c (process_lto_symbol_tables): Likewise. * stabs.c (ULLHIGH): Likewise. (parse_stab_argtypes): Likewise. (stab_demangle_function_name): Likewise. gas/ChangeLog: * config/tc-i386.c (md_parse_option): Replace usage of CONST_STRNEQ with startswith. (x86_64_section_word): Likewise. * config/tc-sparc.c (md_parse_option): Likewise. gdb/ChangeLog: * arm-tdep.c (show_disassembly_style_sfunc): Replace usage of CONST_STRNEQ with startswith. (_initialize_arm_tdep): Likewise. ld/ChangeLog: * emultempl/aix.em: Replace usage of CONST_STRNEQ with startswith. * emultempl/beos.em: Likewise. * emultempl/elf.em: Likewise. * emultempl/pe.em: Likewise. * emultempl/pep.em: Likewise. * emultempl/xtensaelf.em: Likewise. * ldctor.c (ctor_prio): Likewise. * ldelf.c (ldelf_try_needed): Likewise. (ldelf_parse_ld_so_conf): Likewise. (ldelf_after_open): Likewise. (output_rel_find): Likewise. (ldelf_place_orphan): Likewise. * ldfile.c (ldfile_add_library_path): Likewise. * ldlang.c (lang_add_input_file): Likewise. * ldmain.c (get_sysroot): Likewise. (get_emulation): Likewise. (add_archive_element): Likewise. * ldwrite.c (unsplittable_name): Likewise. (clone_section): Likewise. * lexsup.c (parse_args): Likewise. * pe-dll.c (is_import): Likewise. (pe_implied_import_dll): Likewise. opcodes/ChangeLog: * aarch64-dis.c (parse_aarch64_dis_option): Replace usage of CONST_STRNEQ with startswith. * arc-dis.c (parse_option): Likewise. * arm-dis.c (parse_arm_disassembler_options): Likewise. * cris-dis.c (print_with_operands): Likewise. * h8300-dis.c (bfd_h8_disassemble): Likewise. * i386-dis.c (print_insn): Likewise. * ia64-gen.c (fetch_insn_class): Likewise. (parse_resource_users): Likewise. (in_iclass): Likewise. (lookup_specifier): Likewise. (insert_opcode_dependencies): Likewise. * mips-dis.c (parse_mips_ase_option): Likewise. (parse_mips_dis_option): Likewise. * s390-dis.c (disassemble_init_s390): Likewise. * wasm32-dis.c (parse_wasm32_disassembler_options): Likewise.
383 lines
11 KiB
C
383 lines
11 KiB
C
/* BFD back-end for Intel 386 COFF files (DJGPP variant with a stub).
|
|
Copyright (C) 1997-2021 Free Software Foundation, Inc.
|
|
Written by Robert Hoehne.
|
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
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., 51 Franklin Street - Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
/* This file handles now also stubbed coff images. The stub is a small
|
|
DOS executable program before the coff image to load it in memory
|
|
and execute it. This is needed, because DOS cannot run coff files.
|
|
|
|
The COFF image is loaded in memory without the stub attached, so
|
|
all offsets are relative to the beginning of the image, not the
|
|
actual file. We handle this in bfd by setting bfd->origin to where
|
|
the COFF image starts. */
|
|
|
|
#define TARGET_SYM i386_coff_go32stubbed_vec
|
|
#define TARGET_NAME "coff-go32-exe"
|
|
#define TARGET_UNDERSCORE '_'
|
|
#define COFF_GO32_EXE
|
|
#define COFF_LONG_SECTION_NAMES
|
|
#define COFF_SUPPORT_GNU_LINKONCE
|
|
#define COFF_LONG_FILENAMES
|
|
|
|
#define COFF_SECTION_ALIGNMENT_ENTRIES \
|
|
{ COFF_SECTION_NAME_EXACT_MATCH (".data"), \
|
|
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
|
|
{ COFF_SECTION_NAME_EXACT_MATCH (".text"), \
|
|
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
|
|
{ COFF_SECTION_NAME_PARTIAL_MATCH (".debug"), \
|
|
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
|
|
{ COFF_SECTION_NAME_PARTIAL_MATCH (".gnu.linkonce.wi"), \
|
|
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }
|
|
|
|
/* Section contains extended relocations. */
|
|
#define IMAGE_SCN_LNK_NRELOC_OVFL (0x01000000)
|
|
|
|
#include "sysdep.h"
|
|
#include "bfd.h"
|
|
#include "coff/msdos.h"
|
|
|
|
static bfd_cleanup go32exe_check_format (bfd *);
|
|
static bfd_boolean go32exe_write_object_contents (bfd *);
|
|
static bfd_boolean go32exe_mkobject (bfd *);
|
|
static bfd_boolean go32exe_copy_private_bfd_data (bfd *, bfd *);
|
|
|
|
/* Defined in coff-go32.c. */
|
|
bfd_boolean _bfd_go32_mkobject (bfd *);
|
|
void _bfd_go32_swap_scnhdr_in (bfd *, void *, void *);
|
|
unsigned int _bfd_go32_swap_scnhdr_out (bfd *, void *, void *);
|
|
|
|
#define COFF_CHECK_FORMAT go32exe_check_format
|
|
#define COFF_WRITE_CONTENTS go32exe_write_object_contents
|
|
#define coff_mkobject go32exe_mkobject
|
|
#define coff_bfd_copy_private_bfd_data go32exe_copy_private_bfd_data
|
|
#define coff_SWAP_scnhdr_in _bfd_go32_swap_scnhdr_in
|
|
#define coff_SWAP_scnhdr_out _bfd_go32_swap_scnhdr_out
|
|
|
|
#include "coff-i386.c"
|
|
|
|
/* This macro is used, because I cannot assume the endianness of the
|
|
host system. */
|
|
#define _H(index) (H_GET_16 (abfd, (header + index * 2)))
|
|
|
|
/* These bytes are a 2048-byte DOS executable, which loads the COFF
|
|
image into memory and then runs it. It is called 'stub'. */
|
|
#define GO32EXE_DEFAULT_STUB_SIZE 2048
|
|
static const unsigned char go32exe_default_stub[GO32EXE_DEFAULT_STUB_SIZE] =
|
|
{
|
|
#include "go32stub.h"
|
|
};
|
|
|
|
/* Temporary location for stub read from input file. */
|
|
static char * go32exe_temp_stub = NULL;
|
|
static bfd_size_type go32exe_temp_stub_size = 0;
|
|
|
|
/* That's the function, which creates the stub. There are
|
|
different cases from where the stub is taken.
|
|
At first the environment variable $(GO32STUB) is checked and then
|
|
$(STUB) if it was not set.
|
|
If it exists and points to a valid stub the stub is taken from
|
|
that file. This file can be also a whole executable file, because
|
|
the stub is computed from the exe information at the start of that
|
|
file.
|
|
|
|
If there was any error, the standard stub (compiled in this file)
|
|
is taken.
|
|
|
|
Ideally this function should exec '$(TARGET)-stubify' to generate
|
|
a stub, like gcc does. */
|
|
|
|
static void
|
|
go32exe_create_stub (bfd *abfd)
|
|
{
|
|
/* Do it only once. */
|
|
if (coff_data (abfd)->stub == NULL)
|
|
{
|
|
char *stub;
|
|
struct stat st;
|
|
int f;
|
|
unsigned char header[10];
|
|
char magic[8];
|
|
unsigned long coff_start;
|
|
long exe_start;
|
|
|
|
/* If we read a stub from an input file, use that one. */
|
|
if (go32exe_temp_stub != NULL)
|
|
{
|
|
coff_data (abfd)->stub = bfd_alloc (abfd,
|
|
go32exe_temp_stub_size);
|
|
if (coff_data (abfd)->stub == NULL)
|
|
return;
|
|
memcpy (coff_data (abfd)->stub, go32exe_temp_stub,
|
|
go32exe_temp_stub_size);
|
|
coff_data (abfd)->stub_size = go32exe_temp_stub_size;
|
|
free (go32exe_temp_stub);
|
|
go32exe_temp_stub = NULL;
|
|
go32exe_temp_stub_size = 0;
|
|
return;
|
|
}
|
|
|
|
/* Check at first the environment variable $(GO32STUB). */
|
|
stub = getenv ("GO32STUB");
|
|
/* Now check the environment variable $(STUB). */
|
|
if (stub == NULL)
|
|
stub = getenv ("STUB");
|
|
if (stub == NULL)
|
|
goto stub_end;
|
|
if (stat (stub, &st) != 0)
|
|
goto stub_end;
|
|
#ifdef O_BINARY
|
|
f = open (stub, O_RDONLY | O_BINARY);
|
|
#else
|
|
f = open (stub, O_RDONLY);
|
|
#endif
|
|
if (f < 0)
|
|
goto stub_end;
|
|
if (read (f, &header, sizeof (header)) < 0)
|
|
{
|
|
close (f);
|
|
goto stub_end;
|
|
}
|
|
if (_H (0) != 0x5a4d) /* It is not an exe file. */
|
|
{
|
|
close (f);
|
|
goto stub_end;
|
|
}
|
|
/* Compute the size of the stub (it is every thing up
|
|
to the beginning of the coff image). */
|
|
coff_start = (long) _H (2) * 512L;
|
|
if (_H (1))
|
|
coff_start += (long) _H (1) - 512L;
|
|
|
|
exe_start = _H (4) * 16;
|
|
if ((long) lseek (f, exe_start, SEEK_SET) != exe_start)
|
|
{
|
|
close (f);
|
|
goto stub_end;
|
|
}
|
|
if (read (f, &magic, 8) != 8)
|
|
{
|
|
close (f);
|
|
goto stub_end;
|
|
}
|
|
if (! startswith (magic, "go32stub"))
|
|
{
|
|
close (f);
|
|
goto stub_end;
|
|
}
|
|
/* Now we found a correct stub (hopefully). */
|
|
coff_data (abfd)->stub = bfd_alloc (abfd, (bfd_size_type) coff_start);
|
|
if (coff_data (abfd)->stub == NULL)
|
|
{
|
|
close (f);
|
|
return;
|
|
}
|
|
lseek (f, 0L, SEEK_SET);
|
|
if ((unsigned long) read (f, coff_data (abfd)->stub, coff_start)
|
|
!= coff_start)
|
|
{
|
|
bfd_release (abfd, coff_data (abfd)->stub);
|
|
coff_data (abfd)->stub = NULL;
|
|
}
|
|
else
|
|
coff_data (abfd)->stub_size = coff_start;
|
|
close (f);
|
|
}
|
|
stub_end:
|
|
/* There was something wrong above, so use now the standard builtin
|
|
stub. */
|
|
if (coff_data (abfd)->stub == NULL)
|
|
{
|
|
coff_data (abfd)->stub
|
|
= bfd_alloc (abfd, (bfd_size_type) GO32EXE_DEFAULT_STUB_SIZE);
|
|
if (coff_data (abfd)->stub == NULL)
|
|
return;
|
|
memcpy (coff_data (abfd)->stub, go32exe_default_stub,
|
|
GO32EXE_DEFAULT_STUB_SIZE);
|
|
coff_data (abfd)->stub_size = GO32EXE_DEFAULT_STUB_SIZE;
|
|
}
|
|
}
|
|
|
|
/* If ibfd was a stubbed coff image, copy the stub from that bfd
|
|
to the new obfd. */
|
|
|
|
static bfd_boolean
|
|
go32exe_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
|
{
|
|
/* Check if both are the same targets. */
|
|
if (ibfd->xvec != obfd->xvec)
|
|
return TRUE;
|
|
|
|
/* Make sure we have a source stub. */
|
|
BFD_ASSERT (coff_data (ibfd)->stub != NULL);
|
|
|
|
/* Reallocate the output stub if necessary. */
|
|
if (coff_data (ibfd)->stub_size > coff_data (obfd)->stub_size)
|
|
coff_data (obfd)->stub = bfd_alloc (obfd, coff_data (ibfd)->stub_size);
|
|
if (coff_data (obfd)->stub == NULL)
|
|
return FALSE;
|
|
|
|
/* Now copy the stub. */
|
|
memcpy (coff_data (obfd)->stub, coff_data (ibfd)->stub,
|
|
coff_data (ibfd)->stub_size);
|
|
coff_data (obfd)->stub_size = coff_data (ibfd)->stub_size;
|
|
obfd->origin = coff_data (obfd)->stub_size;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* Cleanup function, returned from check_format hook. */
|
|
|
|
static void
|
|
go32exe_cleanup (bfd *abfd)
|
|
{
|
|
abfd->origin = 0;
|
|
|
|
free (go32exe_temp_stub);
|
|
go32exe_temp_stub = NULL;
|
|
go32exe_temp_stub_size = 0;
|
|
}
|
|
|
|
/* Check that there is a GO32 stub and read it to go32exe_temp_stub.
|
|
Then set abfd->origin so that the COFF image is read at the correct
|
|
file offset. */
|
|
|
|
static bfd_cleanup
|
|
go32exe_check_format (bfd *abfd)
|
|
{
|
|
struct external_DOS_hdr filehdr_dos;
|
|
uint16_t num_pages;
|
|
uint16_t last_page_size;
|
|
uint32_t header_end;
|
|
bfd_size_type stubsize;
|
|
|
|
/* This format can not appear in an archive. */
|
|
if (abfd->origin != 0)
|
|
{
|
|
bfd_set_error (bfd_error_wrong_format);
|
|
return NULL;
|
|
}
|
|
|
|
bfd_set_error (bfd_error_system_call);
|
|
|
|
/* Read in the stub file header, which is a DOS MZ executable. */
|
|
if (bfd_bread (&filehdr_dos, DOS_HDR_SIZE, abfd) != DOS_HDR_SIZE)
|
|
goto fail;
|
|
|
|
/* Make sure that this is an MZ executable. */
|
|
if (H_GET_16 (abfd, filehdr_dos.e_magic) != IMAGE_DOS_SIGNATURE)
|
|
goto fail_format;
|
|
|
|
/* Determine the size of the stub */
|
|
num_pages = H_GET_16 (abfd, filehdr_dos.e_cp);
|
|
last_page_size = H_GET_16 (abfd, filehdr_dos.e_cblp);
|
|
stubsize = num_pages * 512;
|
|
if (last_page_size != 0)
|
|
stubsize += last_page_size - 512;
|
|
|
|
/* Save now the stub to be used later. Put the stub data to a temporary
|
|
location first as tdata still does not exist. It may not even
|
|
be ever created if we are just checking the file format of ABFD. */
|
|
bfd_seek (abfd, 0, SEEK_SET);
|
|
go32exe_temp_stub = bfd_malloc (stubsize);
|
|
if (go32exe_temp_stub == NULL)
|
|
goto fail;
|
|
if (bfd_bread (go32exe_temp_stub, stubsize, abfd) != stubsize)
|
|
goto fail;
|
|
go32exe_temp_stub_size = stubsize;
|
|
|
|
/* Confirm that this is a go32stub. */
|
|
header_end = H_GET_16 (abfd, filehdr_dos.e_cparhdr) * 16UL;
|
|
if (go32exe_temp_stub_size < header_end
|
|
|| go32exe_temp_stub_size - header_end < sizeof "go32stub" - 1
|
|
|| !startswith (go32exe_temp_stub + header_end, "go32stub"))
|
|
goto fail_format;
|
|
|
|
/* Set origin to where the COFF header starts and seek there. */
|
|
abfd->origin = stubsize;
|
|
if (bfd_seek (abfd, 0, SEEK_SET) != 0)
|
|
goto fail;
|
|
|
|
/* Call coff_object_p to read the COFF image. If this fails then the file
|
|
must be just a stub with no COFF data attached. */
|
|
bfd_cleanup cleanup = coff_object_p (abfd);
|
|
if (cleanup == NULL)
|
|
goto fail;
|
|
BFD_ASSERT (cleanup == _bfd_no_cleanup);
|
|
|
|
return go32exe_cleanup;
|
|
|
|
fail_format:
|
|
bfd_set_error (bfd_error_wrong_format);
|
|
fail:
|
|
go32exe_cleanup (abfd);
|
|
return NULL;
|
|
}
|
|
|
|
/* Write the stub to the output file, then call coff_write_object_contents. */
|
|
|
|
static bfd_boolean
|
|
go32exe_write_object_contents (bfd *abfd)
|
|
{
|
|
const bfd_size_type pos = bfd_tell (abfd);
|
|
const bfd_size_type stubsize = coff_data (abfd)->stub_size;
|
|
|
|
BFD_ASSERT (stubsize != 0);
|
|
|
|
bfd_set_error (bfd_error_system_call);
|
|
|
|
/* Write the stub. */
|
|
abfd->origin = 0;
|
|
if (bfd_seek (abfd, 0, SEEK_SET) != 0)
|
|
return FALSE;
|
|
if (bfd_bwrite (coff_data (abfd)->stub, stubsize, abfd) != stubsize)
|
|
return FALSE;
|
|
|
|
/* Seek back to where we were. */
|
|
abfd->origin = stubsize;
|
|
if (bfd_seek (abfd, pos, SEEK_SET) != 0)
|
|
return FALSE;
|
|
|
|
return coff_write_object_contents (abfd);
|
|
}
|
|
|
|
/* mkobject hook. Called directly through bfd_set_format or via
|
|
coff_mkobject_hook etc from bfd_check_format. */
|
|
|
|
static bfd_boolean
|
|
go32exe_mkobject (bfd *abfd)
|
|
{
|
|
/* Don't output to an archive. */
|
|
if (abfd->my_archive != NULL)
|
|
return FALSE;
|
|
|
|
if (!_bfd_go32_mkobject (abfd))
|
|
return FALSE;
|
|
|
|
go32exe_create_stub (abfd);
|
|
if (coff_data (abfd)->stub == NULL)
|
|
{
|
|
bfd_release (abfd, coff_data (abfd));
|
|
return FALSE;
|
|
}
|
|
abfd->origin = coff_data (abfd)->stub_size;
|
|
|
|
return TRUE;
|
|
}
|