aboutsummaryrefslogtreecommitdiff
path: root/bfd/coffcode.h
diff options
context:
space:
mode:
authorSteve Chamberlain <sac@cygnus>1995-09-12 19:28:30 +0000
committerSteve Chamberlain <sac@cygnus>1995-09-12 19:28:30 +0000
commitbeee31b1a2bb292732d7944ab9c3fa3e10769864 (patch)
tree82715419e28da48d4923e207ab74a1793b192be2 /bfd/coffcode.h
parent5aa4c3ffda161ee77f273912f5e9bbfe2ef11e55 (diff)
downloadfsf-binutils-gdb-beee31b1a2bb292732d7944ab9c3fa3e10769864.zip
fsf-binutils-gdb-beee31b1a2bb292732d7944ab9c3fa3e10769864.tar.gz
fsf-binutils-gdb-beee31b1a2bb292732d7944ab9c3fa3e10769864.tar.bz2
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.
Diffstat (limited to 'bfd/coffcode.h')
-rw-r--r--bfd/coffcode.h300
1 files changed, 35 insertions, 265 deletions
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index 1995d6e..dd772a8 100644
--- a/bfd/coffcode.h
+++ b/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