|
|
|
@ -1,24 +1,24 @@ |
|
|
|
/* Support for the generic parts of most COFF variants, for BFD.
|
|
|
|
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, |
|
|
|
2000, 2001, 2002 |
|
|
|
2000, 2001, 2002, 2003 |
|
|
|
Free Software Foundation, Inc. |
|
|
|
Written by Cygnus Support. |
|
|
|
|
|
|
|
This file is part of BFD, the Binary File Descriptor library. |
|
|
|
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 2 of the License, or |
|
|
|
(at your option) any later version. |
|
|
|
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 2 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. |
|
|
|
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
|
|
|
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
|
|
|
|
|
|
|
/*
|
|
|
|
Most of this hacked by Steve Chamberlain, |
|
|
|
@ -225,7 +225,7 @@ SUBSUBSECTION |
|
|
|
This routine runs though the provided symbol table and uses |
|
|
|
the offsets generated by the previous pass and the pointers |
|
|
|
generated when the symbol table was read in to create the |
|
|
|
structured hierachy required by coff. It changes each pointer |
|
|
|
structured hierarchy required by coff. It changes each pointer |
|
|
|
to a symbol into the index into the symbol table of the asymbol. |
|
|
|
|
|
|
|
o <<coff_write_symbols>> |
|
|
|
@ -558,15 +558,15 @@ sec_to_styp_flags (sec_name, sec_flags) |
|
|
|
|
|
|
|
/* For now, the read/write bits are mapped onto SEC_READONLY, even
|
|
|
|
though the semantics don't quite match. The bits from the input |
|
|
|
are retained in pei_section_data(abfd, section)->pe_flags */ |
|
|
|
are retained in pei_section_data(abfd, section)->pe_flags. */ |
|
|
|
|
|
|
|
styp_flags |= IMAGE_SCN_MEM_READ; /* always readable. */ |
|
|
|
styp_flags |= IMAGE_SCN_MEM_READ; /* Always readable. */ |
|
|
|
if ((sec_flags & SEC_READONLY) == 0) |
|
|
|
styp_flags |= IMAGE_SCN_MEM_WRITE; /* Invert READONLY for write */ |
|
|
|
styp_flags |= IMAGE_SCN_MEM_WRITE; /* Invert READONLY for write. */ |
|
|
|
if (sec_flags & SEC_CODE) |
|
|
|
styp_flags |= IMAGE_SCN_MEM_EXECUTE; /* CODE->EXECUTE */ |
|
|
|
styp_flags |= IMAGE_SCN_MEM_EXECUTE; /* CODE->EXECUTE. */ |
|
|
|
if (sec_flags & SEC_SHARED) |
|
|
|
styp_flags |= IMAGE_SCN_MEM_SHARED; /* Shared remains meaningful */ |
|
|
|
styp_flags |= IMAGE_SCN_MEM_SHARED; /* Shared remains meaningful. */ |
|
|
|
|
|
|
|
return styp_flags; |
|
|
|
} |
|
|
|
@ -693,12 +693,12 @@ styp_to_sec_flags (abfd, hdr, name, section, flags_ptr) |
|
|
|
else |
|
|
|
sec_flags |= SEC_ALLOC | SEC_LOAD; |
|
|
|
|
|
|
|
#ifdef STYP_LIT /* A29k readonly text/data section type */ |
|
|
|
#ifdef STYP_LIT /* A29k readonly text/data section type. */ |
|
|
|
if ((styp_flags & STYP_LIT) == STYP_LIT) |
|
|
|
sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY); |
|
|
|
#endif /* STYP_LIT */ |
|
|
|
|
|
|
|
#ifdef STYP_OTHER_LOAD /* Other loaded sections */ |
|
|
|
#ifdef STYP_OTHER_LOAD /* Other loaded sections. */ |
|
|
|
if (styp_flags & STYP_OTHER_LOAD) |
|
|
|
sec_flags = (SEC_LOAD | SEC_ALLOC); |
|
|
|
#endif /* STYP_SDATA */ |
|
|
|
@ -802,7 +802,7 @@ handle_COMDAT (abfd, sec_flags, hdr, name, section) |
|
|
|
gas-generated, and look for <something> (whatever |
|
|
|
follows the $) as the comdat symbol. */ |
|
|
|
|
|
|
|
/* All 3 branches use this */ |
|
|
|
/* All 3 branches use this. */ |
|
|
|
symname = _bfd_coff_internal_syment_name (abfd, &isym, buf); |
|
|
|
|
|
|
|
if (symname == NULL) |
|
|
|
@ -930,7 +930,7 @@ handle_COMDAT (abfd, sec_flags, hdr, name, section) |
|
|
|
#ifndef TARGET_UNDERSCORE |
|
|
|
#define TARGET_UNDERSCORE 0 |
|
|
|
#endif |
|
|
|
/* Is this the name we're looking for? */ |
|
|
|
/* Is this the name we're looking for ? */ |
|
|
|
if (strcmp (target_name, |
|
|
|
symname + (TARGET_UNDERSCORE ? 1 : 0)) != 0) |
|
|
|
{ |
|
|
|
@ -1344,7 +1344,8 @@ Special entry points for gdb to swap in coff symbol table parts: |
|
|
|
.#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\ |
|
|
|
. ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr)) |
|
|
|
.#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\ |
|
|
|
. ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr)) |
|
|
|
. ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook)\ |
|
|
|
. (abfd, filehdr, aouthdr)) |
|
|
|
. |
|
|
|
.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\ |
|
|
|
. ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\ |
|
|
|
@ -1369,7 +1370,8 @@ Special entry points for gdb to swap in coff symbol table parts: |
|
|
|
. ((coff_backend_info (abfd)->_bfd_coff_print_aux)\ |
|
|
|
. (abfd, file, base, symbol, aux, indaux)) |
|
|
|
. |
|
|
|
.#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\ |
|
|
|
.#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order,\ |
|
|
|
. reloc, data, src_ptr, dst_ptr)\ |
|
|
|
. ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\ |
|
|
|
. (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)) |
|
|
|
. |
|
|
|
@ -1397,7 +1399,8 @@ Special entry points for gdb to swap in coff symbol table parts: |
|
|
|
.#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\ |
|
|
|
. ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\ |
|
|
|
. (obfd, info, ibfd, sec, rel, adjustedp)) |
|
|
|
.#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\ |
|
|
|
.#define bfd_coff_link_add_one_symbol(info, abfd, name, flags, section,\ |
|
|
|
. value, string, cp, coll, hashp)\ |
|
|
|
. ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\ |
|
|
|
. (info, abfd, name, flags, section, value, string, cp, coll, hashp)) |
|
|
|
. |
|
|
|
@ -1420,14 +1423,13 @@ coff_bad_format_hook (abfd, filehdr) |
|
|
|
if (BADMAG (*internal_f)) |
|
|
|
return FALSE; |
|
|
|
|
|
|
|
/* if the optional header is NULL or not the correct size then
|
|
|
|
/* If the optional header is NULL or not the correct size then
|
|
|
|
quit; the only difference I can see between m88k dgux headers (MC88DMAGIC) |
|
|
|
and Intel 960 readwrite headers (I960WRMAGIC) is that the |
|
|
|
optional header is of a different size. |
|
|
|
|
|
|
|
But the mips keeps extra stuff in it's opthdr, so dont check |
|
|
|
when doing that |
|
|
|
*/ |
|
|
|
when doing that. */ |
|
|
|
|
|
|
|
#if defined(M88) || defined(I960) |
|
|
|
if (internal_f->f_opthdr != 0 && bfd_coff_aoutsz (abfd) != internal_f->f_opthdr) |
|
|
|
@ -1453,6 +1455,7 @@ coff_set_custom_section_alignment (abfd, section, alignment_table, table_size) |
|
|
|
for (i = 0; i < table_size; ++i) |
|
|
|
{ |
|
|
|
const char *secname = bfd_get_section_name (abfd, section); |
|
|
|
|
|
|
|
if (alignment_table[i].comparison_length == (unsigned int) -1 |
|
|
|
? strcmp (alignment_table[i].name, secname) == 0 |
|
|
|
: strncmp (alignment_table[i].name, secname, |
|
|
|
@ -1566,13 +1569,13 @@ coff_set_alignment_hook (abfd, section, scnhdr) |
|
|
|
unsigned int i; |
|
|
|
|
|
|
|
#ifdef I960 |
|
|
|
/* Extract ALIGN from 2**ALIGN stored in section header */ |
|
|
|
/* Extract ALIGN from 2**ALIGN stored in section header. */ |
|
|
|
for (i = 0; i < 32; i++) |
|
|
|
if ((1 << i) >= hdr->s_align) |
|
|
|
break; |
|
|
|
#endif |
|
|
|
#ifdef TIC80COFF |
|
|
|
/* TI tools puts the alignment power in bits 8-11 */ |
|
|
|
/* TI tools puts the alignment power in bits 8-11. */ |
|
|
|
i = (hdr->s_flags >> 8) & 0xF ; |
|
|
|
#endif |
|
|
|
#ifdef COFF_DECODE_ALIGNMENT |
|
|
|
@ -1588,7 +1591,7 @@ coff_set_alignment_hook (abfd, section, scnhdr) |
|
|
|
#else /* ! COFF_ALIGN_IN_SECTION_HEADER */ |
|
|
|
#ifdef COFF_WITH_PE |
|
|
|
|
|
|
|
/* a couple of macros to help setting the alignment power field */ |
|
|
|
/* A couple of macros to help setting the alignment power field. */ |
|
|
|
#define ALIGN_SET(field,x,y) \ |
|
|
|
if (((field) & IMAGE_SCN_ALIGN_64BYTES) == x )\ |
|
|
|
{\ |
|
|
|
@ -1649,7 +1652,7 @@ coff_set_alignment_hook (abfd, section, scnhdr) |
|
|
|
|
|
|
|
section->lma = hdr->s_vaddr; |
|
|
|
|
|
|
|
/* check for extended relocs */ |
|
|
|
/* Check for extended relocs. */ |
|
|
|
if (hdr->s_flags & IMAGE_SCN_LNK_NRELOC_OVFL) |
|
|
|
{ |
|
|
|
struct external_reloc dst; |
|
|
|
@ -1745,6 +1748,7 @@ coff_mkobject (abfd) |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Create the COFF backend specific information. */ |
|
|
|
|
|
|
|
#ifndef coff_mkobject_hook |
|
|
|
static PTR |
|
|
|
coff_mkobject_hook (abfd, filehdr, aouthdr) |
|
|
|
@ -2125,7 +2129,7 @@ coff_set_arch_mach_hook (abfd, filehdr) |
|
|
|
|
|
|
|
#ifdef TICOFF0MAGIC |
|
|
|
#ifdef TICOFF_TARGET_ARCH |
|
|
|
/* this TI COFF section should be used by all new TI COFF v0 targets */ |
|
|
|
/* This TI COFF section should be used by all new TI COFF v0 targets. */ |
|
|
|
case TICOFF0MAGIC: |
|
|
|
arch = TICOFF_TARGET_ARCH; |
|
|
|
machine = TICOFF_TARGET_MACHINE_GET (internal_f->f_flags); |
|
|
|
@ -2134,8 +2138,8 @@ coff_set_arch_mach_hook (abfd, filehdr) |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef TICOFF1MAGIC |
|
|
|
/* this TI COFF section should be used by all new TI COFF v1/2 targets */ |
|
|
|
/* TI COFF1 and COFF2 use the target_id field to specify which arch */ |
|
|
|
/* This TI COFF section should be used by all new TI COFF v1/2 targets. */ |
|
|
|
/* TI COFF1 and COFF2 use the target_id field to specify which arch. */ |
|
|
|
case TICOFF1MAGIC: |
|
|
|
case TICOFF2MAGIC: |
|
|
|
switch (internal_f->f_target_id) |
|
|
|
@ -2174,7 +2178,7 @@ coff_set_arch_mach_hook (abfd, filehdr) |
|
|
|
break; |
|
|
|
#endif |
|
|
|
|
|
|
|
default: /* Unreadable input file type */ |
|
|
|
default: /* Unreadable input file type. */ |
|
|
|
arch = bfd_arch_obscure; |
|
|
|
break; |
|
|
|
} |
|
|
|
@ -2215,7 +2219,6 @@ static bfd_boolean coff_pointerize_aux_hook |
|
|
|
PARAMS ((bfd *, combined_entry_type *, combined_entry_type *, |
|
|
|
unsigned int, combined_entry_type *)); |
|
|
|
|
|
|
|
/*ARGSUSED*/ |
|
|
|
static bfd_boolean |
|
|
|
coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux) |
|
|
|
bfd *abfd ATTRIBUTE_UNUSED; |
|
|
|
@ -2255,7 +2258,6 @@ static bfd_boolean coff_pointerize_aux_hook |
|
|
|
PARAMS ((bfd *, combined_entry_type *, combined_entry_type *, |
|
|
|
unsigned int, combined_entry_type *)); |
|
|
|
|
|
|
|
/*ARGSUSED*/ |
|
|
|
static bfd_boolean |
|
|
|
coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux) |
|
|
|
bfd *abfd ATTRIBUTE_UNUSED; |
|
|
|
@ -2360,7 +2362,7 @@ SUBSUBSECTION |
|
|
|
|
|
|
|
static int compare_arelent_ptr PARAMS ((const PTR, const PTR)); |
|
|
|
|
|
|
|
/* AUX's ld wants relocations to be sorted */ |
|
|
|
/* AUX's ld wants relocations to be sorted. */ |
|
|
|
static int |
|
|
|
compare_arelent_ptr (x, y) |
|
|
|
const PTR x; |
|
|
|
@ -2393,7 +2395,7 @@ coff_write_relocs (abfd, first_undef) |
|
|
|
p = s->orelocation; |
|
|
|
#else |
|
|
|
{ |
|
|
|
/* sort relocations before we write them out */ |
|
|
|
/* Sort relocations before we write them out. */ |
|
|
|
bfd_size_type amt; |
|
|
|
|
|
|
|
amt = s->reloc_count; |
|
|
|
@ -2412,10 +2414,11 @@ coff_write_relocs (abfd, first_undef) |
|
|
|
#ifdef COFF_WITH_PE |
|
|
|
if (obj_pe (abfd) && s->reloc_count >= 0xffff) |
|
|
|
{ |
|
|
|
/* encode real count here as first reloc */ |
|
|
|
/* Encode real count here as first reloc. */ |
|
|
|
struct internal_reloc n; |
|
|
|
|
|
|
|
memset ((PTR) & n, 0, sizeof (n)); |
|
|
|
/* add one to count *this* reloc (grr) */ |
|
|
|
/* Add one to count *this* reloc (grr). */ |
|
|
|
n.r_vaddr = s->reloc_count + 1; |
|
|
|
coff_swap_reloc_out (abfd, &n, &dst); |
|
|
|
if (bfd_bwrite ((PTR) & dst, (bfd_size_type) bfd_coff_relsz (abfd), |
|
|
|
@ -2428,6 +2431,7 @@ coff_write_relocs (abfd, first_undef) |
|
|
|
{ |
|
|
|
struct internal_reloc n; |
|
|
|
arelent *q = p[i]; |
|
|
|
|
|
|
|
memset ((PTR) & n, 0, sizeof (n)); |
|
|
|
|
|
|
|
/* Now we've renumbered the symbols we know where the
|
|
|
|
@ -2445,11 +2449,13 @@ coff_write_relocs (abfd, first_undef) |
|
|
|
int j; |
|
|
|
const char *sname = q->sym_ptr_ptr[0]->name; |
|
|
|
asymbol **outsyms = abfd->outsymbols; |
|
|
|
|
|
|
|
for (j = first_undef; outsyms[j]; j++) |
|
|
|
{ |
|
|
|
const char *intable = outsyms[j]->name; |
|
|
|
|
|
|
|
if (strcmp (intable, sname) == 0) { |
|
|
|
/* got a hit, so repoint the reloc */ |
|
|
|
/* Got a hit, so repoint the reloc. */ |
|
|
|
q->sym_ptr_ptr = outsyms + j; |
|
|
|
break; |
|
|
|
} |
|
|
|
@ -2492,12 +2498,13 @@ coff_write_relocs (abfd, first_undef) |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef SELECT_RELOC |
|
|
|
/* Work out reloc type from what is required */ |
|
|
|
/* Work out reloc type from what is required. */ |
|
|
|
SELECT_RELOC (n, q->howto); |
|
|
|
#else |
|
|
|
n.r_type = q->howto->type; |
|
|
|
#endif |
|
|
|
coff_swap_reloc_out (abfd, &n, &dst); |
|
|
|
|
|
|
|
if (bfd_bwrite ((PTR) & dst, (bfd_size_type) bfd_coff_relsz (abfd), |
|
|
|
abfd) != bfd_coff_relsz (abfd)) |
|
|
|
return FALSE; |
|
|
|
@ -2593,12 +2600,12 @@ coff_set_flags (abfd, magicp, flagsp) |
|
|
|
|
|
|
|
#ifdef TICOFF_DEFAULT_MAGIC |
|
|
|
case TICOFF_TARGET_ARCH: |
|
|
|
/* if there's no indication of which version we want, use the default */ |
|
|
|
/* If there's no indication of which version we want, use the default. */ |
|
|
|
if (!abfd->xvec ) |
|
|
|
*magicp = TICOFF_DEFAULT_MAGIC; |
|
|
|
else |
|
|
|
{ |
|
|
|
/* we may want to output in a different COFF version */ |
|
|
|
/* We may want to output in a different COFF version. */ |
|
|
|
switch (abfd->xvec->name[4]) |
|
|
|
{ |
|
|
|
case '0': |
|
|
|
@ -3091,8 +3098,8 @@ coff_compute_section_file_positions (abfd) |
|
|
|
#ifdef ALIGN_SECTIONS_IN_FILE |
|
|
|
if ((abfd->flags & EXEC_P) != 0) |
|
|
|
{ |
|
|
|
/* make sure this section is aligned on the right boundary - by
|
|
|
|
padding the previous section up if necessary */ |
|
|
|
/* Make sure this section is aligned on the right boundary - by
|
|
|
|
padding the previous section up if necessary. */ |
|
|
|
|
|
|
|
old_sofar = sofar; |
|
|
|
#ifdef RS6000COFF_C |
|
|
|
@ -3128,9 +3135,7 @@ coff_compute_section_file_positions (abfd) |
|
|
|
} |
|
|
|
#endif |
|
|
|
if (previous != (asection *) NULL) |
|
|
|
{ |
|
|
|
previous->_raw_size += sofar - old_sofar; |
|
|
|
} |
|
|
|
previous->_raw_size += sofar - old_sofar; |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
@ -3152,7 +3157,7 @@ coff_compute_section_file_positions (abfd) |
|
|
|
sofar += current->_raw_size; |
|
|
|
|
|
|
|
#ifdef ALIGN_SECTIONS_IN_FILE |
|
|
|
/* make sure that this section is of the right size too */ |
|
|
|
/* Make sure that this section is of the right size too. */ |
|
|
|
if ((abfd->flags & EXEC_P) == 0) |
|
|
|
{ |
|
|
|
bfd_size_type old_size; |
|
|
|
@ -3241,10 +3246,11 @@ coff_add_missing_symbols (abfd) |
|
|
|
{ |
|
|
|
coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]); |
|
|
|
const char *name; |
|
|
|
|
|
|
|
if (csym) |
|
|
|
{ |
|
|
|
/* only do this if there is a coff representation of the input
|
|
|
|
symbol */ |
|
|
|
/* Only do this if there is a coff representation of the input
|
|
|
|
symbol. */ |
|
|
|
if (csym->native && csym->native->u.syment.n_sclass == C_FILE) |
|
|
|
{ |
|
|
|
need_file = 0; |
|
|
|
@ -3278,11 +3284,11 @@ coff_add_missing_symbols (abfd) |
|
|
|
if (!sympp2) |
|
|
|
return FALSE; |
|
|
|
memcpy (sympp2, sympp, i * sizeof (asymbol *)); |
|
|
|
|
|
|
|
if (need_file) |
|
|
|
{ |
|
|
|
/* @@ Generate fake .file symbol, in sympp2[i], and increment i. */ |
|
|
|
abort (); |
|
|
|
} |
|
|
|
/* @@ Generate fake .file symbol, in sympp2[i], and increment i. */ |
|
|
|
abort (); |
|
|
|
|
|
|
|
if (need_text) |
|
|
|
sympp2[i++] = coff_section_symbol (abfd, _TEXT); |
|
|
|
if (need_data) |
|
|
|
@ -3419,7 +3425,7 @@ coff_write_object_contents (abfd) |
|
|
|
bfd_set_error (bfd_error_system_call); |
|
|
|
|
|
|
|
/* Make a pass through the symbol table to count line number entries and
|
|
|
|
put them into the correct asections */ |
|
|
|
put them into the correct asections. */ |
|
|
|
|
|
|
|
lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd); |
|
|
|
|
|
|
|
@ -3431,13 +3437,13 @@ coff_write_object_contents (abfd) |
|
|
|
|
|
|
|
reloc_base = obj_relocbase (abfd); |
|
|
|
|
|
|
|
/* Work out the size of the reloc and linno areas */ |
|
|
|
/* Work out the size of the reloc and linno areas. */ |
|
|
|
|
|
|
|
for (current = abfd->sections; current != NULL; current = |
|
|
|
current->next) |
|
|
|
{ |
|
|
|
#ifdef COFF_WITH_PE |
|
|
|
/* we store the actual reloc count in the first reloc's addr */ |
|
|
|
/* We store the actual reloc count in the first reloc's addr. */ |
|
|
|
if (obj_pe (abfd) && current->reloc_count >= 0xffff) |
|
|
|
reloc_count ++; |
|
|
|
#endif |
|
|
|
@ -3449,7 +3455,7 @@ coff_write_object_contents (abfd) |
|
|
|
lineno_base = reloc_base + reloc_size; |
|
|
|
sym_base = lineno_base + lnno_size; |
|
|
|
|
|
|
|
/* Indicate in each section->line_filepos its actual file address */ |
|
|
|
/* Indicate in each section->line_filepos its actual file address. */ |
|
|
|
for (current = abfd->sections; current != NULL; current = |
|
|
|
current->next) |
|
|
|
{ |
|
|
|
@ -3468,7 +3474,7 @@ coff_write_object_contents (abfd) |
|
|
|
current->rel_filepos = reloc_base; |
|
|
|
reloc_base += current->reloc_count * bfd_coff_relsz (abfd); |
|
|
|
#ifdef COFF_WITH_PE |
|
|
|
/* extra reloc to hold real count */ |
|
|
|
/* Extra reloc to hold real count. */ |
|
|
|
if (obj_pe (abfd) && current->reloc_count >= 0xffff) |
|
|
|
reloc_base += bfd_coff_relsz (abfd); |
|
|
|
#endif |
|
|
|
@ -3564,19 +3570,14 @@ coff_write_object_contents (abfd) |
|
|
|
section.s_paddr = 0; |
|
|
|
#endif |
|
|
|
|
|
|
|
/*
|
|
|
|
If this section has no size or is unloadable then the scnptr |
|
|
|
will be 0 too |
|
|
|
*/ |
|
|
|
/* If this section has no size or is unloadable then the scnptr
|
|
|
|
will be 0 too. */ |
|
|
|
if (current->_raw_size == 0 || |
|
|
|
(current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) |
|
|
|
{ |
|
|
|
section.s_scnptr = 0; |
|
|
|
} |
|
|
|
section.s_scnptr = 0; |
|
|
|
else |
|
|
|
{ |
|
|
|
section.s_scnptr = current->filepos; |
|
|
|
} |
|
|
|
section.s_scnptr = current->filepos; |
|
|
|
|
|
|
|
section.s_relptr = current->rel_filepos; |
|
|
|
section.s_lnnoptr = current->line_filepos; |
|
|
|
section.s_nreloc = current->reloc_count; |
|
|
|
@ -3606,17 +3607,11 @@ coff_write_object_contents (abfd) |
|
|
|
section.s_flags = sec_to_styp_flags (current->name, current->flags); |
|
|
|
|
|
|
|
if (!strcmp (current->name, _TEXT)) |
|
|
|
{ |
|
|
|
text_sec = current; |
|
|
|
} |
|
|
|
text_sec = current; |
|
|
|
else if (!strcmp (current->name, _DATA)) |
|
|
|
{ |
|
|
|
data_sec = current; |
|
|
|
} |
|
|
|
data_sec = current; |
|
|
|
else if (!strcmp (current->name, _BSS)) |
|
|
|
{ |
|
|
|
bss_sec = current; |
|
|
|
} |
|
|
|
bss_sec = current; |
|
|
|
|
|
|
|
#ifdef I960 |
|
|
|
section.s_align = (current->alignment_power |
|
|
|
@ -3624,7 +3619,7 @@ coff_write_object_contents (abfd) |
|
|
|
: 0); |
|
|
|
#endif |
|
|
|
#ifdef TIC80COFF |
|
|
|
/* TI COFF puts the alignment power in bits 8-11 of the flags */ |
|
|
|
/* TI COFF puts the alignment power in bits 8-11 of the flags. */ |
|
|
|
section.s_flags |= (current->alignment_power & 0xF) << 8; |
|
|
|
#endif |
|
|
|
#ifdef COFF_ENCODE_ALIGNMENT |
|
|
|
@ -3781,14 +3776,11 @@ coff_write_object_contents (abfd) |
|
|
|
|
|
|
|
/* Don't include the internal abs section in the section count */ |
|
|
|
|
|
|
|
/*
|
|
|
|
We will NOT put a fucking timestamp in the header here. Every time you |
|
|
|
/* We will NOT put a fucking timestamp in the header here. Every time you
|
|
|
|
put it back, I will come in and take it out again. I'm sorry. This |
|
|
|
field does not belong here. We fill it with a 0 so it compares the |
|
|
|
same but is not a reasonable time. -- gnu@cygnus.com |
|
|
|
*/ |
|
|
|
same but is not a reasonable time. -- gnu@cygnus.com */ |
|
|
|
internal_f.f_timdat = 0; |
|
|
|
|
|
|
|
internal_f.f_flags = 0; |
|
|
|
|
|
|
|
if (abfd->flags & EXEC_P) |
|
|
|
@ -3825,18 +3817,16 @@ coff_write_object_contents (abfd) |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef TI_TARGET_ID |
|
|
|
/* target id is used in TI COFF v1 and later; COFF0 won't use this field,
|
|
|
|
but it doesn't hurt to set it internally */ |
|
|
|
/* Target id is used in TI COFF v1 and later; COFF0 won't use this field,
|
|
|
|
but it doesn't hurt to set it internally. */ |
|
|
|
internal_f.f_target_id = TI_TARGET_ID; |
|
|
|
#endif |
|
|
|
#ifdef TIC80_TARGET_ID |
|
|
|
internal_f.f_target_id = TIC80_TARGET_ID; |
|
|
|
#endif |
|
|
|
|
|
|
|
/*
|
|
|
|
FIXME, should do something about the other byte orders and |
|
|
|
architectures. |
|
|
|
*/ |
|
|
|
/* FIXME, should do something about the other byte orders and
|
|
|
|
architectures. */ |
|
|
|
|
|
|
|
#ifdef RS6000COFF_C |
|
|
|
if ((abfd->flags & DYNAMIC) != 0) |
|
|
|
@ -3847,11 +3837,11 @@ coff_write_object_contents (abfd) |
|
|
|
|
|
|
|
memset (&internal_a, 0, sizeof internal_a); |
|
|
|
|
|
|
|
/* Set up architecture-dependent stuff */ |
|
|
|
|
|
|
|
/* Set up architecture-dependent stuff. */ |
|
|
|
{ |
|
|
|
unsigned int magic = 0; |
|
|
|
unsigned short flags = 0; |
|
|
|
|
|
|
|
coff_set_flags (abfd, &magic, &flags); |
|
|
|
internal_f.f_magic = magic; |
|
|
|
internal_f.f_flags |= flags; |
|
|
|
@ -3860,14 +3850,13 @@ coff_write_object_contents (abfd) |
|
|
|
#ifdef A29K |
|
|
|
#ifdef ULTRA3 /* NYU's machine */ |
|
|
|
/* FIXME: This is a bogus check. I really want to see if there
|
|
|
|
* is a .shbss or a .shdata section, if so then set the magic |
|
|
|
* number to indicate a shared data executable. |
|
|
|
*/ |
|
|
|
is a .shbss or a .shdata section, if so then set the magic |
|
|
|
number to indicate a shared data executable. */ |
|
|
|
if (internal_f.f_nscns >= 7) |
|
|
|
internal_a.magic = SHMAGIC; /* Shared magic */ |
|
|
|
internal_a.magic = SHMAGIC; /* Shared magic. */ |
|
|
|
else |
|
|
|
#endif /* ULTRA3 */ |
|
|
|
internal_a.magic = NMAGIC; /* Assume separate i/d */ |
|
|
|
internal_a.magic = NMAGIC; /* Assume separate i/d. */ |
|
|
|
#define __A_MAGIC_SET__ |
|
|
|
#endif /* A29K */ |
|
|
|
#ifdef TICOFF_AOUT_MAGIC |
|
|
|
@ -3982,7 +3971,7 @@ coff_write_object_contents (abfd) |
|
|
|
/* FIXME: Does anybody ever set this to another value? */ |
|
|
|
internal_a.vstamp = 0; |
|
|
|
|
|
|
|
/* Now should write relocs, strings, syms */ |
|
|
|
/* Now should write relocs, strings, syms. */ |
|
|
|
obj_sym_filepos (abfd) = sym_base; |
|
|
|
|
|
|
|
if (bfd_get_symcount (abfd) != 0) |
|
|
|
@ -4165,7 +4154,7 @@ coff_write_object_contents (abfd) |
|
|
|
if (abfd->flags & EXEC_P) |
|
|
|
{ |
|
|
|
/* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
|
|
|
|
include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)) */ |
|
|
|
include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)). */ |
|
|
|
char * buff; |
|
|
|
bfd_size_type amount = bfd_coff_aoutsz (abfd); |
|
|
|
|
|
|
|
@ -4214,7 +4203,7 @@ coff_set_section_contents (abfd, section, location, offset, count) |
|
|
|
file_ptr offset; |
|
|
|
bfd_size_type count; |
|
|
|
{ |
|
|
|
if (! abfd->output_has_begun) /* set by bfd.c handler */ |
|
|
|
if (! abfd->output_has_begun) /* Set by bfd.c handler. */ |
|
|
|
{ |
|
|
|
if (! coff_compute_section_file_positions (abfd)) |
|
|
|
return FALSE; |
|
|
|
@ -4241,7 +4230,7 @@ coff_set_section_contents (abfd, section, location, offset, count) |
|
|
|
code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe |
|
|
|
<robertl@arnet.com> (Thanks!). |
|
|
|
|
|
|
|
Gvran Uddeborg <gvran@uddeborg.pp.se> */ |
|
|
|
Gvran Uddeborg <gvran@uddeborg.pp.se>. */ |
|
|
|
|
|
|
|
if (strcmp (section->name, _LIB) == 0) |
|
|
|
{ |
|
|
|
@ -4365,6 +4354,7 @@ coff_slurp_line_table (abfd, asect) |
|
|
|
while (counter < asect->lineno_count) |
|
|
|
{ |
|
|
|
struct internal_lineno dst; |
|
|
|
|
|
|
|
bfd_coff_swap_lineno_in (abfd, src, &dst); |
|
|
|
cache_ptr->line_number = dst.l_lnno; |
|
|
|
|
|
|
|
@ -4430,19 +4420,16 @@ coff_slurp_symbol_table (abfd) |
|
|
|
coff_symbol_type *cached_area; |
|
|
|
unsigned int *table_ptr; |
|
|
|
bfd_size_type amt; |
|
|
|
|
|
|
|
unsigned int number_of_symbols = 0; |
|
|
|
|
|
|
|
if (obj_symbols (abfd)) |
|
|
|
return TRUE; |
|
|
|
|
|
|
|
/* Read in the symbol table */ |
|
|
|
/* Read in the symbol table. */ |
|
|
|
if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL) |
|
|
|
{ |
|
|
|
return FALSE; |
|
|
|
} /* on error */ |
|
|
|
return FALSE; |
|
|
|
|
|
|
|
/* Allocate enough room for all the symbols in cached form */ |
|
|
|
/* Allocate enough room for all the symbols in cached form. */ |
|
|
|
amt = obj_raw_syment_count (abfd); |
|
|
|
amt *= sizeof (coff_symbol_type); |
|
|
|
cached_area = (coff_symbol_type *) bfd_alloc (abfd, amt); |
|
|
|
@ -4460,6 +4447,7 @@ coff_slurp_symbol_table (abfd) |
|
|
|
coff_symbol_type *dst = cached_area; |
|
|
|
unsigned int last_native_index = obj_raw_syment_count (abfd); |
|
|
|
unsigned int this_index = 0; |
|
|
|
|
|
|
|
while (this_index < last_native_index) |
|
|
|
{ |
|
|
|
combined_entry_type *src = native_symbols + this_index; |
|
|
|
@ -4483,8 +4471,7 @@ coff_slurp_symbol_table (abfd) |
|
|
|
dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL; |
|
|
|
dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION; |
|
|
|
#endif |
|
|
|
/* Fall through to next case */ |
|
|
|
|
|
|
|
/* Fall through to next case. */ |
|
|
|
#endif |
|
|
|
|
|
|
|
case C_EXT: |
|
|
|
@ -4497,10 +4484,10 @@ coff_slurp_symbol_table (abfd) |
|
|
|
case C_HIDEXT: |
|
|
|
#endif |
|
|
|
#ifdef C_SYSTEM |
|
|
|
case C_SYSTEM: /* System Wide variable */ |
|
|
|
case C_SYSTEM: /* System Wide variable. */ |
|
|
|
#endif |
|
|
|
#ifdef COFF_WITH_PE |
|
|
|
/* In PE, 0x68 (104) denotes a section symbol */ |
|
|
|
/* In PE, 0x68 (104) denotes a section symbol. */ |
|
|
|
case C_SECTION: |
|
|
|
/* In PE, 0x69 (105) denotes a weak external symbol. */ |
|
|
|
case C_NT_WEAK: |
|
|
|
@ -4574,16 +4561,16 @@ coff_slurp_symbol_table (abfd) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case C_STAT: /* static */ |
|
|
|
case C_STAT: /* Static. */ |
|
|
|
#ifdef I960 |
|
|
|
case C_LEAFSTAT: /* static leaf procedure */ |
|
|
|
case C_LEAFSTAT: /* Static leaf procedure. */ |
|
|
|
#endif |
|
|
|
#if defined ARM |
|
|
|
case C_THUMBSTAT: /* Thumb static */ |
|
|
|
case C_THUMBLABEL: /* Thumb label */ |
|
|
|
case C_THUMBSTATFUNC:/* Thumb static function */ |
|
|
|
case C_THUMBSTAT: /* Thumb static. */ |
|
|
|
case C_THUMBLABEL: /* Thumb label. */ |
|
|
|
case C_THUMBSTATFUNC:/* Thumb static function. */ |
|
|
|
#endif |
|
|
|
case C_LABEL: /* label */ |
|
|
|
case C_LABEL: /* Label. */ |
|
|
|
if (src->u.syment.n_scnum == N_DEBUG) |
|
|
|
dst->symbol.flags = BSF_DEBUGGING; |
|
|
|
else |
|
|
|
@ -4606,35 +4593,35 @@ coff_slurp_symbol_table (abfd) |
|
|
|
dst->symbol.value = src->u.syment.n_value; |
|
|
|
break; |
|
|
|
|
|
|
|
case C_MOS: /* member of structure */ |
|
|
|
case C_EOS: /* end of structure */ |
|
|
|
#ifdef NOTDEF /* C_AUTOARG has the same value */ |
|
|
|
case C_MOS: /* Member of structure. */ |
|
|
|
case C_EOS: /* End of structure. */ |
|
|
|
#ifdef NOTDEF /* C_AUTOARG has the same value. */ |
|
|
|
#ifdef C_GLBLREG |
|
|
|
case C_GLBLREG: /* A29k-specific storage class */ |
|
|
|
case C_GLBLREG: /* A29k-specific storage class. */ |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
case C_REGPARM: /* register parameter */ |
|
|
|
case C_REG: /* register variable */ |
|
|
|
/* C_AUTOARG conflictes with TI COFF C_UEXT */ |
|
|
|
case C_REGPARM: /* Register parameter. */ |
|
|
|
case C_REG: /* register variable. */ |
|
|
|
/* C_AUTOARG conflictes with TI COFF C_UEXT. */ |
|
|
|
#if !defined (TIC80COFF) && !defined (TICOFF) |
|
|
|
#ifdef C_AUTOARG |
|
|
|
case C_AUTOARG: /* 960-specific storage class */ |
|
|
|
case C_AUTOARG: /* 960-specific storage class. */ |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
case C_TPDEF: /* type definition */ |
|
|
|
case C_TPDEF: /* Type definition. */ |
|
|
|
case C_ARG: |
|
|
|
case C_AUTO: /* automatic variable */ |
|
|
|
case C_FIELD: /* bit field */ |
|
|
|
case C_ENTAG: /* enumeration tag */ |
|
|
|
case C_MOE: /* member of enumeration */ |
|
|
|
case C_MOU: /* member of union */ |
|
|
|
case C_UNTAG: /* union tag */ |
|
|
|
case C_AUTO: /* Automatic variable. */ |
|
|
|
case C_FIELD: /* Bit field. */ |
|
|
|
case C_ENTAG: /* Enumeration tag. */ |
|
|
|
case C_MOE: /* Member of enumeration. */ |
|
|
|
case C_MOU: /* Member of union. */ |
|
|
|
case C_UNTAG: /* Union tag. */ |
|
|
|
dst->symbol.flags = BSF_DEBUGGING; |
|
|
|
dst->symbol.value = (src->u.syment.n_value); |
|
|
|
break; |
|
|
|
|
|
|
|
case C_FILE: /* file name */ |
|
|
|
case C_STRTAG: /* structure tag */ |
|
|
|
case C_FILE: /* File name. */ |
|
|
|
case C_STRTAG: /* Structure tag. */ |
|
|
|
#ifdef RS6000COFF_C |
|
|
|
case C_GSYM: |
|
|
|
case C_LSYM: |
|
|
|
@ -4654,8 +4641,8 @@ coff_slurp_symbol_table (abfd) |
|
|
|
break; |
|
|
|
|
|
|
|
#ifdef RS6000COFF_C |
|
|
|
case C_BINCL: /* beginning of include file */ |
|
|
|
case C_EINCL: /* ending of include file */ |
|
|
|
case C_BINCL: /* Beginning of include file. */ |
|
|
|
case C_EINCL: /* Ending of include file. */ |
|
|
|
/* The value is actually a pointer into the line numbers
|
|
|
|
of the file. We locate the line number entry, and |
|
|
|
set the section to the section which contains it, and |
|
|
|
@ -4696,9 +4683,9 @@ coff_slurp_symbol_table (abfd) |
|
|
|
break; |
|
|
|
#endif |
|
|
|
|
|
|
|
case C_BLOCK: /* ".bb" or ".eb" */ |
|
|
|
case C_FCN: /* ".bf" or ".ef" (or PE ".lf") */ |
|
|
|
case C_EFCN: /* physical end of function */ |
|
|
|
case C_BLOCK: /* ".bb" or ".eb". */ |
|
|
|
case C_FCN: /* ".bf" or ".ef" (or PE ".lf"). */ |
|
|
|
case C_EFCN: /* Physical end of function. */ |
|
|
|
#if defined COFF_WITH_PE |
|
|
|
/* PE sets the symbol to a value relative to the start
|
|
|
|
of the section. */ |
|
|
|
@ -4720,7 +4707,7 @@ coff_slurp_symbol_table (abfd) |
|
|
|
#endif |
|
|
|
break; |
|
|
|
|
|
|
|
case C_STATLAB: /* Static load time label */ |
|
|
|
case C_STATLAB: /* Static load time label. */ |
|
|
|
dst->symbol.value = src->u.syment.n_value; |
|
|
|
dst->symbol.flags = BSF_GLOBAL; |
|
|
|
break; |
|
|
|
@ -4733,22 +4720,22 @@ coff_slurp_symbol_table (abfd) |
|
|
|
&& src->u.syment.n_scnum == 0) |
|
|
|
break; |
|
|
|
/* Fall through. */ |
|
|
|
case C_EXTDEF: /* external definition */ |
|
|
|
case C_ULABEL: /* undefined label */ |
|
|
|
case C_USTATIC: /* undefined static */ |
|
|
|
case C_EXTDEF: /* External definition. */ |
|
|
|
case C_ULABEL: /* Undefined label. */ |
|
|
|
case C_USTATIC: /* Undefined static. */ |
|
|
|
#ifndef COFF_WITH_PE |
|
|
|
/* C_LINE in regular coff is 0x68. NT has taken over this storage
|
|
|
|
class to represent a section symbol */ |
|
|
|
case C_LINE: /* line # reformatted as symbol table entry */ |
|
|
|
class to represent a section symbol. */ |
|
|
|
case C_LINE: /* line # reformatted as symbol table entry. */ |
|
|
|
/* NT uses 0x67 for a weak symbol, not C_ALIAS. */ |
|
|
|
case C_ALIAS: /* duplicate tag */ |
|
|
|
case C_ALIAS: /* Duplicate tag. */ |
|
|
|
#endif |
|
|
|
/* New storage classes for TI COFF */ |
|
|
|
/* New storage classes for TI COFF. */ |
|
|
|
#if defined(TIC80COFF) || defined(TICOFF) |
|
|
|
case C_UEXT: /* Tentative external definition */ |
|
|
|
case C_UEXT: /* Tentative external definition. */ |
|
|
|
#endif |
|
|
|
case C_EXTLAB: /* External load time label */ |
|
|
|
case C_HIDDEN: /* ext symbol in dmert public lib */ |
|
|
|
case C_EXTLAB: /* External load time label. */ |
|
|
|
case C_HIDDEN: /* Ext symbol in dmert public lib. */ |
|
|
|
default: |
|
|
|
(*_bfd_error_handler) |
|
|
|
(_("%s: Unrecognized storage class %d for %s symbol `%s'"), |
|
|
|
@ -4768,17 +4755,18 @@ coff_slurp_symbol_table (abfd) |
|
|
|
this_index += (src->u.syment.n_numaux) + 1; |
|
|
|
dst++; |
|
|
|
number_of_symbols++; |
|
|
|
} /* walk the native symtab */ |
|
|
|
} /* bfdize the native symtab */ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
obj_symbols (abfd) = cached_area; |
|
|
|
obj_raw_syments (abfd) = native_symbols; |
|
|
|
|
|
|
|
bfd_get_symcount (abfd) = number_of_symbols; |
|
|
|
obj_convert (abfd) = table_ptr; |
|
|
|
/* Slurp the line tables for each section too */ |
|
|
|
/* Slurp the line tables for each section too. */ |
|
|
|
{ |
|
|
|
asection *p; |
|
|
|
|
|
|
|
p = abfd->sections; |
|
|
|
while (p) |
|
|
|
{ |
|
|
|
@ -4786,6 +4774,7 @@ coff_slurp_symbol_table (abfd) |
|
|
|
p = p->next; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return TRUE; |
|
|
|
} /* coff_slurp_symbol_table() */ |
|
|
|
|
|
|
|
@ -5012,15 +5001,15 @@ coff_slurp_reloc_table (abfd, asect, symbols) |
|
|
|
refering to the symbols in the raw data have not been |
|
|
|
modified, so we have to have a negative addend to compensate. |
|
|
|
|
|
|
|
Note that symbols which used to be common must be left alone */ |
|
|
|
Note that symbols which used to be common must be left alone. */ |
|
|
|
|
|
|
|
/* Calculate any reloc addend by looking at the symbol */ |
|
|
|
/* Calculate any reloc addend by looking at the symbol. */ |
|
|
|
CALC_ADDEND (abfd, ptr, dst, cache_ptr); |
|
|
|
|
|
|
|
cache_ptr->address -= asect->vma; |
|
|
|
/* !! cache_ptr->section = (asection *) NULL;*/ |
|
|
|
|
|
|
|
/* Fill in the cache_ptr->howto field from dst.r_type */ |
|
|
|
/* Fill in the cache_ptr->howto field from dst.r_type. */ |
|
|
|
RTYPE2HOWTO (cache_ptr, &dst); |
|
|
|
#endif /* RELOC_PROCESSING */ |
|
|
|
|
|
|
|
@ -5088,16 +5077,16 @@ coff_canonicalize_reloc (abfd, section, relptr, symbols) |
|
|
|
|
|
|
|
if (section->flags & SEC_CONSTRUCTOR) |
|
|
|
{ |
|
|
|
/* this section has relocs made up by us, they are not in the
|
|
|
|
file, so take them out of their chain and place them into |
|
|
|
the data area provided */ |
|
|
|
/* This section has relocs made up by us, they are not in the
|
|
|
|
file, so take them out of their chain and place them into |
|
|
|
the data area provided. */ |
|
|
|
arelent_chain *chain = section->constructor_chain; |
|
|
|
|
|
|
|
for (count = 0; count < section->reloc_count; count++) |
|
|
|
{ |
|
|
|
*relptr++ = &chain->relent; |
|
|
|
chain = chain->next; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
|