mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-01-21 00:15:13 +00:00
Thu Sep 7 12:45:34 1995 steve chamberlain <sac@slash.cygnus.com>
* coffcode.h (coff_compute_section_file_positions): Keep the raw size safe. (coff_write_object_contents): Remember if it's a relocatable file. * libcoff-in.h (pe_data_type): New member 'has_reloc_section' * peicode.h (coff_swap_filehdr_out): Clear not-reloc flag if relocatable file. Swap out saved raw size.
This commit is contained in:
parent
5aa4c3ffda
commit
beee31b1a2
@ -1,3 +1,13 @@
|
||||
Thu Sep 7 12:45:34 1995 steve chamberlain <sac@slash.cygnus.com>
|
||||
|
||||
* coffcode.h (coff_compute_section_file_positions): Keep the
|
||||
raw size safe.
|
||||
(coff_write_object_contents): Remember if it's a relocatable
|
||||
file.
|
||||
* libcoff-in.h (pe_data_type): New member 'has_reloc_section'
|
||||
* peicode.h (coff_swap_filehdr_out): Clear not-reloc flag
|
||||
if relocatable file. Swap out saved raw size.
|
||||
|
||||
Tue Sep 12 12:14:33 1995 Ian Lance Taylor <ian@cygnus.com>
|
||||
|
||||
* dep-in.sed: Remove config.h from generated dependencies.
|
||||
|
300
bfd/coffcode.h
300
bfd/coffcode.h
@ -298,23 +298,12 @@ CODE_FRAGMENT
|
||||
|
||||
*/
|
||||
|
||||
#ifndef IMAGE_BASE
|
||||
#define IMAGE_BASE 0
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
#include "peicode.h"
|
||||
#else
|
||||
#include "coffswap.h"
|
||||
#endif
|
||||
|
||||
|
||||
static bfd_vma
|
||||
pe_value(ptr, def)
|
||||
bfd_link_pe_info_dval *ptr;
|
||||
bfd_vma def;
|
||||
{
|
||||
if (ptr && ptr->defined)
|
||||
return ptr->value;
|
||||
return def;
|
||||
}
|
||||
|
||||
|
||||
#include "coffswap.h"
|
||||
|
||||
/* void warning(); */
|
||||
|
||||
@ -925,6 +914,7 @@ coff_set_alignment_hook (abfd, section, scnhdr)
|
||||
|
||||
#endif /* ! I960 */
|
||||
|
||||
#ifndef coff_mkobject
|
||||
static boolean
|
||||
coff_mkobject (abfd)
|
||||
bfd * abfd;
|
||||
@ -944,14 +934,12 @@ coff_mkobject (abfd)
|
||||
coff->relocbase = 0;
|
||||
/* make_abs_section(abfd);*/
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
obj_pe (abfd) = 1;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Create the COFF backend specific information. */
|
||||
|
||||
#ifndef coff_mkobject_hook
|
||||
static PTR
|
||||
coff_mkobject_hook (abfd, filehdr, aouthdr)
|
||||
bfd * abfd;
|
||||
@ -985,6 +973,7 @@ coff_mkobject_hook (abfd, filehdr, aouthdr)
|
||||
|
||||
return (PTR) coff;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Determine the machine architecture and type. FIXME: This is target
|
||||
dependent because the magic numbers are defined in the target
|
||||
@ -1518,8 +1507,7 @@ coff_compute_section_file_positions (abfd)
|
||||
int page_size;
|
||||
if (coff_data (abfd)->link_info)
|
||||
{
|
||||
page_size = pe_value (&(coff_data (abfd)->link_info->pe_info->file_alignment),
|
||||
PE_DEF_FILE_ALIGNMENT);
|
||||
page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
|
||||
}
|
||||
else
|
||||
page_size = PE_DEF_FILE_ALIGNMENT;
|
||||
@ -1584,10 +1572,17 @@ coff_compute_section_file_positions (abfd)
|
||||
&& (current->flags & SEC_ALLOC) != 0)
|
||||
sofar += (current->vma - sofar) % page_size;
|
||||
#endif
|
||||
|
||||
current->filepos = sofar;
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
/* With PE we have to pad each section to be a multiple of its page size
|
||||
too, and remember both sizes. Cooked_size becomes very useful. */
|
||||
current->_cooked_size = current->_raw_size;
|
||||
current->_raw_size = (current->_raw_size + page_size -1) & -page_size;
|
||||
#endif
|
||||
|
||||
sofar += current->_raw_size;
|
||||
|
||||
#ifndef I960
|
||||
/* make sure that this section is of the right size too */
|
||||
old_sofar = sofar;
|
||||
@ -1605,15 +1600,6 @@ coff_compute_section_file_positions (abfd)
|
||||
|
||||
previous = current;
|
||||
}
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
/* Normally, the starting location for the symbol table will be at the end
|
||||
of the last section. However, when dealing with NT, the last section
|
||||
must be as long as its size rounded up to the next page (0x1000). */
|
||||
sofar = (sofar + page_size - 1) & -page_size;
|
||||
|
||||
if (previous)
|
||||
previous->_raw_size = (previous->_raw_size + page_size -1) & -page_size;
|
||||
#endif
|
||||
|
||||
obj_relocbase (abfd) = sofar;
|
||||
abfd->output_has_begun = true;
|
||||
@ -1695,204 +1681,7 @@ coff_add_missing_symbols (abfd)
|
||||
|
||||
#endif /* ! defined (RS6000COFF_C) */
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
static void add_data_entry (abfd, aout, idx, name, base)
|
||||
bfd *abfd;
|
||||
struct internal_aouthdr *aout;
|
||||
int idx;
|
||||
char *name;
|
||||
bfd_vma base;
|
||||
{
|
||||
asection *sec = bfd_get_section_by_name (abfd, name);
|
||||
|
||||
/* add import directory information if it exists */
|
||||
if (sec != NULL)
|
||||
{
|
||||
aout->pe->DataDirectory[idx].VirtualAddress = sec->lma - base;
|
||||
aout->pe->DataDirectory[idx].Size = sec->_raw_size;
|
||||
sec->flags |= SEC_DATA;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
fill_pe_header_info (abfd, internal_f, internal_a)
|
||||
bfd *abfd;
|
||||
struct internal_filehdr *internal_f;
|
||||
struct internal_aouthdr *internal_a;
|
||||
{
|
||||
/* assign other filehdr fields for DOS header and NT signature */
|
||||
|
||||
int sa;
|
||||
int fa;
|
||||
bfd_vma ib;
|
||||
bfd_link_pe_info *pe_info = coff_data (abfd)->link_info->pe_info;
|
||||
|
||||
internal_f->f_timdat = time (0);
|
||||
|
||||
if (pe_value (&pe_info->dll, 0))
|
||||
internal_f->f_flags |= F_DLL ;
|
||||
|
||||
|
||||
if (bfd_get_section_by_name (abfd, ".reloc"))
|
||||
internal_f->f_flags &= ~F_RELFLG;
|
||||
|
||||
|
||||
memset (internal_f->pe, 0, sizeof (struct internal_extra_pe_filehdr));
|
||||
memset (internal_a->pe, 0, sizeof (struct internal_extra_pe_aouthdr));
|
||||
|
||||
|
||||
ib = internal_a->pe->ImageBase = pe_value (&pe_info->image_base, NT_EXE_IMAGE_BASE);
|
||||
|
||||
if (internal_a->tsize)
|
||||
internal_a->text_start -= ib;
|
||||
if (internal_a->dsize)
|
||||
internal_a->data_start -= ib;
|
||||
if (internal_a->entry)
|
||||
internal_a->entry -= ib;
|
||||
|
||||
|
||||
sa = internal_a->pe->SectionAlignment = pe_value (&pe_info->section_alignment,
|
||||
NT_SECTION_ALIGNMENT);
|
||||
|
||||
fa = internal_a->pe->FileAlignment = pe_value (&pe_info->file_alignment,
|
||||
NT_FILE_ALIGNMENT);
|
||||
|
||||
#define FA(x) (((x) + fa -1 ) & (- fa))
|
||||
#define SA(x) (((x) + sa -1 ) & (- sa))
|
||||
|
||||
/* We like to have the sizes aligned */
|
||||
|
||||
internal_a->bsize = FA (internal_a->bsize);
|
||||
|
||||
internal_f->pe->e_magic = DOSMAGIC;
|
||||
internal_f->pe->e_cblp = 0x90;
|
||||
internal_f->pe->e_cp = 0x3;
|
||||
internal_f->pe->e_crlc = 0x0;
|
||||
internal_f->pe->e_cparhdr = 0x4;
|
||||
internal_f->pe->e_minalloc = 0x0;
|
||||
internal_f->pe->e_maxalloc = 0xffff;
|
||||
internal_f->pe->e_ss = 0x0;
|
||||
internal_f->pe->e_sp = 0xb8;
|
||||
internal_f->pe->e_csum = 0x0;
|
||||
internal_f->pe->e_ip = 0x0;
|
||||
internal_f->pe->e_cs = 0x0;
|
||||
internal_f->pe->e_lfarlc = 0x40;
|
||||
internal_f->pe->e_ovno = 0x0;
|
||||
{
|
||||
int idx;
|
||||
for (idx=0; idx < 4; idx++)
|
||||
internal_f->pe->e_res[idx] = 0x0;
|
||||
}
|
||||
internal_f->pe->e_oemid = 0x0;
|
||||
internal_f->pe->e_oeminfo = 0x0;
|
||||
{
|
||||
int idx;
|
||||
for (idx=0; idx < 10; idx++)
|
||||
internal_f->pe->e_res2[idx] = 0x0;
|
||||
}
|
||||
internal_f->pe->e_lfanew = 0x80;
|
||||
|
||||
/* this next collection of data are mostly just characters. It appears
|
||||
to be constant within the headers put on NT exes */
|
||||
internal_f->pe->dos_message[0] = 0x0eba1f0e;
|
||||
internal_f->pe->dos_message[1] = 0xcd09b400;
|
||||
internal_f->pe->dos_message[2] = 0x4c01b821;
|
||||
internal_f->pe->dos_message[3] = 0x685421cd;
|
||||
internal_f->pe->dos_message[4] = 0x70207369;
|
||||
internal_f->pe->dos_message[5] = 0x72676f72;
|
||||
internal_f->pe->dos_message[6] = 0x63206d61;
|
||||
internal_f->pe->dos_message[7] = 0x6f6e6e61;
|
||||
internal_f->pe->dos_message[8] = 0x65622074;
|
||||
internal_f->pe->dos_message[9] = 0x6e757220;
|
||||
internal_f->pe->dos_message[10] = 0x206e6920;
|
||||
internal_f->pe->dos_message[11] = 0x20534f44;
|
||||
internal_f->pe->dos_message[12] = 0x65646f6d;
|
||||
internal_f->pe->dos_message[13] = 0x0a0d0d2e;
|
||||
internal_f->pe->dos_message[14] = 0x24;
|
||||
internal_f->pe->dos_message[15] = 0x0;
|
||||
internal_f->pe->nt_signature = NT_SIGNATURE;
|
||||
|
||||
|
||||
/* write all of the other optional header data */
|
||||
|
||||
internal_a->pe->MajorOperatingSystemVersion =
|
||||
pe_value (&pe_info->major_os_version, 1);
|
||||
|
||||
internal_a->pe->MinorOperatingSystemVersion =
|
||||
pe_value (&pe_info->minor_os_version, 0);
|
||||
|
||||
internal_a->pe->MajorImageVersion =
|
||||
pe_value (&pe_info->major_image_version, 1);
|
||||
|
||||
internal_a->pe->MinorImageVersion =
|
||||
pe_value (&pe_info->minor_image_version, 0);
|
||||
|
||||
|
||||
internal_a->pe->MajorSubsystemVersion =
|
||||
pe_value (&pe_info->major_subsystem_version, 3);
|
||||
|
||||
|
||||
internal_a->pe->MinorSubsystemVersion =
|
||||
pe_value (&pe_info->minor_subsystem_version, 10);
|
||||
|
||||
internal_a->pe->Subsystem =
|
||||
pe_value (&pe_info->subsystem, BFD_PE_CONSOLE);
|
||||
|
||||
/* Virtual start address, take virtual start address of last section,
|
||||
add its physical size and round up the next page (NT_SECTION_ALIGNMENT).
|
||||
An assumption has been made that the sections stored in the abfd
|
||||
structure are in order and that I have successfully saved the last
|
||||
section's address and size. */
|
||||
|
||||
/* The headers go up to where the first section starts. */
|
||||
|
||||
internal_a->pe->SizeOfHeaders = abfd->sections->filepos;
|
||||
internal_a->pe->CheckSum = 0;
|
||||
internal_a->pe->DllCharacteristics = 0;
|
||||
|
||||
internal_a->pe->SizeOfStackReserve = pe_value (&pe_info->stack_reserve,
|
||||
NT_DEF_RESERVE);
|
||||
internal_a->pe->SizeOfStackCommit = pe_value (&pe_info->stack_commit,
|
||||
NT_DEF_COMMIT);
|
||||
|
||||
internal_a->pe->SizeOfHeapReserve = pe_value (&pe_info->heap_reserve,
|
||||
NT_DEF_RESERVE);
|
||||
internal_a->pe->SizeOfHeapCommit = pe_value (&pe_info->heap_commit,
|
||||
NT_DEF_COMMIT);
|
||||
|
||||
internal_a->pe->LoaderFlags = 0;
|
||||
internal_a->pe->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES; /* 0x10 */
|
||||
|
||||
/* first null out all data directory entries .. */
|
||||
memset (internal_a->pe->DataDirectory, sizeof (internal_a->pe->DataDirectory), 0);
|
||||
|
||||
add_data_entry (abfd, internal_a, 0, ".edata", ib);
|
||||
add_data_entry (abfd, internal_a, 1, ".idata", ib);
|
||||
add_data_entry (abfd, internal_a, 2, ".rsrc" ,ib);
|
||||
add_data_entry (abfd, internal_a, 5, ".reloc", ib);
|
||||
{
|
||||
asection *sec;
|
||||
bfd_vma dsize= 0;
|
||||
bfd_vma isize = SA(abfd->sections->filepos);
|
||||
bfd_vma tsize= 0;
|
||||
for (sec = abfd->sections; sec; sec = sec->next)
|
||||
{
|
||||
int rounded = FA(sec->_raw_size);
|
||||
if (sec->flags & SEC_DATA)
|
||||
dsize += rounded;
|
||||
if (sec->flags & SEC_CODE)
|
||||
tsize += rounded;
|
||||
isize += SA(rounded);
|
||||
}
|
||||
|
||||
internal_a->dsize = dsize;
|
||||
internal_a->tsize = tsize;
|
||||
internal_a->pe->SizeOfImage = isize;
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
/* SUPPRESS 558 */
|
||||
/* SUPPRESS 529 */
|
||||
@ -1915,31 +1704,6 @@ coff_write_object_contents (abfd)
|
||||
struct internal_filehdr internal_f;
|
||||
struct internal_aouthdr internal_a;
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
struct internal_extra_pe_aouthdr extra_a;
|
||||
struct internal_extra_pe_filehdr extra_f;
|
||||
bfd_link_pe_info defs;
|
||||
struct bfd_link_info dummy_info;
|
||||
struct bfd_link_info *info ;
|
||||
struct bfd_link_pe_info *pe_info;
|
||||
|
||||
if (coff_data (abfd)->link_info)
|
||||
info =coff_data (abfd)->link_info;
|
||||
else
|
||||
{
|
||||
coff_data (abfd)->link_info = info = &dummy_info;
|
||||
info->pe_info = 0;
|
||||
}
|
||||
pe_info = (struct bfd_link_pe_info *)(info->pe_info);
|
||||
|
||||
if (!pe_info)
|
||||
{
|
||||
/* Just use sensible defaults */
|
||||
memset (&defs, 0, sizeof (defs));
|
||||
coff_data (abfd)->link_info->pe_info = &defs;
|
||||
}
|
||||
#endif
|
||||
|
||||
bfd_set_error (bfd_error_system_call);
|
||||
|
||||
if (abfd->output_has_begun == false)
|
||||
@ -2009,6 +1773,13 @@ coff_write_object_contents (abfd)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* If we've got a .reloc section, remember. */
|
||||
|
||||
if (strcmp (current->name, ".reloc") == 0)
|
||||
{
|
||||
pe_data (abfd)->has_reloc_section = 1;
|
||||
}
|
||||
#endif
|
||||
internal_f.f_nscns++;
|
||||
strncpy (&(section.s_name[0]), current->name, 8);
|
||||
@ -2019,9 +1790,13 @@ coff_write_object_contents (abfd)
|
||||
section.s_vaddr = 0;
|
||||
else
|
||||
#endif
|
||||
section.s_vaddr = current->lma;
|
||||
section.s_vaddr = current->lma;
|
||||
section.s_paddr = current->lma;
|
||||
section.s_size = current->_raw_size;
|
||||
section.s_size = current->_raw_size;
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
section.s_paddr = current->_cooked_size;
|
||||
#endif
|
||||
|
||||
/*
|
||||
If this section has no size or is unloadable then the scnptr
|
||||
@ -2256,16 +2031,6 @@ coff_write_object_contents (abfd)
|
||||
internal_a.entry = bfd_get_start_address (abfd);
|
||||
internal_f.f_nsyms = obj_raw_syment_count (abfd);
|
||||
|
||||
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
|
||||
internal_f.pe = & extra_f;
|
||||
internal_a.pe = & extra_a;
|
||||
|
||||
fill_pe_header_info (abfd, &internal_f, &internal_a);
|
||||
#endif
|
||||
|
||||
/* now write them */
|
||||
if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
|
||||
return false;
|
||||
@ -3087,6 +2852,11 @@ static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
|
||||
#define coff_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
|
||||
#define coff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
|
||||
|
||||
#ifndef coff_bfd_print_private_bfd_data
|
||||
#define coff_bfd_print_private_bfd_data \
|
||||
_bfd_generic_bfd_print_private_bfd_data
|
||||
#endif
|
||||
|
||||
#ifndef coff_bfd_is_local_label
|
||||
#define coff_bfd_is_local_label bfd_generic_is_local_label
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* BFD COFF object file private structure.
|
||||
Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
|
||||
Written by Cygnus Support.
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
@ -16,7 +16,7 @@ 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. */
|
||||
|
||||
#include "bfdlink.h"
|
||||
|
||||
@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#define coff_data(bfd) ((bfd)->tdata.coff_obj_data)
|
||||
#define exec_hdr(bfd) (coff_data(bfd)->hdr)
|
||||
#define obj_pe(bfd) (coff_data(bfd)->pe)
|
||||
#define obj_symbols(bfd) (coff_data(bfd)->symbols)
|
||||
#define obj_sym_filepos(bfd) (coff_data(bfd)->sym_filepos)
|
||||
|
||||
@ -34,7 +35,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#define obj_conv_table_size(bfd) (coff_data(bfd)->conv_table_size)
|
||||
|
||||
#define obj_coff_external_syms(bfd) (coff_data (bfd)->external_syms)
|
||||
#define obj_coff_keep_syms(bfd) (coff_data (bfd)->keep_syms)
|
||||
#define obj_coff_strings(bfd) (coff_data (bfd)->strings)
|
||||
#define obj_coff_keep_strings(bfd) (coff_data (bfd)->keep_strings)
|
||||
#define obj_coff_sym_hashes(bfd) (coff_data (bfd)->sym_hashes)
|
||||
|
||||
/* `Tdata' information kept for COFF files. */
|
||||
@ -63,16 +66,61 @@ typedef struct coff_tdata
|
||||
unsigned local_auxesz;
|
||||
unsigned local_linesz;
|
||||
|
||||
/* Used by the COFF backend linker. */
|
||||
/* The unswapped external symbols. May be NULL. Read by
|
||||
_bfd_coff_get_external_symbols. */
|
||||
PTR external_syms;
|
||||
/* If this is true, the external_syms may not be freed. */
|
||||
boolean keep_syms;
|
||||
|
||||
/* The string table. May be NULL. Read by
|
||||
_bfd_coff_read_string_table. */
|
||||
char *strings;
|
||||
/* If this is true, the strings may not be freed. */
|
||||
boolean keep_strings;
|
||||
|
||||
/* is this a PE format coff file */
|
||||
int pe;
|
||||
/* Used by the COFF backend linker. */
|
||||
struct coff_link_hash_entry **sym_hashes;
|
||||
|
||||
struct bfd_link_info *link_info;
|
||||
} coff_data_type;
|
||||
|
||||
/* Tdata for pe image files. */
|
||||
typedef struct pe_tdata
|
||||
{
|
||||
coff_data_type coff;
|
||||
struct internal_extra_pe_aouthdr pe_opthdr;
|
||||
int dll;
|
||||
int has_reloc_section;
|
||||
} pe_data_type;
|
||||
|
||||
#define pe_data(bfd) ((bfd)->tdata.pe_obj_data)
|
||||
|
||||
|
||||
/* We take the address of the first element of a asymbol to ensure that the
|
||||
* macro is only ever applied to an asymbol. */
|
||||
#define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd)))
|
||||
|
||||
/* The used_by_bfd field of a section may be set to a pointer to this
|
||||
structure. */
|
||||
|
||||
struct coff_section_tdata
|
||||
{
|
||||
/* The relocs, swapped into COFF internal form. This may be NULL. */
|
||||
struct internal_reloc *relocs;
|
||||
/* If this is true, the relocs entry may not be freed. */
|
||||
boolean keep_relocs;
|
||||
/* The section contents. This may be NULL. */
|
||||
bfd_byte *contents;
|
||||
/* If this is true, the contents entry may not be freed. */
|
||||
boolean keep_contents;
|
||||
};
|
||||
|
||||
/* An accessor macro for the coff_section_tdata structure. */
|
||||
#define coff_section_data(abfd, sec) \
|
||||
((struct coff_section_tdata *) (sec)->used_by_bfd)
|
||||
|
||||
/* COFF linker hash table entries. */
|
||||
|
||||
struct coff_link_hash_entry
|
||||
@ -132,12 +180,15 @@ extern long coff_get_symtab_upper_bound PARAMS ((bfd *));
|
||||
extern long coff_get_symtab PARAMS ((bfd *, asymbol **));
|
||||
extern int coff_count_linenumbers PARAMS ((bfd *));
|
||||
extern struct coff_symbol_struct *coff_symbol_from PARAMS ((bfd *, asymbol *));
|
||||
extern boolean coff_renumber_symbols PARAMS ((bfd *));
|
||||
extern boolean coff_renumber_symbols PARAMS ((bfd *, int *));
|
||||
extern void coff_mangle_symbols PARAMS ((bfd *));
|
||||
extern boolean coff_write_symbols PARAMS ((bfd *));
|
||||
extern boolean coff_write_linenumbers PARAMS ((bfd *));
|
||||
extern alent *coff_get_lineno PARAMS ((bfd *, asymbol *));
|
||||
extern asymbol *coff_section_symbol PARAMS ((bfd *, char *));
|
||||
extern boolean _bfd_coff_get_external_symbols PARAMS ((bfd *));
|
||||
extern const char *_bfd_coff_read_string_table PARAMS ((bfd *));
|
||||
extern boolean _bfd_coff_free_symbols PARAMS ((bfd *));
|
||||
extern struct coff_ptr_struct *coff_get_normalized_symtab PARAMS ((bfd *));
|
||||
extern long coff_get_reloc_upper_bound PARAMS ((bfd *, sec_ptr));
|
||||
extern asymbol *coff_make_empty_symbol PARAMS ((bfd *));
|
||||
@ -175,6 +226,12 @@ extern boolean _bfd_coff_link_add_symbols
|
||||
PARAMS ((bfd *, struct bfd_link_info *));
|
||||
extern boolean _bfd_coff_final_link
|
||||
PARAMS ((bfd *, struct bfd_link_info *));
|
||||
extern struct internal_reloc *_bfd_coff_read_internal_relocs
|
||||
PARAMS ((bfd *, asection *, boolean, bfd_byte *, boolean,
|
||||
struct internal_reloc *));
|
||||
extern boolean _bfd_coff_generic_relocate_section
|
||||
PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
|
||||
struct internal_reloc *, struct internal_syment *, asection **));
|
||||
|
||||
/* And more taken from the source .. */
|
||||
|
||||
|
@ -82,9 +82,22 @@ typedef struct coff_tdata
|
||||
int pe;
|
||||
/* Used by the COFF backend linker. */
|
||||
struct coff_link_hash_entry **sym_hashes;
|
||||
|
||||
struct bfd_link_info *link_info;
|
||||
} coff_data_type;
|
||||
|
||||
/* Tdata for pe image files. */
|
||||
typedef struct pe_tdata
|
||||
{
|
||||
coff_data_type coff;
|
||||
struct internal_extra_pe_aouthdr pe_opthdr;
|
||||
int dll;
|
||||
int has_reloc_section;
|
||||
} pe_data_type;
|
||||
|
||||
#define pe_data(bfd) ((bfd)->tdata.pe_obj_data)
|
||||
|
||||
|
||||
/* We take the address of the first element of a asymbol to ensure that the
|
||||
* macro is only ever applied to an asymbol. */
|
||||
#define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd)))
|
||||
|
@ -241,10 +241,11 @@ coff_swap_filehdr_out (abfd, in, out)
|
||||
PTR in;
|
||||
PTR out;
|
||||
{
|
||||
int idx;
|
||||
struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
|
||||
FILHDR *filehdr_out = (FILHDR *)out;
|
||||
|
||||
if (bfd_get_section_by_name (abfd, ".reloc"))
|
||||
if (pe_data (abfd)->has_reloc_section)
|
||||
filehdr_in->f_flags &= ~F_RELFLG;
|
||||
|
||||
if (pe_data (abfd)->dll)
|
||||
@ -264,18 +265,16 @@ coff_swap_filehdr_out (abfd, in, out)
|
||||
filehdr_in->pe.e_cs = 0x0;
|
||||
filehdr_in->pe.e_lfarlc = 0x40;
|
||||
filehdr_in->pe.e_ovno = 0x0;
|
||||
{
|
||||
int idx;
|
||||
for (idx=0; idx < 4; idx++)
|
||||
filehdr_in->pe.e_res[idx] = 0x0;
|
||||
}
|
||||
|
||||
for (idx=0; idx < 4; idx++)
|
||||
filehdr_in->pe.e_res[idx] = 0x0;
|
||||
|
||||
filehdr_in->pe.e_oemid = 0x0;
|
||||
filehdr_in->pe.e_oeminfo = 0x0;
|
||||
{
|
||||
int idx;
|
||||
for (idx=0; idx < 10; idx++)
|
||||
filehdr_in->pe.e_res2[idx] = 0x0;
|
||||
}
|
||||
|
||||
for (idx=0; idx < 10; idx++)
|
||||
filehdr_in->pe.e_res2[idx] = 0x0;
|
||||
|
||||
filehdr_in->pe.e_lfanew = 0x80;
|
||||
|
||||
/* this next collection of data are mostly just characters. It appears
|
||||
@ -877,7 +876,6 @@ static void
|
||||
GET_SCNHDR_PADDR (abfd, (bfd_byte *) scnhdr_ext->s_paddr);
|
||||
scnhdr_int->s_size =
|
||||
GET_SCNHDR_SIZE (abfd, (bfd_byte *) scnhdr_ext->s_size);
|
||||
|
||||
scnhdr_int->s_scnptr =
|
||||
GET_SCNHDR_SCNPTR (abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
|
||||
scnhdr_int->s_relptr =
|
||||
@ -904,6 +902,7 @@ PTR out;
|
||||
struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
|
||||
SCNHDR *scnhdr_ext = (SCNHDR *)out;
|
||||
unsigned int ret = sizeof (SCNHDR);
|
||||
bfd_vma s;
|
||||
|
||||
memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
|
||||
|
||||
@ -913,22 +912,21 @@ PTR out;
|
||||
- pe_data(abfd)->pe_opthdr.ImageBase),
|
||||
(bfd_byte *) scnhdr_ext->s_vaddr);
|
||||
|
||||
/* NT wants the physical address data to be the size (s_size data) of
|
||||
the section */
|
||||
PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_size,
|
||||
(bfd_byte *) scnhdr_ext->s_paddr);
|
||||
/* Note that we're really stuffing in the raw size into here. */
|
||||
|
||||
|
||||
PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size,
|
||||
(bfd_byte *) scnhdr_ext->s_size);
|
||||
|
||||
/* NT wants the size data to be rounded up to the next NT_FILE_ALIGNMENT
|
||||
value except for the BSS section, its s_size should be 0 */
|
||||
if (strcmp (scnhdr_int->s_name, _BSS) == 0)
|
||||
PUT_SCNHDR_SIZE (abfd, 0, (bfd_byte *) scnhdr_ext->s_size);
|
||||
|
||||
if (strcmp (scnhdr_int->s_name, _BSS) == 0)
|
||||
s = 0;
|
||||
else
|
||||
{
|
||||
bfd_vma rounded_size;
|
||||
rounded_size = ((scnhdr_int->s_size + NT_FILE_ALIGNMENT - 1) /
|
||||
NT_FILE_ALIGNMENT) *
|
||||
NT_FILE_ALIGNMENT;
|
||||
PUT_SCNHDR_SIZE (abfd, rounded_size, (bfd_byte *) scnhdr_ext->s_size);
|
||||
}
|
||||
s = scnhdr_int->s_paddr;
|
||||
|
||||
PUT_SCNHDR_PADDR (abfd, s, (bfd_byte *) scnhdr_ext->s_paddr);
|
||||
|
||||
PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
|
||||
(bfd_byte *) scnhdr_ext->s_scnptr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user