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:
Steve Chamberlain 1995-09-12 19:28:30 +00:00
parent 5aa4c3ffda
commit beee31b1a2
5 changed files with 142 additions and 294 deletions

View File

@ -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.

View File

@ -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

View File

@ -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 .. */

View File

@ -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)))

View File

@ -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);