mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-17 07:53:51 +08:00
Extensive minor changes to avoid various gcc warnings. Also:
* Makefile.in (BFD32_BACKENDS): Remove coff-arm.o. * archures.c (bfd_arch_info_type): Change mach field from long to unsigned long. (bfd_lookup_arch): Change machine parameter from long to unsigned long.
This commit is contained in:
@ -1,3 +1,12 @@
|
|||||||
|
Tue Sep 12 12:14:33 1995 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
|
Extensive minor changes to avoid various gcc warnings. Also:
|
||||||
|
* Makefile.in (BFD32_BACKENDS): Remove coff-arm.o.
|
||||||
|
* archures.c (bfd_arch_info_type): Change mach field from long to
|
||||||
|
unsigned long.
|
||||||
|
(bfd_lookup_arch): Change machine parameter from long to unsigned
|
||||||
|
long.
|
||||||
|
|
||||||
Mon Sep 11 10:55:47 1995 Ian Lance Taylor <ian@cygnus.com>
|
Mon Sep 11 10:55:47 1995 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
* sunos.c (sunos_scan_std_relocs): Fix BFD_ASSERT: it's OK to find
|
* sunos.c (sunos_scan_std_relocs): Fix BFD_ASSERT: it's OK to find
|
||||||
|
@ -134,7 +134,6 @@ BFD32_BACKENDS = \
|
|||||||
cf-sparclynx.o \
|
cf-sparclynx.o \
|
||||||
coff-a29k.o \
|
coff-a29k.o \
|
||||||
coff-apollo.o \
|
coff-apollo.o \
|
||||||
coff-arm.o \
|
|
||||||
coff-h8300.o \
|
coff-h8300.o \
|
||||||
coff-h8500.o \
|
coff-h8500.o \
|
||||||
coff-i386.o \
|
coff-i386.o \
|
||||||
|
@ -16,7 +16,7 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
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 "bfd.h"
|
#include "bfd.h"
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
@ -27,21 +27,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#include "aout/stab_gnu.h"
|
#include "aout/stab_gnu.h"
|
||||||
#include "libaout.h" /* BFD a.out internal data structures */
|
#include "libaout.h" /* BFD a.out internal data structures */
|
||||||
|
|
||||||
extern bfd_target a_out_adobe_vec; /* Forward decl */
|
extern const bfd_target a_out_adobe_vec; /* Forward decl */
|
||||||
|
|
||||||
PROTO (static bfd_target *, aout_adobe_callback, (bfd *));
|
static const bfd_target *aout_adobe_callback PARAMS ((bfd *));
|
||||||
|
|
||||||
PROTO (boolean, aout_32_slurp_symbol_table, (bfd *abfd));
|
extern boolean aout_32_slurp_symbol_table PARAMS ((bfd *abfd));
|
||||||
PROTO (boolean , aout_32_write_syms, ());
|
extern boolean aout_32_write_syms PARAMS ((bfd *));
|
||||||
PROTO (static void, aout_adobe_write_section, (bfd *abfd, sec_ptr sect));
|
static void aout_adobe_write_section PARAMS ((bfd *abfd, sec_ptr sect));
|
||||||
|
|
||||||
/* Swaps the information in an executable header taken from a raw byte
|
/* Swaps the information in an executable header taken from a raw byte
|
||||||
stream memory image, into the internal exec_header structure. */
|
stream memory image, into the internal exec_header structure. */
|
||||||
|
|
||||||
PROTO(void, aout_adobe_swap_exec_header_in,
|
void aout_adobe_swap_exec_header_in
|
||||||
(bfd *abfd,
|
PARAMS ((bfd *abfd, struct external_exec *raw_bytes,
|
||||||
struct external_exec *raw_bytes,
|
struct internal_exec *execp));
|
||||||
struct internal_exec *execp));
|
|
||||||
|
|
||||||
void
|
void
|
||||||
aout_adobe_swap_exec_header_in (abfd, raw_bytes, execp)
|
aout_adobe_swap_exec_header_in (abfd, raw_bytes, execp)
|
||||||
@ -89,7 +88,7 @@ aout_adobe_swap_exec_header_out (abfd, execp, raw_bytes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bfd_target *
|
static const bfd_target *
|
||||||
aout_adobe_object_p (abfd)
|
aout_adobe_object_p (abfd)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
@ -133,7 +132,7 @@ aout_adobe_object_p (abfd)
|
|||||||
/* Finish up the opening of a b.out file for reading. Fill in all the
|
/* Finish up the opening of a b.out file for reading. Fill in all the
|
||||||
fields that are not handled by common code. */
|
fields that are not handled by common code. */
|
||||||
|
|
||||||
static bfd_target *
|
static const bfd_target *
|
||||||
aout_adobe_callback (abfd)
|
aout_adobe_callback (abfd)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
@ -387,10 +386,10 @@ aout_adobe_write_section (abfd, sect)
|
|||||||
static boolean
|
static boolean
|
||||||
aout_adobe_set_section_contents (abfd, section, location, offset, count)
|
aout_adobe_set_section_contents (abfd, section, location, offset, count)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
sec_ptr section;
|
asection *section;
|
||||||
unsigned char *location;
|
PTR location;
|
||||||
file_ptr offset;
|
file_ptr offset;
|
||||||
int count;
|
bfd_size_type count;
|
||||||
{
|
{
|
||||||
file_ptr section_start;
|
file_ptr section_start;
|
||||||
sec_ptr sect;
|
sec_ptr sect;
|
||||||
@ -444,9 +443,11 @@ aout_adobe_set_arch_mach (abfd, arch, machine)
|
|||||||
enum bfd_architecture arch;
|
enum bfd_architecture arch;
|
||||||
unsigned long machine;
|
unsigned long machine;
|
||||||
{
|
{
|
||||||
bfd_default_set_arch_mach(abfd, arch, machine);
|
if (! bfd_default_set_arch_mach (abfd, arch, machine))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (arch == bfd_arch_unknown) /* Unknown machine arch is OK */
|
if (arch == bfd_arch_unknown
|
||||||
|
|| arch == bfd_arch_m68k)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -471,7 +472,7 @@ aout_adobe_sizeof_headers (ignore_abfd, ignore)
|
|||||||
((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
|
((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
|
||||||
|
|
||||||
#define aout_32_bfd_reloc_type_lookup \
|
#define aout_32_bfd_reloc_type_lookup \
|
||||||
((CONST struct reloc_howto_struct *(*) \
|
((reloc_howto_type *(*) \
|
||||||
PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
|
PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
|
||||||
|
|
||||||
#define aout_32_set_arch_mach aout_adobe_set_arch_mach
|
#define aout_32_set_arch_mach aout_adobe_set_arch_mach
|
||||||
@ -485,8 +486,9 @@ aout_adobe_sizeof_headers (ignore_abfd, ignore)
|
|||||||
_bfd_generic_link_hash_table_create
|
_bfd_generic_link_hash_table_create
|
||||||
#define aout_32_bfd_link_add_symbols _bfd_generic_link_add_symbols
|
#define aout_32_bfd_link_add_symbols _bfd_generic_link_add_symbols
|
||||||
#define aout_32_bfd_final_link _bfd_generic_final_link
|
#define aout_32_bfd_final_link _bfd_generic_final_link
|
||||||
|
#define aout_32_bfd_link_split_section _bfd_generic_link_split_section
|
||||||
|
|
||||||
bfd_target a_out_adobe_vec =
|
const bfd_target a_out_adobe_vec =
|
||||||
{
|
{
|
||||||
"a.out.adobe", /* name */
|
"a.out.adobe", /* name */
|
||||||
bfd_target_aout_flavour,
|
bfd_target_aout_flavour,
|
||||||
|
463
bfd/aoutx.h
463
bfd/aoutx.h
@ -117,8 +117,7 @@ DESCRIPTION
|
|||||||
(Just want to make these explicit, so the conditions tested in this
|
(Just want to make these explicit, so the conditions tested in this
|
||||||
file make sense if you're more familiar with a.out than with BFD.) */
|
file make sense if you're more familiar with a.out than with BFD.) */
|
||||||
|
|
||||||
#define KEEPIT flags
|
#define KEEPIT udata.i
|
||||||
#define KEEPITTYPE int
|
|
||||||
|
|
||||||
#include <string.h> /* For strchr and friends */
|
#include <string.h> /* For strchr and friends */
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
@ -189,9 +188,9 @@ reloc_howto_type howto_table_ext[] =
|
|||||||
HOWTO(RELOC_BASE10, 0, 2, 16, false, 0, complain_overflow_bitfield,0,"BASE10", false, 0,0x0000ffff, false),
|
HOWTO(RELOC_BASE10, 0, 2, 16, false, 0, complain_overflow_bitfield,0,"BASE10", false, 0,0x0000ffff, false),
|
||||||
HOWTO(RELOC_BASE13, 0, 2, 13, false, 0, complain_overflow_bitfield,0,"BASE13", false, 0,0x00001fff, false),
|
HOWTO(RELOC_BASE13, 0, 2, 13, false, 0, complain_overflow_bitfield,0,"BASE13", false, 0,0x00001fff, false),
|
||||||
HOWTO(RELOC_BASE22, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"BASE22", false, 0,0x00000000, false),
|
HOWTO(RELOC_BASE22, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"BASE22", false, 0,0x00000000, false),
|
||||||
HOWTO(RELOC_PC10, 0, 2, 10, false, 0, complain_overflow_bitfield,0,"PC10", false, 0,0x000003ff, false),
|
HOWTO(RELOC_PC10, 0, 2, 10, true, 0, complain_overflow_dont,0,"PC10", false, 0,0x000003ff, true),
|
||||||
HOWTO(RELOC_PC22, 0, 2, 22, false, 0, complain_overflow_bitfield,0,"PC22", false, 0,0x003fffff, false),
|
HOWTO(RELOC_PC22, 10, 2, 22, true, 0, complain_overflow_signed,0,"PC22", false, 0,0x003fffff, true),
|
||||||
HOWTO(RELOC_JMP_TBL,0, 2, 32, false, 0, complain_overflow_bitfield,0,"JMP_TBL", false, 0,0xffffffff, false),
|
HOWTO(RELOC_JMP_TBL,2, 2, 30, true, 0, complain_overflow_signed,0,"JMP_TBL", false, 0,0x3fffffff, false),
|
||||||
HOWTO(RELOC_SEGOFF16,0, 2, 0, false, 0, complain_overflow_bitfield,0,"SEGOFF16", false, 0,0x00000000, false),
|
HOWTO(RELOC_SEGOFF16,0, 2, 0, false, 0, complain_overflow_bitfield,0,"SEGOFF16", false, 0,0x00000000, false),
|
||||||
HOWTO(RELOC_GLOB_DAT,0, 2, 0, false, 0, complain_overflow_bitfield,0,"GLOB_DAT", false, 0,0x00000000, false),
|
HOWTO(RELOC_GLOB_DAT,0, 2, 0, false, 0, complain_overflow_bitfield,0,"GLOB_DAT", false, 0,0x00000000, false),
|
||||||
HOWTO(RELOC_JMP_SLOT,0, 2, 0, false, 0, complain_overflow_bitfield,0,"JMP_SLOT", false, 0,0x00000000, false),
|
HOWTO(RELOC_JMP_SLOT,0, 2, 0, false, 0, complain_overflow_bitfield,0,"JMP_SLOT", false, 0,0x00000000, false),
|
||||||
@ -267,7 +266,13 @@ NAME(aout,reloc_type_lookup) (abfd,code)
|
|||||||
EXT (BFD_RELOC_32_PCREL_S2, 6);
|
EXT (BFD_RELOC_32_PCREL_S2, 6);
|
||||||
EXT (BFD_RELOC_SPARC_WDISP22, 7);
|
EXT (BFD_RELOC_SPARC_WDISP22, 7);
|
||||||
EXT (BFD_RELOC_SPARC13, 10);
|
EXT (BFD_RELOC_SPARC13, 10);
|
||||||
|
EXT (BFD_RELOC_SPARC_GOT10, 14);
|
||||||
EXT (BFD_RELOC_SPARC_BASE13, 15);
|
EXT (BFD_RELOC_SPARC_BASE13, 15);
|
||||||
|
EXT (BFD_RELOC_SPARC_GOT13, 15);
|
||||||
|
EXT (BFD_RELOC_SPARC_GOT22, 16);
|
||||||
|
EXT (BFD_RELOC_SPARC_PC10, 17);
|
||||||
|
EXT (BFD_RELOC_SPARC_PC22, 18);
|
||||||
|
EXT (BFD_RELOC_SPARC_WPLT30, 19);
|
||||||
default: return (reloc_howto_type *) NULL;
|
default: return (reloc_howto_type *) NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -675,7 +680,10 @@ NAME(aout,machine_type) (arch, machine, unknown)
|
|||||||
|
|
||||||
switch (arch) {
|
switch (arch) {
|
||||||
case bfd_arch_sparc:
|
case bfd_arch_sparc:
|
||||||
if (machine == 0) arch_flags = M_SPARC;
|
if (machine == 0
|
||||||
|
|| machine == bfd_mach_sparc
|
||||||
|
|| machine == bfd_mach_sparc64)
|
||||||
|
arch_flags = M_SPARC;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case bfd_arch_m68k:
|
case bfd_arch_m68k:
|
||||||
@ -1873,7 +1881,7 @@ NAME(aout,write_syms) (abfd)
|
|||||||
!= EXTERNAL_NLIST_SIZE)
|
!= EXTERNAL_NLIST_SIZE)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* NB: `KEEPIT' currently overlays `flags', so set this only
|
/* NB: `KEEPIT' currently overlays `udata.p', so set this only
|
||||||
here, at the end. */
|
here, at the end. */
|
||||||
g->KEEPIT = count;
|
g->KEEPIT = count;
|
||||||
}
|
}
|
||||||
@ -1966,7 +1974,7 @@ NAME(aout,swap_std_reloc_out) (abfd, g, natptr)
|
|||||||
{
|
{
|
||||||
/* Fill in symbol */
|
/* Fill in symbol */
|
||||||
r_extern = 1;
|
r_extern = 1;
|
||||||
r_index = stoi((*(g->sym_ptr_ptr))->KEEPIT);
|
r_index = (*(g->sym_ptr_ptr))->KEEPIT;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2024,7 +2032,9 @@ NAME(aout,swap_ext_reloc_out) (abfd, g, natptr)
|
|||||||
|
|
||||||
r_type = (unsigned int) g->howto->type;
|
r_type = (unsigned int) g->howto->type;
|
||||||
|
|
||||||
r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma;
|
r_addend = g->addend;
|
||||||
|
if ((sym->flags & BSF_SECTION_SYM) != 0)
|
||||||
|
r_addend += (*(g->sym_ptr_ptr))->section->output_section->vma;
|
||||||
|
|
||||||
/* If this relocation is relative to a symbol then set the
|
/* If this relocation is relative to a symbol then set the
|
||||||
r_index to the symbols index, and the r_extern bit.
|
r_index to the symbols index, and the r_extern bit.
|
||||||
@ -2033,29 +2043,22 @@ NAME(aout,swap_ext_reloc_out) (abfd, g, natptr)
|
|||||||
from the abs section, or as a symbol which has an abs value.
|
from the abs section, or as a symbol which has an abs value.
|
||||||
check for that here. */
|
check for that here. */
|
||||||
|
|
||||||
if (bfd_is_com_section (output_section)
|
if (bfd_is_abs_section (bfd_get_section (sym)))
|
||||||
|| bfd_is_abs_section (output_section)
|
|
||||||
|| bfd_is_und_section (output_section))
|
|
||||||
{
|
|
||||||
if (bfd_abs_section_ptr->symbol == sym)
|
|
||||||
{
|
{
|
||||||
/* Whoops, looked like an abs symbol, but is really an offset
|
|
||||||
from the abs section */
|
|
||||||
r_index = 0;
|
|
||||||
r_extern = 0;
|
r_extern = 0;
|
||||||
}
|
r_index = 0;
|
||||||
else
|
}
|
||||||
|
else if ((sym->flags & BSF_SECTION_SYM) == 0)
|
||||||
{
|
{
|
||||||
r_extern = 1;
|
r_extern = 1;
|
||||||
r_index = stoi((*(g->sym_ptr_ptr))->KEEPIT);
|
r_index = (*(g->sym_ptr_ptr))->KEEPIT;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Just an ordinary section */
|
/* Just an ordinary section */
|
||||||
r_extern = 0;
|
r_extern = 0;
|
||||||
r_index = output_section->target_index;
|
r_index = output_section->target_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now the fun stuff */
|
/* now the fun stuff */
|
||||||
if (abfd->xvec->header_byteorder_big_p != false) {
|
if (abfd->xvec->header_byteorder_big_p != false) {
|
||||||
@ -2127,7 +2130,7 @@ NAME(aout,swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount)
|
|||||||
asymbol **symbols;
|
asymbol **symbols;
|
||||||
bfd_size_type symcount;
|
bfd_size_type symcount;
|
||||||
{
|
{
|
||||||
int r_index;
|
unsigned int r_index;
|
||||||
int r_extern;
|
int r_extern;
|
||||||
unsigned int r_type;
|
unsigned int r_type;
|
||||||
struct aoutdata *su = &(abfd->tdata.aout_data->a);
|
struct aoutdata *su = &(abfd->tdata.aout_data->a);
|
||||||
@ -2180,13 +2183,13 @@ NAME(aout,swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount)
|
|||||||
asymbol **symbols;
|
asymbol **symbols;
|
||||||
bfd_size_type symcount;
|
bfd_size_type symcount;
|
||||||
{
|
{
|
||||||
int r_index;
|
unsigned int r_index;
|
||||||
int r_extern;
|
int r_extern;
|
||||||
unsigned int r_length;
|
unsigned int r_length;
|
||||||
int r_pcrel;
|
int r_pcrel;
|
||||||
int r_baserel, r_jmptable, r_relative;
|
int r_baserel, r_jmptable, r_relative;
|
||||||
struct aoutdata *su = &(abfd->tdata.aout_data->a);
|
struct aoutdata *su = &(abfd->tdata.aout_data->a);
|
||||||
int howto_idx;
|
unsigned int howto_idx;
|
||||||
|
|
||||||
cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address);
|
cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address);
|
||||||
|
|
||||||
@ -2219,7 +2222,7 @@ NAME(aout,swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount)
|
|||||||
+ 16 * r_jmptable + 32 * r_relative;
|
+ 16 * r_jmptable + 32 * r_relative;
|
||||||
BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_std));
|
BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_std));
|
||||||
cache_ptr->howto = howto_table_std + howto_idx;
|
cache_ptr->howto = howto_table_std + howto_idx;
|
||||||
BFD_ASSERT (cache_ptr->howto->type != -1);
|
BFD_ASSERT (cache_ptr->howto->type != (unsigned int) -1);
|
||||||
|
|
||||||
/* Base relative relocs are always against the symbol table,
|
/* Base relative relocs are always against the symbol table,
|
||||||
regardless of the setting of r_extern. r_extern just reflects
|
regardless of the setting of r_extern. r_extern just reflects
|
||||||
@ -2636,7 +2639,7 @@ NAME(aout,find_nearest_line)
|
|||||||
CONST char *main_file_name = NULL;
|
CONST char *main_file_name = NULL;
|
||||||
CONST char *current_file_name = NULL;
|
CONST char *current_file_name = NULL;
|
||||||
CONST char *line_file_name = NULL; /* Value of current_file_name at line number. */
|
CONST char *line_file_name = NULL; /* Value of current_file_name at line number. */
|
||||||
bfd_vma high_line_vma = ~0;
|
bfd_vma low_line_vma = 0;
|
||||||
bfd_vma low_func_vma = 0;
|
bfd_vma low_func_vma = 0;
|
||||||
asymbol *func = 0;
|
asymbol *func = 0;
|
||||||
*filename_ptr = abfd->filename;
|
*filename_ptr = abfd->filename;
|
||||||
@ -2671,13 +2674,15 @@ NAME(aout,find_nearest_line)
|
|||||||
|
|
||||||
case N_DSLINE:
|
case N_DSLINE:
|
||||||
case N_BSLINE:
|
case N_BSLINE:
|
||||||
/* We'll keep this if it resolves nearer than the one we have already */
|
/* We'll keep this if it resolves nearer than the one we have
|
||||||
if (q->symbol.value >= offset &&
|
already. */
|
||||||
q->symbol.value < high_line_vma) {
|
if (q->symbol.value >= low_line_vma
|
||||||
*line_ptr = q->desc;
|
&& q->symbol.value <= offset)
|
||||||
high_line_vma = q->symbol.value;
|
{
|
||||||
line_file_name = current_file_name;
|
*line_ptr = q->desc;
|
||||||
}
|
low_line_vma = q->symbol.value;
|
||||||
|
line_file_name = current_file_name;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case N_FUN:
|
case N_FUN:
|
||||||
{
|
{
|
||||||
@ -2687,29 +2692,8 @@ NAME(aout,find_nearest_line)
|
|||||||
low_func_vma = q->symbol.value;
|
low_func_vma = q->symbol.value;
|
||||||
func = (asymbol *)q;
|
func = (asymbol *)q;
|
||||||
}
|
}
|
||||||
if (*line_ptr && func) {
|
else if (q->symbol.value > offset)
|
||||||
CONST char *function = func->name;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
/* The caller expects a symbol name. We actually have a
|
|
||||||
function name, without the leading underscore. Put the
|
|
||||||
underscore back in, so that the caller gets a symbol
|
|
||||||
name. */
|
|
||||||
if (bfd_get_symbol_leading_char (abfd) == '\0')
|
|
||||||
strncpy (buffer, function, sizeof (buffer) - 1);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
buffer[0] = bfd_get_symbol_leading_char (abfd);
|
|
||||||
strncpy (buffer + 1, function, sizeof (buffer) - 2);
|
|
||||||
}
|
|
||||||
buffer[sizeof(buffer)-1] = 0;
|
|
||||||
/* Have to remove : stuff */
|
|
||||||
p = strchr(buffer,':');
|
|
||||||
if (p != NULL) { *p = '\0'; }
|
|
||||||
*functionname_ptr = buffer;
|
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2728,8 +2712,29 @@ NAME(aout,find_nearest_line)
|
|||||||
*filename_ptr = filename_buffer;
|
*filename_ptr = filename_buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
if (func)
|
||||||
|
{
|
||||||
|
CONST char *function = func->name;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
/* The caller expects a symbol name. We actually have a
|
||||||
|
function name, without the leading underscore. Put the
|
||||||
|
underscore back in, so that the caller gets a symbol name. */
|
||||||
|
if (bfd_get_symbol_leading_char (abfd) == '\0')
|
||||||
|
strncpy (buffer, function, sizeof (buffer) - 1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buffer[0] = bfd_get_symbol_leading_char (abfd);
|
||||||
|
strncpy (buffer + 1, function, sizeof (buffer) - 2);
|
||||||
|
}
|
||||||
|
buffer[sizeof(buffer)-1] = 0;
|
||||||
|
/* Have to remove : stuff */
|
||||||
|
p = strchr(buffer,':');
|
||||||
|
if (p != NULL)
|
||||||
|
*p = '\0';
|
||||||
|
*functionname_ptr = buffer;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
@ -3405,6 +3410,9 @@ NAME(aout,final_link) (abfd, info, callback)
|
|||||||
asection *o;
|
asection *o;
|
||||||
boolean have_link_order_relocs;
|
boolean have_link_order_relocs;
|
||||||
|
|
||||||
|
if (info->shared)
|
||||||
|
abfd->flags |= DYNAMIC;
|
||||||
|
|
||||||
aout_info.info = info;
|
aout_info.info = info;
|
||||||
aout_info.output_bfd = abfd;
|
aout_info.output_bfd = abfd;
|
||||||
aout_info.contents = NULL;
|
aout_info.contents = NULL;
|
||||||
@ -4324,7 +4332,8 @@ aout_link_input_section_std (finfo, input_bfd, input_section, relocs,
|
|||||||
boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *,
|
boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *,
|
||||||
bfd *, asection *,
|
bfd *, asection *,
|
||||||
struct aout_link_hash_entry *,
|
struct aout_link_hash_entry *,
|
||||||
PTR, boolean *));
|
PTR, bfd_byte *, boolean *,
|
||||||
|
bfd_vma *));
|
||||||
bfd *output_bfd;
|
bfd *output_bfd;
|
||||||
boolean relocateable;
|
boolean relocateable;
|
||||||
struct external_nlist *syms;
|
struct external_nlist *syms;
|
||||||
@ -4357,12 +4366,9 @@ aout_link_input_section_std (finfo, input_bfd, input_section, relocs,
|
|||||||
int r_index;
|
int r_index;
|
||||||
int r_extern;
|
int r_extern;
|
||||||
int r_pcrel;
|
int r_pcrel;
|
||||||
int r_baserel;
|
int r_baserel = 0;
|
||||||
int r_jmptable;
|
|
||||||
int r_relative;
|
|
||||||
int r_length;
|
|
||||||
int howto_idx;
|
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
||||||
|
struct aout_link_hash_entry *h = NULL;
|
||||||
bfd_vma relocation;
|
bfd_vma relocation;
|
||||||
bfd_reloc_status_type r;
|
bfd_reloc_status_type r;
|
||||||
|
|
||||||
@ -4371,37 +4377,47 @@ aout_link_input_section_std (finfo, input_bfd, input_section, relocs,
|
|||||||
#ifdef MY_reloc_howto
|
#ifdef MY_reloc_howto
|
||||||
howto = MY_reloc_howto(input_bfd, rel, r_index, r_extern, r_pcrel);
|
howto = MY_reloc_howto(input_bfd, rel, r_index, r_extern, r_pcrel);
|
||||||
#else
|
#else
|
||||||
if (input_bfd->xvec->header_byteorder_big_p)
|
{
|
||||||
{
|
int r_jmptable;
|
||||||
r_index = ((rel->r_index[0] << 16)
|
int r_relative;
|
||||||
| (rel->r_index[1] << 8)
|
int r_length;
|
||||||
| rel->r_index[2]);
|
unsigned int howto_idx;
|
||||||
r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG));
|
|
||||||
r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_BIG));
|
|
||||||
r_baserel = (0 != (rel->r_type[0] & RELOC_STD_BITS_BASEREL_BIG));
|
|
||||||
r_jmptable= (0 != (rel->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG));
|
|
||||||
r_relative= (0 != (rel->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG));
|
|
||||||
r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_BIG)
|
|
||||||
>> RELOC_STD_BITS_LENGTH_SH_BIG);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r_index = ((rel->r_index[2] << 16)
|
|
||||||
| (rel->r_index[1] << 8)
|
|
||||||
| rel->r_index[0]);
|
|
||||||
r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE));
|
|
||||||
r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE));
|
|
||||||
r_baserel = (0 != (rel->r_type[0] & RELOC_STD_BITS_BASEREL_LITTLE));
|
|
||||||
r_jmptable= (0 != (rel->r_type[0] & RELOC_STD_BITS_JMPTABLE_LITTLE));
|
|
||||||
r_relative= (0 != (rel->r_type[0] & RELOC_STD_BITS_RELATIVE_LITTLE));
|
|
||||||
r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE)
|
|
||||||
>> RELOC_STD_BITS_LENGTH_SH_LITTLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
howto_idx = r_length + 4 * r_pcrel + 8 * r_baserel
|
if (input_bfd->xvec->header_byteorder_big_p)
|
||||||
+ 16 * r_jmptable + 32 * r_relative;
|
{
|
||||||
BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_std));
|
r_index = ((rel->r_index[0] << 16)
|
||||||
howto = howto_table_std + howto_idx;
|
| (rel->r_index[1] << 8)
|
||||||
|
| rel->r_index[2]);
|
||||||
|
r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG));
|
||||||
|
r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_BIG));
|
||||||
|
r_baserel = (0 != (rel->r_type[0] & RELOC_STD_BITS_BASEREL_BIG));
|
||||||
|
r_jmptable= (0 != (rel->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG));
|
||||||
|
r_relative= (0 != (rel->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG));
|
||||||
|
r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_BIG)
|
||||||
|
>> RELOC_STD_BITS_LENGTH_SH_BIG);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r_index = ((rel->r_index[2] << 16)
|
||||||
|
| (rel->r_index[1] << 8)
|
||||||
|
| rel->r_index[0]);
|
||||||
|
r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE));
|
||||||
|
r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE));
|
||||||
|
r_baserel = (0 != (rel->r_type[0]
|
||||||
|
& RELOC_STD_BITS_BASEREL_LITTLE));
|
||||||
|
r_jmptable= (0 != (rel->r_type[0]
|
||||||
|
& RELOC_STD_BITS_JMPTABLE_LITTLE));
|
||||||
|
r_relative= (0 != (rel->r_type[0]
|
||||||
|
& RELOC_STD_BITS_RELATIVE_LITTLE));
|
||||||
|
r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE)
|
||||||
|
>> RELOC_STD_BITS_LENGTH_SH_LITTLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
howto_idx = (r_length + 4 * r_pcrel + 8 * r_baserel
|
||||||
|
+ 16 * r_jmptable + 32 * r_relative);
|
||||||
|
BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_std));
|
||||||
|
howto = howto_table_std + howto_idx;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (relocateable)
|
if (relocateable)
|
||||||
@ -4410,8 +4426,6 @@ aout_link_input_section_std (finfo, input_bfd, input_section, relocs,
|
|||||||
modify the reloc accordingly. */
|
modify the reloc accordingly. */
|
||||||
if (r_extern)
|
if (r_extern)
|
||||||
{
|
{
|
||||||
struct aout_link_hash_entry *h;
|
|
||||||
|
|
||||||
/* If we know the symbol this relocation is against,
|
/* If we know the symbol this relocation is against,
|
||||||
convert it into a relocation against a section. This
|
convert it into a relocation against a section. This
|
||||||
is what the native linker does. */
|
is what the native linker does. */
|
||||||
@ -4539,26 +4553,15 @@ aout_link_input_section_std (finfo, input_bfd, input_section, relocs,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
boolean hundef;
|
||||||
|
|
||||||
/* We are generating an executable, and must do a full
|
/* We are generating an executable, and must do a full
|
||||||
relocation. */
|
relocation. */
|
||||||
|
hundef = false;
|
||||||
if (r_extern)
|
if (r_extern)
|
||||||
{
|
{
|
||||||
struct aout_link_hash_entry *h;
|
|
||||||
|
|
||||||
h = sym_hashes[r_index];
|
h = sym_hashes[r_index];
|
||||||
|
|
||||||
if (check_dynamic_reloc != NULL)
|
|
||||||
{
|
|
||||||
boolean skip;
|
|
||||||
|
|
||||||
if (! ((*check_dynamic_reloc)
|
|
||||||
(finfo->info, input_bfd, input_section, h,
|
|
||||||
(PTR) rel, &skip)))
|
|
||||||
return false;
|
|
||||||
if (skip)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h != (struct aout_link_hash_entry *) NULL
|
if (h != (struct aout_link_hash_entry *) NULL
|
||||||
&& (h->root.type == bfd_link_hash_defined
|
&& (h->root.type == bfd_link_hash_defined
|
||||||
|| h->root.type == bfd_link_hash_defweak))
|
|| h->root.type == bfd_link_hash_defweak))
|
||||||
@ -4572,13 +4575,7 @@ aout_link_input_section_std (finfo, input_bfd, input_section, relocs,
|
|||||||
relocation = 0;
|
relocation = 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const char *name;
|
hundef = true;
|
||||||
|
|
||||||
name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
|
|
||||||
if (! ((*finfo->info->callbacks->undefined_symbol)
|
|
||||||
(finfo->info, name, input_bfd, input_section,
|
|
||||||
r_addr)))
|
|
||||||
return false;
|
|
||||||
relocation = 0;
|
relocation = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4594,6 +4591,31 @@ aout_link_input_section_std (finfo, input_bfd, input_section, relocs,
|
|||||||
relocation += input_section->vma;
|
relocation += input_section->vma;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (check_dynamic_reloc != NULL)
|
||||||
|
{
|
||||||
|
boolean skip;
|
||||||
|
|
||||||
|
if (! ((*check_dynamic_reloc)
|
||||||
|
(finfo->info, input_bfd, input_section, h,
|
||||||
|
(PTR) rel, contents, &skip, &relocation)))
|
||||||
|
return false;
|
||||||
|
if (skip)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now warn if a global symbol is undefined. We could not
|
||||||
|
do this earlier, because check_dynamic_reloc might want
|
||||||
|
to skip this reloc. */
|
||||||
|
if (hundef && ! finfo->info->shared && ! r_baserel)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
|
||||||
|
if (! ((*finfo->info->callbacks->undefined_symbol)
|
||||||
|
(finfo->info, name, input_bfd, input_section, r_addr)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
r = _bfd_final_link_relocate (howto,
|
r = _bfd_final_link_relocate (howto,
|
||||||
input_bfd, input_section,
|
input_bfd, input_section,
|
||||||
contents, r_addr, relocation,
|
contents, r_addr, relocation,
|
||||||
@ -4649,7 +4671,8 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
|
|||||||
boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *,
|
boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *,
|
||||||
bfd *, asection *,
|
bfd *, asection *,
|
||||||
struct aout_link_hash_entry *,
|
struct aout_link_hash_entry *,
|
||||||
PTR, boolean *));
|
PTR, bfd_byte *, boolean *,
|
||||||
|
bfd_vma *));
|
||||||
bfd *output_bfd;
|
bfd *output_bfd;
|
||||||
boolean relocateable;
|
boolean relocateable;
|
||||||
struct external_nlist *syms;
|
struct external_nlist *syms;
|
||||||
@ -4681,8 +4704,10 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
|
|||||||
bfd_vma r_addr;
|
bfd_vma r_addr;
|
||||||
int r_index;
|
int r_index;
|
||||||
int r_extern;
|
int r_extern;
|
||||||
int r_type;
|
unsigned int r_type;
|
||||||
bfd_vma r_addend;
|
bfd_vma r_addend;
|
||||||
|
struct aout_link_hash_entry *h = NULL;
|
||||||
|
asection *r_section = NULL;
|
||||||
bfd_vma relocation;
|
bfd_vma relocation;
|
||||||
|
|
||||||
r_addr = GET_SWORD (input_bfd, rel->r_address);
|
r_addr = GET_SWORD (input_bfd, rel->r_address);
|
||||||
@ -4708,8 +4733,7 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
|
|||||||
|
|
||||||
r_addend = GET_SWORD (input_bfd, rel->r_addend);
|
r_addend = GET_SWORD (input_bfd, rel->r_addend);
|
||||||
|
|
||||||
BFD_ASSERT (r_type >= 0
|
BFD_ASSERT (r_type < TABLE_SIZE (howto_table_ext));
|
||||||
&& r_type < TABLE_SIZE (howto_table_ext));
|
|
||||||
|
|
||||||
if (relocateable)
|
if (relocateable)
|
||||||
{
|
{
|
||||||
@ -4717,8 +4741,6 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
|
|||||||
modify the reloc accordingly. */
|
modify the reloc accordingly. */
|
||||||
if (r_extern)
|
if (r_extern)
|
||||||
{
|
{
|
||||||
struct aout_link_hash_entry *h;
|
|
||||||
|
|
||||||
/* If we know the symbol this relocation is against,
|
/* If we know the symbol this relocation is against,
|
||||||
convert it into a relocation against a section. This
|
convert it into a relocation against a section. This
|
||||||
is what the native linker does. */
|
is what the native linker does. */
|
||||||
@ -4823,14 +4845,12 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
asection *section;
|
|
||||||
|
|
||||||
/* This is a relocation against a section. We must
|
/* This is a relocation against a section. We must
|
||||||
adjust by the amount that the section moved. */
|
adjust by the amount that the section moved. */
|
||||||
section = aout_reloc_index_to_section (input_bfd, r_index);
|
r_section = aout_reloc_index_to_section (input_bfd, r_index);
|
||||||
relocation = (section->output_section->vma
|
relocation = (r_section->output_section->vma
|
||||||
+ section->output_offset
|
+ r_section->output_offset
|
||||||
- section->vma);
|
- r_section->vma);
|
||||||
|
|
||||||
/* If this is a PC relative reloc, then the addend is
|
/* If this is a PC relative reloc, then the addend is
|
||||||
the difference in VMA between the destination and the
|
the difference in VMA between the destination and the
|
||||||
@ -4857,28 +4877,16 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
boolean hundef;
|
||||||
bfd_reloc_status_type r;
|
bfd_reloc_status_type r;
|
||||||
|
|
||||||
/* We are generating an executable, and must do a full
|
/* We are generating an executable, and must do a full
|
||||||
relocation. */
|
relocation. */
|
||||||
|
hundef = false;
|
||||||
if (r_extern)
|
if (r_extern)
|
||||||
{
|
{
|
||||||
struct aout_link_hash_entry *h;
|
|
||||||
|
|
||||||
h = sym_hashes[r_index];
|
h = sym_hashes[r_index];
|
||||||
|
|
||||||
if (check_dynamic_reloc != NULL)
|
|
||||||
{
|
|
||||||
boolean skip;
|
|
||||||
|
|
||||||
if (! ((*check_dynamic_reloc)
|
|
||||||
(finfo->info, input_bfd, input_section, h,
|
|
||||||
(PTR) rel, &skip)))
|
|
||||||
return false;
|
|
||||||
if (skip)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h != (struct aout_link_hash_entry *) NULL
|
if (h != (struct aout_link_hash_entry *) NULL
|
||||||
&& (h->root.type == bfd_link_hash_defined
|
&& (h->root.type == bfd_link_hash_defined
|
||||||
|| h->root.type == bfd_link_hash_defweak))
|
|| h->root.type == bfd_link_hash_defweak))
|
||||||
@ -4892,21 +4900,43 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
|
|||||||
relocation = 0;
|
relocation = 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const char *name;
|
hundef = true;
|
||||||
|
|
||||||
name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
|
|
||||||
if (! ((*finfo->info->callbacks->undefined_symbol)
|
|
||||||
(finfo->info, name, input_bfd, input_section,
|
|
||||||
r_addr)))
|
|
||||||
return false;
|
|
||||||
relocation = 0;
|
relocation = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (r_type == RELOC_BASE10
|
||||||
|
|| r_type == RELOC_BASE13
|
||||||
|
|| r_type == RELOC_BASE22)
|
||||||
|
{
|
||||||
|
struct external_nlist *sym;
|
||||||
|
int type;
|
||||||
|
|
||||||
|
/* For base relative relocs, r_index is always an index
|
||||||
|
into the symbol table, even if r_extern is 0. */
|
||||||
|
sym = syms + r_index;
|
||||||
|
type = bfd_h_get_8 (input_bfd, sym->e_type);
|
||||||
|
if ((type & N_TYPE) == N_TEXT
|
||||||
|
|| type == N_WEAKT)
|
||||||
|
r_section = obj_textsec (input_bfd);
|
||||||
|
else if ((type & N_TYPE) == N_DATA
|
||||||
|
|| type == N_WEAKD)
|
||||||
|
r_section = obj_datasec (input_bfd);
|
||||||
|
else if ((type & N_TYPE) == N_BSS
|
||||||
|
|| type == N_WEAKB)
|
||||||
|
r_section = obj_bsssec (input_bfd);
|
||||||
|
else if ((type & N_TYPE) == N_ABS
|
||||||
|
|| type == N_WEAKA)
|
||||||
|
r_section = bfd_abs_section_ptr;
|
||||||
|
else
|
||||||
|
abort ();
|
||||||
|
relocation = (r_section->output_section->vma
|
||||||
|
+ r_section->output_offset
|
||||||
|
+ (GET_WORD (input_bfd, sym->e_value)
|
||||||
|
- r_section->vma));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
asection *section;
|
r_section = aout_reloc_index_to_section (input_bfd, r_index);
|
||||||
|
|
||||||
section = aout_reloc_index_to_section (input_bfd, r_index);
|
|
||||||
|
|
||||||
/* If this is a PC relative reloc, then R_ADDEND is the
|
/* If this is a PC relative reloc, then R_ADDEND is the
|
||||||
difference between the two vmas, or
|
difference between the two vmas, or
|
||||||
@ -4934,13 +4964,42 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
|
|||||||
RELOCATION to the change in the destination VMA, or
|
RELOCATION to the change in the destination VMA, or
|
||||||
new_dest_sec - old_dest_sec
|
new_dest_sec - old_dest_sec
|
||||||
*/
|
*/
|
||||||
relocation = (section->output_section->vma
|
relocation = (r_section->output_section->vma
|
||||||
+ section->output_offset
|
+ r_section->output_offset
|
||||||
- section->vma);
|
- r_section->vma);
|
||||||
if (howto_table_ext[r_type].pc_relative)
|
if (howto_table_ext[r_type].pc_relative)
|
||||||
relocation += input_section->vma;
|
relocation += input_section->vma;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (check_dynamic_reloc != NULL)
|
||||||
|
{
|
||||||
|
boolean skip;
|
||||||
|
|
||||||
|
if (! ((*check_dynamic_reloc)
|
||||||
|
(finfo->info, input_bfd, input_section, h,
|
||||||
|
(PTR) rel, contents, &skip, &relocation)))
|
||||||
|
return false;
|
||||||
|
if (skip)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now warn if a global symbol is undefined. We could not
|
||||||
|
do this earlier, because check_dynamic_reloc might want
|
||||||
|
to skip this reloc. */
|
||||||
|
if (hundef
|
||||||
|
&& ! finfo->info->shared
|
||||||
|
&& r_type != RELOC_BASE10
|
||||||
|
&& r_type != RELOC_BASE13
|
||||||
|
&& r_type != RELOC_BASE22)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
|
||||||
|
if (! ((*finfo->info->callbacks->undefined_symbol)
|
||||||
|
(finfo->info, name, input_bfd, input_section, r_addr)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
r = _bfd_final_link_relocate (howto_table_ext + r_type,
|
r = _bfd_final_link_relocate (howto_table_ext + r_type,
|
||||||
input_bfd, input_section,
|
input_bfd, input_section,
|
||||||
contents, r_addr, relocation,
|
contents, r_addr, relocation,
|
||||||
@ -4956,7 +5015,10 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
|
|||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
if (r_extern)
|
if (r_extern
|
||||||
|
|| r_type == RELOC_BASE10
|
||||||
|
|| r_type == RELOC_BASE13
|
||||||
|
|| r_type == RELOC_BASE22)
|
||||||
name = strings + GET_WORD (input_bfd,
|
name = strings + GET_WORD (input_bfd,
|
||||||
syms[r_index].e_strx);
|
syms[r_index].e_strx);
|
||||||
else
|
else
|
||||||
@ -5059,48 +5121,51 @@ aout_link_reloc_link_order (finfo, o, p)
|
|||||||
|
|
||||||
if (obj_reloc_entry_size (finfo->output_bfd) == RELOC_STD_SIZE)
|
if (obj_reloc_entry_size (finfo->output_bfd) == RELOC_STD_SIZE)
|
||||||
{
|
{
|
||||||
int r_pcrel;
|
|
||||||
int r_baserel;
|
|
||||||
int r_jmptable;
|
|
||||||
int r_relative;
|
|
||||||
int r_length;
|
|
||||||
|
|
||||||
#ifdef MY_put_reloc
|
#ifdef MY_put_reloc
|
||||||
MY_put_reloc(finfo->output_bfd, r_extern, r_index, p->offset, howto, &srel);
|
MY_put_reloc(finfo->output_bfd, r_extern, r_index, p->offset, howto,
|
||||||
|
&srel);
|
||||||
#else
|
#else
|
||||||
r_pcrel = howto->pc_relative;
|
{
|
||||||
r_baserel = (howto->type & 8) != 0;
|
int r_pcrel;
|
||||||
r_jmptable = (howto->type & 16) != 0;
|
int r_baserel;
|
||||||
r_relative = (howto->type & 32) != 0;
|
int r_jmptable;
|
||||||
r_length = howto->size;
|
int r_relative;
|
||||||
|
int r_length;
|
||||||
|
|
||||||
PUT_WORD (finfo->output_bfd, p->offset, srel.r_address);
|
r_pcrel = howto->pc_relative;
|
||||||
if (finfo->output_bfd->xvec->header_byteorder_big_p)
|
r_baserel = (howto->type & 8) != 0;
|
||||||
{
|
r_jmptable = (howto->type & 16) != 0;
|
||||||
srel.r_index[0] = r_index >> 16;
|
r_relative = (howto->type & 32) != 0;
|
||||||
srel.r_index[1] = r_index >> 8;
|
r_length = howto->size;
|
||||||
srel.r_index[2] = r_index;
|
|
||||||
srel.r_type[0] =
|
PUT_WORD (finfo->output_bfd, p->offset, srel.r_address);
|
||||||
((r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0)
|
if (finfo->output_bfd->xvec->header_byteorder_big_p)
|
||||||
| (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0)
|
{
|
||||||
| (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0)
|
srel.r_index[0] = r_index >> 16;
|
||||||
| (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
|
srel.r_index[1] = r_index >> 8;
|
||||||
| (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
|
srel.r_index[2] = r_index;
|
||||||
| (r_length << RELOC_STD_BITS_LENGTH_SH_BIG));
|
srel.r_type[0] =
|
||||||
}
|
((r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0)
|
||||||
else
|
| (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0)
|
||||||
{
|
| (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0)
|
||||||
srel.r_index[2] = r_index >> 16;
|
| (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
|
||||||
srel.r_index[1] = r_index >> 8;
|
| (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
|
||||||
srel.r_index[0] = r_index;
|
| (r_length << RELOC_STD_BITS_LENGTH_SH_BIG));
|
||||||
srel.r_type[0] =
|
}
|
||||||
((r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0)
|
else
|
||||||
| (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0)
|
{
|
||||||
| (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0)
|
srel.r_index[2] = r_index >> 16;
|
||||||
| (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
|
srel.r_index[1] = r_index >> 8;
|
||||||
| (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
|
srel.r_index[0] = r_index;
|
||||||
| (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE));
|
srel.r_type[0] =
|
||||||
}
|
((r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0)
|
||||||
|
| (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0)
|
||||||
|
| (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0)
|
||||||
|
| (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
|
||||||
|
| (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
|
||||||
|
| (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE));
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
rel_ptr = (PTR) &srel;
|
rel_ptr = (PTR) &srel;
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
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. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@setfilename archive-info
|
@setfilename archive-info
|
||||||
@ -677,6 +677,40 @@ bfd_generic_archive_p (abfd)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bfd_has_map (abfd) && abfd->target_defaulted)
|
||||||
|
{
|
||||||
|
bfd *first;
|
||||||
|
|
||||||
|
/* This archive has a map, so we may presume that the contents
|
||||||
|
are object files. Make sure that the first file in the
|
||||||
|
archive can be recognized as an object file for this target.
|
||||||
|
If not, assume that this is the wrong format.
|
||||||
|
|
||||||
|
This is done because any normal format will recognize any
|
||||||
|
normal archive, regardless of the format of the object files.
|
||||||
|
We do accept an empty archive. */
|
||||||
|
|
||||||
|
first = bfd_openr_next_archived_file (abfd, (bfd *) NULL);
|
||||||
|
if (first != NULL)
|
||||||
|
{
|
||||||
|
first->target_defaulted = false;
|
||||||
|
if (! bfd_check_format (first, bfd_object))
|
||||||
|
{
|
||||||
|
bfd_error_type err;
|
||||||
|
|
||||||
|
err = bfd_get_error ();
|
||||||
|
(void) bfd_close (first);
|
||||||
|
bfd_release (abfd, bfd_ardata (abfd));
|
||||||
|
abfd->tdata.aout_ar_data = NULL;
|
||||||
|
bfd_set_error (err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We ought to close first here, but we can't, because we
|
||||||
|
have no way to remove it from the archive cache. FIXME. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return abfd->xvec;
|
return abfd->xvec;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1450,9 +1484,9 @@ bfd_dont_truncate_arname (abfd, pathname, arhdr)
|
|||||||
intel's release is out the door. */
|
intel's release is out the door. */
|
||||||
|
|
||||||
struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
|
struct ar_hdr *hdr = (struct ar_hdr *) arhdr;
|
||||||
int length;
|
size_t length;
|
||||||
const char *filename;
|
const char *filename;
|
||||||
int maxlen = ar_maxnamelen (abfd);
|
size_t maxlen = ar_maxnamelen (abfd);
|
||||||
|
|
||||||
if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
|
if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0)
|
||||||
{
|
{
|
||||||
@ -1871,7 +1905,7 @@ bsd_write_armap (arch, elength, map, orl_count, stridx)
|
|||||||
bfd *current = arch->archive_head;
|
bfd *current = arch->archive_head;
|
||||||
bfd *last_elt = current; /* last element arch seen */
|
bfd *last_elt = current; /* last element arch seen */
|
||||||
bfd_byte temp[4];
|
bfd_byte temp[4];
|
||||||
int count;
|
unsigned int count;
|
||||||
struct ar_hdr hdr;
|
struct ar_hdr hdr;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@ -1957,7 +1991,7 @@ _bfd_archive_bsd_update_armap_timestamp (arch)
|
|||||||
{
|
{
|
||||||
struct stat archstat;
|
struct stat archstat;
|
||||||
struct ar_hdr hdr;
|
struct ar_hdr hdr;
|
||||||
int i;
|
unsigned int i;
|
||||||
|
|
||||||
/* Flush writes, get last-write timestamp from file, and compare it
|
/* Flush writes, get last-write timestamp from file, and compare it
|
||||||
to the timestamp IN the file. */
|
to the timestamp IN the file. */
|
||||||
@ -2024,7 +2058,7 @@ coff_write_armap (arch, elength, map, symbol_count, stridx)
|
|||||||
unsigned int mapsize = stringsize + ranlibsize;
|
unsigned int mapsize = stringsize + ranlibsize;
|
||||||
file_ptr archive_member_file_ptr;
|
file_ptr archive_member_file_ptr;
|
||||||
bfd *current = arch->archive_head;
|
bfd *current = arch->archive_head;
|
||||||
int count;
|
unsigned int count;
|
||||||
struct ar_hdr hdr;
|
struct ar_hdr hdr;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int padit = mapsize & 1;
|
int padit = mapsize & 1;
|
||||||
|
@ -151,7 +151,7 @@ DESCRIPTION
|
|||||||
. int bits_per_address;
|
. int bits_per_address;
|
||||||
. int bits_per_byte;
|
. int bits_per_byte;
|
||||||
. enum bfd_architecture arch;
|
. enum bfd_architecture arch;
|
||||||
. long mach;
|
. unsigned long mach;
|
||||||
. char *arch_name;
|
. char *arch_name;
|
||||||
. CONST char *printable_name;
|
. CONST char *printable_name;
|
||||||
. unsigned int section_align_power;
|
. unsigned int section_align_power;
|
||||||
@ -732,7 +732,7 @@ SYNOPSIS
|
|||||||
bfd_arch_info_type *bfd_lookup_arch
|
bfd_arch_info_type *bfd_lookup_arch
|
||||||
(enum bfd_architecture
|
(enum bfd_architecture
|
||||||
arch,
|
arch,
|
||||||
long machine);
|
unsigned long machine);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Look for the architecure info structure which matches the
|
Look for the architecure info structure which matches the
|
||||||
@ -744,7 +744,7 @@ DESCRIPTION
|
|||||||
bfd_arch_info_type *
|
bfd_arch_info_type *
|
||||||
bfd_lookup_arch (arch, machine)
|
bfd_lookup_arch (arch, machine)
|
||||||
enum bfd_architecture arch;
|
enum bfd_architecture arch;
|
||||||
long machine;
|
unsigned long machine;
|
||||||
{
|
{
|
||||||
bfd_arch_info_type *ap;
|
bfd_arch_info_type *ap;
|
||||||
bfd_check_init();
|
bfd_check_init();
|
||||||
|
@ -1078,7 +1078,7 @@ typedef struct bfd_arch_info
|
|||||||
int bits_per_address;
|
int bits_per_address;
|
||||||
int bits_per_byte;
|
int bits_per_byte;
|
||||||
enum bfd_architecture arch;
|
enum bfd_architecture arch;
|
||||||
long mach;
|
unsigned long mach;
|
||||||
char *arch_name;
|
char *arch_name;
|
||||||
CONST char *printable_name;
|
CONST char *printable_name;
|
||||||
unsigned int section_align_power;
|
unsigned int section_align_power;
|
||||||
@ -1132,7 +1132,7 @@ bfd_arch_info_type *
|
|||||||
bfd_lookup_arch
|
bfd_lookup_arch
|
||||||
PARAMS ((enum bfd_architecture
|
PARAMS ((enum bfd_architecture
|
||||||
arch,
|
arch,
|
||||||
long machine));
|
unsigned long machine));
|
||||||
|
|
||||||
CONST char *
|
CONST char *
|
||||||
bfd_printable_arch_mach
|
bfd_printable_arch_mach
|
||||||
|
98
bfd/bout.c
98
bfd/bout.c
@ -1,5 +1,5 @@
|
|||||||
/* BFD back-end for Intel 960 b.out binaries.
|
/* BFD back-end for Intel 960 b.out binaries.
|
||||||
Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||||
Written by Cygnus Support.
|
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.
|
||||||
@ -16,7 +16,7 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
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 "bfd.h"
|
#include "bfd.h"
|
||||||
@ -41,7 +41,7 @@ static bfd_reloc_status_type calljx_callback
|
|||||||
asection *));
|
asection *));
|
||||||
static bfd_reloc_status_type callj_callback
|
static bfd_reloc_status_type callj_callback
|
||||||
PARAMS ((bfd *, struct bfd_link_info *, arelent *, PTR data,
|
PARAMS ((bfd *, struct bfd_link_info *, arelent *, PTR data,
|
||||||
unsigned int srcidx, unsigned int dstidx, asection *));
|
unsigned int srcidx, unsigned int dstidx, asection *, boolean));
|
||||||
static bfd_vma get_value PARAMS ((arelent *, struct bfd_link_info *,
|
static bfd_vma get_value PARAMS ((arelent *, struct bfd_link_info *,
|
||||||
asection *));
|
asection *));
|
||||||
static int abs32code PARAMS ((bfd *, asection *, arelent *,
|
static int abs32code PARAMS ((bfd *, asection *, arelent *,
|
||||||
@ -330,7 +330,7 @@ calljx_callback (abfd, link_info, reloc_entry, src, dst, input_section)
|
|||||||
/* Magic to turn call into callj */
|
/* Magic to turn call into callj */
|
||||||
static bfd_reloc_status_type
|
static bfd_reloc_status_type
|
||||||
callj_callback (abfd, link_info, reloc_entry, data, srcidx, dstidx,
|
callj_callback (abfd, link_info, reloc_entry, data, srcidx, dstidx,
|
||||||
input_section)
|
input_section, shrinking)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
struct bfd_link_info *link_info;
|
struct bfd_link_info *link_info;
|
||||||
arelent *reloc_entry;
|
arelent *reloc_entry;
|
||||||
@ -338,6 +338,7 @@ callj_callback (abfd, link_info, reloc_entry, data, srcidx, dstidx,
|
|||||||
unsigned int srcidx;
|
unsigned int srcidx;
|
||||||
unsigned int dstidx;
|
unsigned int dstidx;
|
||||||
asection *input_section;
|
asection *input_section;
|
||||||
|
boolean shrinking;
|
||||||
{
|
{
|
||||||
int word = bfd_get_32 (abfd, (bfd_byte *) data + srcidx);
|
int word = bfd_get_32 (abfd, (bfd_byte *) data + srcidx);
|
||||||
asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr);
|
asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr);
|
||||||
@ -368,12 +369,21 @@ callj_callback (abfd, link_info, reloc_entry, data, srcidx, dstidx,
|
|||||||
- output_addr (input_section))
|
- output_addr (input_section))
|
||||||
& BAL_MASK);
|
& BAL_MASK);
|
||||||
}
|
}
|
||||||
|
else if ((symbol->symbol.flags & BSF_SECTION_SYM) != 0)
|
||||||
|
{
|
||||||
|
/* A callj against a symbol in the same section is a fully
|
||||||
|
resolved relative call. We don't need to do anything here.
|
||||||
|
If the symbol is not in the same section, I'm not sure what
|
||||||
|
to do; fortunately, this case will probably never arise. */
|
||||||
|
BFD_ASSERT (! shrinking);
|
||||||
|
BFD_ASSERT (symbol->symbol.section == input_section);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
word = CALL | (((word & BAL_MASK)
|
word = CALL | (((word & BAL_MASK)
|
||||||
+ value
|
+ value
|
||||||
+ reloc_entry->addend
|
+ reloc_entry->addend
|
||||||
- dstidx
|
- (shrinking ? dstidx : 0)
|
||||||
- output_addr (input_section))
|
- output_addr (input_section))
|
||||||
& BAL_MASK);
|
& BAL_MASK);
|
||||||
}
|
}
|
||||||
@ -425,7 +435,7 @@ static reloc_howto_type howto_done_align_table[] = {
|
|||||||
HOWTO (ALIGNDONE, 0xf, 0xf, 0, false, 0, complain_overflow_dont, 0, "donealign128", false, 0, 0, false),
|
HOWTO (ALIGNDONE, 0xf, 0xf, 0, false, 0, complain_overflow_dont, 0, "donealign128", false, 0, 0, false),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const reloc_howto_type *
|
static reloc_howto_type *
|
||||||
b_out_bfd_reloc_type_lookup (abfd, code)
|
b_out_bfd_reloc_type_lookup (abfd, code)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
bfd_reloc_code_real_type code;
|
bfd_reloc_code_real_type code;
|
||||||
@ -479,6 +489,11 @@ b_out_slurp_reloc_table (abfd, asect, symbols)
|
|||||||
goto doit;
|
goto doit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (asect == obj_bsssec (abfd)) {
|
||||||
|
reloc_size = 0;
|
||||||
|
goto doit;
|
||||||
|
}
|
||||||
|
|
||||||
bfd_set_error (bfd_error_invalid_operation);
|
bfd_set_error (bfd_error_invalid_operation);
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -494,14 +509,16 @@ b_out_slurp_reloc_table (abfd, asect, symbols)
|
|||||||
}
|
}
|
||||||
reloc_cache = (arelent *) malloc ((count+1) * sizeof (arelent));
|
reloc_cache = (arelent *) malloc ((count+1) * sizeof (arelent));
|
||||||
if (!reloc_cache) {
|
if (!reloc_cache) {
|
||||||
free ((char*)relocs);
|
if (relocs != NULL)
|
||||||
|
free ((char*)relocs);
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bfd_read ((PTR) relocs, 1, reloc_size, abfd) != reloc_size) {
|
if (bfd_read ((PTR) relocs, 1, reloc_size, abfd) != reloc_size) {
|
||||||
free (reloc_cache);
|
free (reloc_cache);
|
||||||
free (relocs);
|
if (relocs != NULL)
|
||||||
|
free (relocs);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -593,7 +610,7 @@ b_out_slurp_reloc_table (abfd, asect, symbols)
|
|||||||
if (raw[7] & pcrel_mask)
|
if (raw[7] & pcrel_mask)
|
||||||
{
|
{
|
||||||
cache_ptr->howto = &howto_align_table[(raw[7] >> length_shift) & 3];
|
cache_ptr->howto = &howto_align_table[(raw[7] >> length_shift) & 3];
|
||||||
cache_ptr->sym_ptr_ptr = &bfd_abs_symbol;
|
cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -657,7 +674,8 @@ b_out_slurp_reloc_table (abfd, asect, symbols)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
free (relocs);
|
if (relocs != NULL)
|
||||||
|
free (relocs);
|
||||||
asect->relocation = reloc_cache;
|
asect->relocation = reloc_cache;
|
||||||
asect->reloc_count = count;
|
asect->reloc_count = count;
|
||||||
|
|
||||||
@ -758,11 +776,11 @@ b_out_squirt_out_relocs (abfd, section)
|
|||||||
if (r_idx != 0)
|
if (r_idx != 0)
|
||||||
/* already mucked with r_extern, r_idx */;
|
/* already mucked with r_extern, r_idx */;
|
||||||
else if (bfd_is_com_section (output_section)
|
else if (bfd_is_com_section (output_section)
|
||||||
|| output_section == &bfd_abs_section
|
|| bfd_is_abs_section (output_section)
|
||||||
|| output_section == &bfd_und_section)
|
|| bfd_is_und_section (output_section))
|
||||||
{
|
{
|
||||||
|
|
||||||
if (bfd_abs_section.symbol == sym)
|
if (bfd_abs_section_ptr->symbol == sym)
|
||||||
{
|
{
|
||||||
/* Whoops, looked like an abs symbol, but is really an offset
|
/* Whoops, looked like an abs symbol, but is really an offset
|
||||||
from the abs section */
|
from the abs section */
|
||||||
@ -814,17 +832,30 @@ b_out_canonicalize_reloc (abfd, section, relptr, symbols)
|
|||||||
arelent **relptr;
|
arelent **relptr;
|
||||||
asymbol **symbols;
|
asymbol **symbols;
|
||||||
{
|
{
|
||||||
arelent *tblptr = section->relocation;
|
arelent *tblptr;
|
||||||
unsigned int count = 0;
|
unsigned int count;
|
||||||
|
|
||||||
if (!(tblptr || b_out_slurp_reloc_table (abfd, section, symbols)))
|
if ((section->flags & SEC_CONSTRUCTOR) != 0)
|
||||||
return -1;
|
{
|
||||||
tblptr = section->relocation;
|
arelent_chain *chain = section->constructor_chain;
|
||||||
|
for (count = 0; count < section->reloc_count; count++)
|
||||||
|
{
|
||||||
|
*relptr++ = &chain->relent;
|
||||||
|
chain = chain->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (section->relocation == NULL
|
||||||
|
&& ! b_out_slurp_reloc_table (abfd, section, symbols))
|
||||||
|
return -1;
|
||||||
|
|
||||||
for (; count++ < section->reloc_count;)
|
tblptr = section->relocation;
|
||||||
*relptr++ = tblptr++;
|
for (count = 0; count++ < section->reloc_count;)
|
||||||
|
*relptr++ = tblptr++;
|
||||||
|
}
|
||||||
|
|
||||||
*relptr = 0;
|
*relptr = NULL;
|
||||||
|
|
||||||
return section->reloc_count;
|
return section->reloc_count;
|
||||||
}
|
}
|
||||||
@ -839,6 +870,9 @@ b_out_get_reloc_upper_bound (abfd, asect)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (asect->flags & SEC_CONSTRUCTOR)
|
||||||
|
return sizeof (arelent *) * (asect->reloc_count + 1);
|
||||||
|
|
||||||
if (asect == obj_datasec (abfd))
|
if (asect == obj_datasec (abfd))
|
||||||
return (sizeof (arelent *) *
|
return (sizeof (arelent *) *
|
||||||
((exec_hdr(abfd)->a_drsize / sizeof (struct relocation_info))
|
((exec_hdr(abfd)->a_drsize / sizeof (struct relocation_info))
|
||||||
@ -859,10 +893,10 @@ b_out_get_reloc_upper_bound (abfd, asect)
|
|||||||
static boolean
|
static boolean
|
||||||
b_out_set_section_contents (abfd, section, location, offset, count)
|
b_out_set_section_contents (abfd, section, location, offset, count)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
sec_ptr section;
|
asection *section;
|
||||||
unsigned char *location;
|
PTR location;
|
||||||
file_ptr offset;
|
file_ptr offset;
|
||||||
int count;
|
bfd_size_type count;
|
||||||
{
|
{
|
||||||
|
|
||||||
if (abfd->output_has_begun == false) { /* set by bfd.c handler */
|
if (abfd->output_has_begun == false) { /* set by bfd.c handler */
|
||||||
@ -935,7 +969,7 @@ get_value (reloc, link_info, input_section)
|
|||||||
base of the section. To relocate, we find where the section will
|
base of the section. To relocate, we find where the section will
|
||||||
live in the output and add that in */
|
live in the output and add that in */
|
||||||
|
|
||||||
if (symbol->section == &bfd_und_section)
|
if (bfd_is_und_section (symbol->section))
|
||||||
{
|
{
|
||||||
struct bfd_link_hash_entry *h;
|
struct bfd_link_hash_entry *h;
|
||||||
|
|
||||||
@ -947,7 +981,8 @@ get_value (reloc, link_info, input_section)
|
|||||||
h = bfd_link_hash_lookup (link_info->hash, bfd_asymbol_name (symbol),
|
h = bfd_link_hash_lookup (link_info->hash, bfd_asymbol_name (symbol),
|
||||||
false, false, true);
|
false, false, true);
|
||||||
if (h != (struct bfd_link_hash_entry *) NULL
|
if (h != (struct bfd_link_hash_entry *) NULL
|
||||||
&& h->type == bfd_link_hash_defined)
|
&& (h->type == bfd_link_hash_defined
|
||||||
|
|| h->type == bfd_link_hash_defweak))
|
||||||
value = h->u.def.value + output_addr (h->u.def.section);
|
value = h->u.def.value + output_addr (h->u.def.section);
|
||||||
else if (h != (struct bfd_link_hash_entry *) NULL
|
else if (h != (struct bfd_link_hash_entry *) NULL
|
||||||
&& h->type == bfd_link_hash_common)
|
&& h->type == bfd_link_hash_common)
|
||||||
@ -995,11 +1030,11 @@ perform_slip (abfd, slip, input_section, value)
|
|||||||
if (p->value > value)
|
if (p->value > value)
|
||||||
{
|
{
|
||||||
p->value -=slip;
|
p->value -=slip;
|
||||||
if (p->udata != NULL)
|
if (p->udata.p != NULL)
|
||||||
{
|
{
|
||||||
struct generic_link_hash_entry *h;
|
struct generic_link_hash_entry *h;
|
||||||
|
|
||||||
h = (struct generic_link_hash_entry *) p->udata;
|
h = (struct generic_link_hash_entry *) p->udata.p;
|
||||||
BFD_ASSERT (h->root.type == bfd_link_hash_defined);
|
BFD_ASSERT (h->root.type == bfd_link_hash_defined);
|
||||||
h->root.u.def.value -= slip;
|
h->root.u.def.value -= slip;
|
||||||
BFD_ASSERT (h->root.u.def.value == p->value);
|
BFD_ASSERT (h->root.u.def.value == p->value);
|
||||||
@ -1275,7 +1310,7 @@ b_out_bfd_get_relocated_section_contents (in_abfd, link_info, link_order,
|
|||||||
break;
|
break;
|
||||||
case CALLJ:
|
case CALLJ:
|
||||||
callj_callback (in_abfd, link_info, reloc, data, src_address,
|
callj_callback (in_abfd, link_info, reloc, data, src_address,
|
||||||
dst_address, input_section);
|
dst_address, input_section, false);
|
||||||
src_address+=4;
|
src_address+=4;
|
||||||
dst_address+=4;
|
dst_address+=4;
|
||||||
break;
|
break;
|
||||||
@ -1290,7 +1325,8 @@ b_out_bfd_get_relocated_section_contents (in_abfd, link_info, link_order,
|
|||||||
/* This used to be a callx, but we've found out that a
|
/* This used to be a callx, but we've found out that a
|
||||||
callj will reach, so do the right thing. */
|
callj will reach, so do the right thing. */
|
||||||
callj_callback (in_abfd, link_info, reloc, data,
|
callj_callback (in_abfd, link_info, reloc, data,
|
||||||
src_address + 4, dst_address, input_section);
|
src_address + 4, dst_address, input_section,
|
||||||
|
true);
|
||||||
dst_address+=4;
|
dst_address+=4;
|
||||||
src_address+=8;
|
src_address+=8;
|
||||||
break;
|
break;
|
||||||
@ -1358,6 +1394,8 @@ b_out_bfd_get_relocated_section_contents (in_abfd, link_info, link_order,
|
|||||||
#define b_out_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
|
#define b_out_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
|
||||||
#define b_out_bfd_link_add_symbols _bfd_generic_link_add_symbols
|
#define b_out_bfd_link_add_symbols _bfd_generic_link_add_symbols
|
||||||
#define b_out_bfd_final_link _bfd_generic_final_link
|
#define b_out_bfd_final_link _bfd_generic_final_link
|
||||||
|
#define b_out_bfd_link_split_section _bfd_generic_link_split_section
|
||||||
|
|
||||||
|
|
||||||
const bfd_target b_out_vec_big_host =
|
const bfd_target b_out_vec_big_host =
|
||||||
{
|
{
|
||||||
|
@ -23,7 +23,7 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
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. */
|
||||||
|
|
||||||
/* This port currently only handles reading object files, except when
|
/* This port currently only handles reading object files, except when
|
||||||
compiled on an RS/6000 host. -- no archive support, no core files.
|
compiled on an RS/6000 host. -- no archive support, no core files.
|
||||||
@ -44,6 +44,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
/* The main body of code is in coffcode.h. */
|
/* The main body of code is in coffcode.h. */
|
||||||
|
|
||||||
|
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
|
||||||
|
|
||||||
/* The XCOFF reloc table. Actually, XCOFF relocations specify the
|
/* The XCOFF reloc table. Actually, XCOFF relocations specify the
|
||||||
bitsize and whether they are signed or not, along with a
|
bitsize and whether they are signed or not, along with a
|
||||||
conventional type. This table is for the types, which are used for
|
conventional type. This table is for the types, which are used for
|
||||||
@ -410,7 +412,7 @@ rs6000coff_rtype2howto (relent, internal)
|
|||||||
relocation, as well as indicating whether it is signed or not.
|
relocation, as well as indicating whether it is signed or not.
|
||||||
Doublecheck that the relocation information gathered from the
|
Doublecheck that the relocation information gathered from the
|
||||||
type matches this information. */
|
type matches this information. */
|
||||||
if (relent->howto->bitsize != (internal->r_size & 0x1f) + 1)
|
if (relent->howto->bitsize != ((unsigned int) internal->r_size & 0x1f) + 1)
|
||||||
abort ();
|
abort ();
|
||||||
#if 0
|
#if 0
|
||||||
if ((internal->r_size & 0x80) != 0
|
if ((internal->r_size & 0x80) != 0
|
||||||
@ -422,10 +424,10 @@ rs6000coff_rtype2howto (relent, internal)
|
|||||||
|
|
||||||
#define coff_bfd_reloc_type_lookup rs6000coff_reloc_type_lookup
|
#define coff_bfd_reloc_type_lookup rs6000coff_reloc_type_lookup
|
||||||
|
|
||||||
static const struct reloc_howto_struct *rs6000coff_reloc_type_lookup
|
static reloc_howto_type *rs6000coff_reloc_type_lookup
|
||||||
PARAMS ((bfd *, bfd_reloc_code_real_type));
|
PARAMS ((bfd *, bfd_reloc_code_real_type));
|
||||||
|
|
||||||
static const struct reloc_howto_struct *
|
static reloc_howto_type *
|
||||||
rs6000coff_reloc_type_lookup (abfd, code)
|
rs6000coff_reloc_type_lookup (abfd, code)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
bfd_reloc_code_real_type code;
|
bfd_reloc_code_real_type code;
|
||||||
@ -471,7 +473,10 @@ rs6000coff_reloc_type_lookup (abfd, code)
|
|||||||
|
|
||||||
#define rs6000coff_slurp_armap bfd_slurp_coff_armap
|
#define rs6000coff_slurp_armap bfd_slurp_coff_armap
|
||||||
#define rs6000coff_slurp_extended_name_table _bfd_slurp_extended_name_table
|
#define rs6000coff_slurp_extended_name_table _bfd_slurp_extended_name_table
|
||||||
|
#define rs6000coff_construct_extended_name_table \
|
||||||
|
_bfd_archive_coff_construct_extended_name_table
|
||||||
#define rs6000coff_truncate_arname bfd_dont_truncate_arname
|
#define rs6000coff_truncate_arname bfd_dont_truncate_arname
|
||||||
|
#define rs6000coff_update_armap_timestamp bfd_true
|
||||||
|
|
||||||
#undef coff_mkarchive
|
#undef coff_mkarchive
|
||||||
#define coff_mkarchive rs6000coff_mkarchive
|
#define coff_mkarchive rs6000coff_mkarchive
|
||||||
@ -620,7 +625,7 @@ rs6000coff_openr_next_archived_file(archive, last_file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bfd_target *
|
static const bfd_target *
|
||||||
rs6000coff_archive_p (abfd)
|
rs6000coff_archive_p (abfd)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
@ -710,10 +715,10 @@ rs6000coff_write_armap (arch, elength, map, orl_count, stridx)
|
|||||||
#define coff_core_file_matches_executable_p \
|
#define coff_core_file_matches_executable_p \
|
||||||
_bfd_nocore_core_file_matches_executable_p
|
_bfd_nocore_core_file_matches_executable_p
|
||||||
|
|
||||||
#ifdef HOST_AIX
|
#ifdef AIX_CORE
|
||||||
#undef CORE_FILE_P
|
#undef CORE_FILE_P
|
||||||
#define CORE_FILE_P rs6000coff_core_p
|
#define CORE_FILE_P rs6000coff_core_p
|
||||||
extern bfd_target * rs6000coff_core_p ();
|
extern const bfd_target * rs6000coff_core_p ();
|
||||||
extern boolean rs6000coff_get_section_contents ();
|
extern boolean rs6000coff_get_section_contents ();
|
||||||
extern boolean rs6000coff_core_file_matches_executable_p ();
|
extern boolean rs6000coff_core_file_matches_executable_p ();
|
||||||
|
|
||||||
@ -723,13 +728,13 @@ extern boolean rs6000coff_core_file_matches_executable_p ();
|
|||||||
|
|
||||||
#undef coff_get_section_contents
|
#undef coff_get_section_contents
|
||||||
#define coff_get_section_contents rs6000coff_get_section_contents
|
#define coff_get_section_contents rs6000coff_get_section_contents
|
||||||
#endif /* HOST_AIX */
|
#endif /* AIX_CORE */
|
||||||
|
|
||||||
#ifdef HOST_LYNX
|
#ifdef LYNX_CORE
|
||||||
|
|
||||||
#undef CORE_FILE_P
|
#undef CORE_FILE_P
|
||||||
#define CORE_FILE_P lynx_core_file_p
|
#define CORE_FILE_P lynx_core_file_p
|
||||||
extern bfd_target *lynx_core_file_p PARAMS ((bfd *abfd));
|
extern const bfd_target *lynx_core_file_p PARAMS ((bfd *abfd));
|
||||||
|
|
||||||
extern boolean lynx_core_file_matches_executable_p PARAMS ((bfd *core_bfd,
|
extern boolean lynx_core_file_matches_executable_p PARAMS ((bfd *core_bfd,
|
||||||
bfd *exec_bfd));
|
bfd *exec_bfd));
|
||||||
@ -744,11 +749,11 @@ extern int lynx_core_file_failing_signal PARAMS ((bfd *abfd));
|
|||||||
#undef coff_core_file_failing_signal
|
#undef coff_core_file_failing_signal
|
||||||
#define coff_core_file_failing_signal lynx_core_file_failing_signal
|
#define coff_core_file_failing_signal lynx_core_file_failing_signal
|
||||||
|
|
||||||
#endif /* HOST_LYNX */
|
#endif /* LYNX_CORE */
|
||||||
|
|
||||||
/* The transfer vector that leads the outside world to all of the above. */
|
/* The transfer vector that leads the outside world to all of the above. */
|
||||||
|
|
||||||
bfd_target rs6000coff_vec =
|
const bfd_target rs6000coff_vec =
|
||||||
{
|
{
|
||||||
"aixcoff-rs6000", /* name */
|
"aixcoff-rs6000", /* name */
|
||||||
bfd_target_coff_flavour,
|
bfd_target_coff_flavour,
|
||||||
@ -791,6 +796,7 @@ bfd_target rs6000coff_vec =
|
|||||||
BFD_JUMP_TABLE_RELOCS (coff),
|
BFD_JUMP_TABLE_RELOCS (coff),
|
||||||
BFD_JUMP_TABLE_WRITE (coff),
|
BFD_JUMP_TABLE_WRITE (coff),
|
||||||
BFD_JUMP_TABLE_LINK (coff),
|
BFD_JUMP_TABLE_LINK (coff),
|
||||||
|
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
|
||||||
|
|
||||||
COFF_SWAP_TABLE,
|
COFF_SWAP_TABLE,
|
||||||
};
|
};
|
||||||
|
@ -368,7 +368,7 @@ sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
|
|||||||
sym_value -= 0x1000;
|
sym_value -= 0x1000;
|
||||||
insn = (insn & 0xf000) | (sym_value & 0xfff);
|
insn = (insn & 0xf000) | (sym_value & 0xfff);
|
||||||
bfd_put_16 (abfd, insn, hit_data);
|
bfd_put_16 (abfd, insn, hit_data);
|
||||||
if (sym_value < -0x1000 || sym_value >= 0x1000)
|
if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
|
||||||
return bfd_reloc_overflow;
|
return bfd_reloc_overflow;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -624,8 +624,7 @@ sh_relax_section (abfd, sec, link_info, again)
|
|||||||
if (coff_section_data (abfd, sec) == NULL)
|
if (coff_section_data (abfd, sec) == NULL)
|
||||||
{
|
{
|
||||||
sec->used_by_bfd =
|
sec->used_by_bfd =
|
||||||
((struct coff_section_tdata *)
|
((PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
|
||||||
bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
|
|
||||||
if (sec->used_by_bfd == NULL)
|
if (sec->used_by_bfd == NULL)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
@ -748,8 +747,7 @@ sh_relax_section (abfd, sec, link_info, again)
|
|||||||
if (coff_section_data (abfd, sec) == NULL)
|
if (coff_section_data (abfd, sec) == NULL)
|
||||||
{
|
{
|
||||||
sec->used_by_bfd =
|
sec->used_by_bfd =
|
||||||
((struct coff_section_tdata *)
|
((PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
|
||||||
bfd_zalloc (abfd, sizeof (struct coff_section_tdata)));
|
|
||||||
if (sec->used_by_bfd == NULL)
|
if (sec->used_by_bfd == NULL)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
@ -877,8 +875,8 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
|
|||||||
&sym);
|
&sym);
|
||||||
if (sym.n_sclass != C_EXT
|
if (sym.n_sclass != C_EXT
|
||||||
&& sym.n_scnum == sec->target_index
|
&& sym.n_scnum == sec->target_index
|
||||||
&& (sym.n_value < addr
|
&& ((bfd_vma) sym.n_value <= addr
|
||||||
|| sym.n_value >= toaddr))
|
|| (bfd_vma) sym.n_value >= toaddr))
|
||||||
{
|
{
|
||||||
bfd_vma val;
|
bfd_vma val;
|
||||||
|
|
||||||
@ -1080,8 +1078,8 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
|
|||||||
&sym);
|
&sym);
|
||||||
if (sym.n_sclass != C_EXT
|
if (sym.n_sclass != C_EXT
|
||||||
&& sym.n_scnum == sec->target_index
|
&& sym.n_scnum == sec->target_index
|
||||||
&& (sym.n_value < addr
|
&& ((bfd_vma) sym.n_value <= addr
|
||||||
|| sym.n_value >= toaddr))
|
|| (bfd_vma) sym.n_value >= toaddr))
|
||||||
{
|
{
|
||||||
bfd_vma val;
|
bfd_vma val;
|
||||||
|
|
||||||
@ -1146,8 +1144,8 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
|
|||||||
bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
|
bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
|
||||||
|
|
||||||
if (isym.n_scnum == sec->target_index
|
if (isym.n_scnum == sec->target_index
|
||||||
&& isym.n_value >= addr
|
&& (bfd_vma) isym.n_value > addr
|
||||||
&& isym.n_value < toaddr)
|
&& (bfd_vma) isym.n_value < toaddr)
|
||||||
{
|
{
|
||||||
isym.n_value -= count;
|
isym.n_value -= count;
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
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 "bfd.h"
|
#include "bfd.h"
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
@ -26,6 +26,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#include "coff/internal.h"
|
#include "coff/internal.h"
|
||||||
#include "libcoff.h"
|
#include "libcoff.h"
|
||||||
|
|
||||||
|
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
|
||||||
|
|
||||||
#define BADMAG(x) ((x).f_magic != SPARCMAGIC && (x).f_magic != LYNXCOFFMAGIC)
|
#define BADMAG(x) ((x).f_magic != SPARCMAGIC && (x).f_magic != LYNXCOFFMAGIC)
|
||||||
|
|
||||||
/* The page size is a guess based on ELF. */
|
/* The page size is a guess based on ELF. */
|
||||||
@ -156,12 +158,12 @@ static CONST struct coff_reloc_map sparc_reloc_map[] =
|
|||||||
/* { BFD_RELOC_SPARC_UA32, R_SPARC_UA32 }, not used?? */
|
/* { BFD_RELOC_SPARC_UA32, R_SPARC_UA32 }, not used?? */
|
||||||
};
|
};
|
||||||
|
|
||||||
static CONST struct reloc_howto_struct *
|
static reloc_howto_type *
|
||||||
coff_sparc_reloc_type_lookup (abfd, code)
|
coff_sparc_reloc_type_lookup (abfd, code)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
bfd_reloc_code_real_type code;
|
bfd_reloc_code_real_type code;
|
||||||
{
|
{
|
||||||
int i;
|
unsigned int i;
|
||||||
for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct coff_reloc_map); i++)
|
for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct coff_reloc_map); i++)
|
||||||
{
|
{
|
||||||
if (sparc_reloc_map[i].bfd_reloc_val == code)
|
if (sparc_reloc_map[i].bfd_reloc_val == code)
|
||||||
@ -184,8 +186,9 @@ rtype2howto (cache_ptr, dst)
|
|||||||
|
|
||||||
#define SWAP_IN_RELOC_OFFSET bfd_h_get_32
|
#define SWAP_IN_RELOC_OFFSET bfd_h_get_32
|
||||||
#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32
|
#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32
|
||||||
/* This is just like the standard one, except for the addition of the
|
/* This is just like the standard one, except that we don't set up an
|
||||||
last line, the adjustment of the addend. */
|
addend for relocs against global symbols (otherwise linking objects
|
||||||
|
created by -r fails), and we add in the reloc offset at the end. */
|
||||||
#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
|
#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
|
||||||
{ \
|
{ \
|
||||||
coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \
|
coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \
|
||||||
@ -198,7 +201,8 @@ rtype2howto (cache_ptr, dst)
|
|||||||
&& coffsym->native->u.syment.n_scnum == 0) \
|
&& coffsym->native->u.syment.n_scnum == 0) \
|
||||||
cache_ptr->addend = 0; \
|
cache_ptr->addend = 0; \
|
||||||
else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
|
else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
|
||||||
&& ptr->section != (asection *) NULL) \
|
&& ptr->section != (asection *) NULL \
|
||||||
|
&& (ptr->flags & BSF_GLOBAL) == 0) \
|
||||||
cache_ptr->addend = - (ptr->section->vma + ptr->value); \
|
cache_ptr->addend = - (ptr->section->vma + ptr->value); \
|
||||||
else \
|
else \
|
||||||
cache_ptr->addend = 0; \
|
cache_ptr->addend = 0; \
|
||||||
@ -220,7 +224,7 @@ rtype2howto (cache_ptr, dst)
|
|||||||
|
|
||||||
#include "coffcode.h"
|
#include "coffcode.h"
|
||||||
|
|
||||||
bfd_target
|
const bfd_target
|
||||||
#ifdef TARGET_SYM
|
#ifdef TARGET_SYM
|
||||||
TARGET_SYM =
|
TARGET_SYM =
|
||||||
#else
|
#else
|
||||||
@ -238,10 +242,10 @@ bfd_target
|
|||||||
|
|
||||||
(HAS_RELOC | EXEC_P | /* object flags */
|
(HAS_RELOC | EXEC_P | /* object flags */
|
||||||
HAS_LINENO | HAS_DEBUG |
|
HAS_LINENO | HAS_DEBUG |
|
||||||
HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
|
HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
|
||||||
|
|
||||||
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
|
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
|
||||||
0, /* leading underscore */
|
'_', /* leading underscore */
|
||||||
'/', /* ar_pad_char */
|
'/', /* ar_pad_char */
|
||||||
15, /* ar_max_namelen */
|
15, /* ar_max_namelen */
|
||||||
|
|
||||||
|
447
bfd/coff-w65.c
Normal file
447
bfd/coff-w65.c
Normal file
@ -0,0 +1,447 @@
|
|||||||
|
/* BFD back-end for WDC 65816 COFF binaries.
|
||||||
|
Copyright 1995 Free Software Foundation, Inc.
|
||||||
|
Written by Steve Chamberlain, <sac@cygnus.com>.
|
||||||
|
|
||||||
|
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 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. */
|
||||||
|
|
||||||
|
#include "bfd.h"
|
||||||
|
#include "sysdep.h"
|
||||||
|
#include "obstack.h"
|
||||||
|
#include "libbfd.h"
|
||||||
|
#include "bfdlink.h"
|
||||||
|
#include "coff/w65.h"
|
||||||
|
#include "coff/internal.h"
|
||||||
|
#include "libcoff.h"
|
||||||
|
|
||||||
|
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1)
|
||||||
|
static reloc_howto_type howto_table[] =
|
||||||
|
{
|
||||||
|
HOWTO (R_W65_ABS8, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "abs8", true, 0x000000ff, 0x000000ff, false),
|
||||||
|
HOWTO (R_W65_ABS16, 1, 0, 16, false, 0, complain_overflow_bitfield, 0, "abs16", true, 0x0000ffff, 0x0000ffff, false),
|
||||||
|
HOWTO (R_W65_ABS24, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, "abs24", true, 0x00ffffff, 0x00ffffff, false),
|
||||||
|
HOWTO (R_W65_ABS8S8, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, ">abs8", true, 0x000000ff, 0x000000ff, false),
|
||||||
|
HOWTO (R_W65_ABS8S16, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "^abs8", true, 0x000000ff, 0x000000ff, false),
|
||||||
|
HOWTO (R_W65_ABS16S8, 1, 0, 16, false, 0, complain_overflow_bitfield, 0, ">abs16", true, 0x0000ffff, 0x0000ffff, false),
|
||||||
|
HOWTO (R_W65_ABS16S16,1, 0, 16, false, 0, complain_overflow_bitfield, 0, "^abs16", true, 0x0000ffff, 0x0000ffff, false),
|
||||||
|
HOWTO (R_W65_PCR8, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "pcrel8", true, 0x000000ff, 0x000000ff, true),
|
||||||
|
HOWTO (R_W65_PCR16, 1, 0, 16, false, 0, complain_overflow_bitfield, 0, "pcrel16", true, 0x0000ffff, 0x0000ffff, true),
|
||||||
|
HOWTO (R_W65_DP, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "dp", true, 0x000000ff, 0x000000ff, false),
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Turn a howto into a reloc number */
|
||||||
|
|
||||||
|
#define SELECT_RELOC(x,howto) \
|
||||||
|
{ x.r_type = select_reloc(howto); }
|
||||||
|
|
||||||
|
#define BADMAG(x) (W65BADMAG(x))
|
||||||
|
#define W65 1 /* Customize coffcode.h */
|
||||||
|
#define __A_MAGIC_SET__
|
||||||
|
|
||||||
|
|
||||||
|
/* Code to swap in the reloc */
|
||||||
|
#define SWAP_IN_RELOC_OFFSET bfd_h_get_32
|
||||||
|
#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32
|
||||||
|
#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \
|
||||||
|
dst->r_stuff[0] = 'S'; \
|
||||||
|
dst->r_stuff[1] = 'C';
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
select_reloc (howto)
|
||||||
|
reloc_howto_type *howto;
|
||||||
|
{
|
||||||
|
return howto->type ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Code to turn a r_type into a howto ptr, uses the above howto table
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
rtype2howto (internal, dst)
|
||||||
|
arelent *internal;
|
||||||
|
struct internal_reloc *dst;
|
||||||
|
{
|
||||||
|
internal->howto = howto_table + dst->r_type - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define RTYPE2HOWTO(internal, relocentry) rtype2howto(internal,relocentry)
|
||||||
|
|
||||||
|
|
||||||
|
/* Perform any necessaru magic to the addend in a reloc entry */
|
||||||
|
|
||||||
|
|
||||||
|
#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
|
||||||
|
cache_ptr->addend = ext_reloc.r_offset;
|
||||||
|
|
||||||
|
|
||||||
|
#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \
|
||||||
|
reloc_processing(relent, reloc, symbols, abfd, section)
|
||||||
|
|
||||||
|
static void
|
||||||
|
reloc_processing (relent, reloc, symbols, abfd, section)
|
||||||
|
arelent * relent;
|
||||||
|
struct internal_reloc *reloc;
|
||||||
|
asymbol ** symbols;
|
||||||
|
bfd * abfd;
|
||||||
|
asection * section;
|
||||||
|
{
|
||||||
|
relent->address = reloc->r_vaddr;
|
||||||
|
rtype2howto (relent, reloc);
|
||||||
|
|
||||||
|
if (((int) reloc->r_symndx) > 0)
|
||||||
|
{
|
||||||
|
relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
relent->sym_ptr_ptr = (asymbol **)&(bfd_abs_symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
relent->addend = reloc->r_offset;
|
||||||
|
|
||||||
|
relent->address -= section->vma;
|
||||||
|
/* relent->section = 0;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
h8300_reloc16_estimate(abfd, input_section, reloc, shrink, link_info)
|
||||||
|
bfd *abfd;
|
||||||
|
asection *input_section;
|
||||||
|
arelent *reloc;
|
||||||
|
unsigned int shrink;
|
||||||
|
struct bfd_link_info *link_info;
|
||||||
|
{
|
||||||
|
bfd_vma value;
|
||||||
|
bfd_vma dot;
|
||||||
|
bfd_vma gap;
|
||||||
|
|
||||||
|
/* The address of the thing to be relocated will have moved back by
|
||||||
|
the size of the shrink - but we don't change reloc->address here,
|
||||||
|
since we need it to know where the relocation lives in the source
|
||||||
|
uncooked section */
|
||||||
|
|
||||||
|
/* reloc->address -= shrink; conceptual */
|
||||||
|
|
||||||
|
bfd_vma address = reloc->address - shrink;
|
||||||
|
|
||||||
|
|
||||||
|
switch (reloc->howto->type)
|
||||||
|
{
|
||||||
|
case R_MOVB2:
|
||||||
|
case R_JMP2:
|
||||||
|
shrink+=2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Thing is a move one byte */
|
||||||
|
case R_MOVB1:
|
||||||
|
value = bfd_coff_reloc16_get_value(reloc, link_info, input_section);
|
||||||
|
|
||||||
|
if (value >= 0xff00)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Change the reloc type from 16bit, possible 8 to 8bit
|
||||||
|
possible 16 */
|
||||||
|
reloc->howto = reloc->howto + 1;
|
||||||
|
/* The place to relc moves back by one */
|
||||||
|
/* This will be two bytes smaller in the long run */
|
||||||
|
shrink +=2 ;
|
||||||
|
bfd_perform_slip(abfd, 2, input_section, address);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
/* This is the 24 bit branch which could become an 8 bitter,
|
||||||
|
the relocation points to the first byte of the insn, not the
|
||||||
|
actual data */
|
||||||
|
|
||||||
|
case R_JMPL1:
|
||||||
|
value = bfd_coff_reloc16_get_value(reloc, link_info, input_section);
|
||||||
|
|
||||||
|
dot = input_section->output_section->vma +
|
||||||
|
input_section->output_offset + address;
|
||||||
|
|
||||||
|
/* See if the address we're looking at within 127 bytes of where
|
||||||
|
we are, if so then we can use a small branch rather than the
|
||||||
|
jump we were going to */
|
||||||
|
|
||||||
|
gap = value - dot ;
|
||||||
|
|
||||||
|
if (-120 < (long)gap && (long)gap < 120 )
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Change the reloc type from 24bit, possible 8 to 8bit
|
||||||
|
possible 32 */
|
||||||
|
reloc->howto = reloc->howto + 1;
|
||||||
|
/* This will be two bytes smaller in the long run */
|
||||||
|
shrink +=2 ;
|
||||||
|
bfd_perform_slip(abfd, 2, input_section, address);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_JMP1:
|
||||||
|
|
||||||
|
value = bfd_coff_reloc16_get_value(reloc, link_info, input_section);
|
||||||
|
|
||||||
|
dot = input_section->output_section->vma +
|
||||||
|
input_section->output_offset + address;
|
||||||
|
|
||||||
|
/* See if the address we're looking at within 127 bytes of where
|
||||||
|
we are, if so then we can use a small branch rather than the
|
||||||
|
jump we were going to */
|
||||||
|
|
||||||
|
gap = value - (dot - shrink);
|
||||||
|
|
||||||
|
|
||||||
|
if (-120 < (long)gap && (long)gap < 120 )
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Change the reloc type from 16bit, possible 8 to 8bit
|
||||||
|
possible 16 */
|
||||||
|
reloc->howto = reloc->howto + 1;
|
||||||
|
/* The place to relc moves back by one */
|
||||||
|
|
||||||
|
/* This will be two bytes smaller in the long run */
|
||||||
|
shrink +=2 ;
|
||||||
|
bfd_perform_slip(abfd, 2, input_section, address);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return shrink;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* First phase of a relaxing link */
|
||||||
|
|
||||||
|
/* Reloc types
|
||||||
|
large small
|
||||||
|
R_MOVB1 R_MOVB2 mov.b with 16bit or 8 bit address
|
||||||
|
R_JMP1 R_JMP2 jmp or pcrel branch
|
||||||
|
R_JMPL1 R_JMPL_B8 24jmp or pcrel branch
|
||||||
|
R_MOVLB1 R_MOVLB2 24 or 8 bit reloc for mov.b
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
|
||||||
|
dst_ptr)
|
||||||
|
bfd *abfd;
|
||||||
|
struct bfd_link_info *link_info;
|
||||||
|
struct bfd_link_order *link_order;
|
||||||
|
arelent *reloc;
|
||||||
|
bfd_byte *data;
|
||||||
|
unsigned int *src_ptr;
|
||||||
|
unsigned int *dst_ptr;
|
||||||
|
{
|
||||||
|
unsigned int src_address = *src_ptr;
|
||||||
|
unsigned int dst_address = *dst_ptr;
|
||||||
|
asection *input_section = link_order->u.indirect.section;
|
||||||
|
|
||||||
|
switch (reloc->howto->type)
|
||||||
|
{
|
||||||
|
case R_W65_ABS8:
|
||||||
|
case R_W65_DP:
|
||||||
|
{
|
||||||
|
unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info,
|
||||||
|
input_section);
|
||||||
|
bfd_put_8 (abfd, gap, data + dst_address);
|
||||||
|
dst_address += 1;
|
||||||
|
src_address += 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_W65_ABS8S8:
|
||||||
|
{
|
||||||
|
unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info,
|
||||||
|
input_section);
|
||||||
|
gap >>= 8;
|
||||||
|
bfd_put_8 (abfd, gap, data + dst_address);
|
||||||
|
dst_address += 1;
|
||||||
|
src_address += 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_W65_ABS8S16:
|
||||||
|
{
|
||||||
|
unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info,
|
||||||
|
input_section);
|
||||||
|
gap >>=16;
|
||||||
|
bfd_put_8 (abfd, gap, data + dst_address);
|
||||||
|
dst_address += 1;
|
||||||
|
src_address += 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_W65_ABS16:
|
||||||
|
{
|
||||||
|
unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info,
|
||||||
|
input_section);
|
||||||
|
|
||||||
|
bfd_put_16 (abfd, gap, data + dst_address);
|
||||||
|
dst_address += 2;
|
||||||
|
src_address += 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R_W65_ABS16S8:
|
||||||
|
{
|
||||||
|
unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info,
|
||||||
|
input_section);
|
||||||
|
gap >>= 8;
|
||||||
|
bfd_put_16 (abfd, gap, data + dst_address);
|
||||||
|
dst_address += 2;
|
||||||
|
src_address += 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R_W65_ABS16S16:
|
||||||
|
{
|
||||||
|
unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info,
|
||||||
|
input_section);
|
||||||
|
gap >>= 16;
|
||||||
|
bfd_put_16 (abfd, gap, data + dst_address);
|
||||||
|
dst_address += 2;
|
||||||
|
src_address += 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_W65_ABS24:
|
||||||
|
{
|
||||||
|
unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info,
|
||||||
|
input_section);
|
||||||
|
bfd_put_16 (abfd, gap, data + dst_address);
|
||||||
|
bfd_put_8 (abfd, gap>>16, data+dst_address+2);
|
||||||
|
dst_address += 3;
|
||||||
|
src_address += 3;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_W65_PCR8:
|
||||||
|
{
|
||||||
|
int gap = bfd_coff_reloc16_get_value (reloc, link_info,
|
||||||
|
input_section);
|
||||||
|
bfd_vma dot = link_order->offset
|
||||||
|
+ dst_address
|
||||||
|
+ link_order->u.indirect.section->output_section->vma;
|
||||||
|
|
||||||
|
gap -= dot + 1;
|
||||||
|
if (gap < -128 || gap > 127) {
|
||||||
|
if (! ((*link_info->callbacks->reloc_overflow)
|
||||||
|
(link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr),
|
||||||
|
reloc->howto->name, reloc->addend, input_section->owner,
|
||||||
|
input_section, reloc->address)))
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
bfd_put_8 (abfd, gap, data + dst_address);
|
||||||
|
dst_address += 1;
|
||||||
|
src_address += 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_W65_PCR16:
|
||||||
|
{
|
||||||
|
bfd_vma gap = bfd_coff_reloc16_get_value (reloc, link_info,
|
||||||
|
input_section);
|
||||||
|
bfd_vma dot = link_order->offset
|
||||||
|
+ dst_address
|
||||||
|
+ link_order->u.indirect.section->output_section->vma;
|
||||||
|
|
||||||
|
|
||||||
|
/* This wraps within the page, so ignore the relativeness, look at the
|
||||||
|
high part */
|
||||||
|
if ((gap & 0xf0000) != (dot & 0xf0000)) {
|
||||||
|
if (! ((*link_info->callbacks->reloc_overflow)
|
||||||
|
(link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr),
|
||||||
|
reloc->howto->name, reloc->addend, input_section->owner,
|
||||||
|
input_section, reloc->address)))
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
gap -= dot + 2;
|
||||||
|
bfd_put_16 (abfd, gap, data + dst_address);
|
||||||
|
dst_address += 2;
|
||||||
|
src_address += 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("ignoring reloc %s\n", reloc->howto->name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
*src_ptr = src_address;
|
||||||
|
*dst_ptr = dst_address;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#define coff_reloc16_extra_cases h8300_reloc16_extra_cases
|
||||||
|
#define coff_reloc16_estimate h8300_reloc16_estimate
|
||||||
|
|
||||||
|
#include "coffcode.h"
|
||||||
|
|
||||||
|
|
||||||
|
#undef coff_bfd_get_relocated_section_contents
|
||||||
|
#undef coff_bfd_relax_section
|
||||||
|
#define coff_bfd_get_relocated_section_contents \
|
||||||
|
bfd_coff_reloc16_get_relocated_section_contents
|
||||||
|
#define coff_bfd_relax_section bfd_coff_reloc16_relax_section
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bfd_target w65_vec =
|
||||||
|
{
|
||||||
|
"coff-w65", /* name */
|
||||||
|
bfd_target_coff_flavour,
|
||||||
|
false, /* data byte order is big */
|
||||||
|
false, /* header byte order is big */
|
||||||
|
|
||||||
|
(HAS_RELOC | EXEC_P | /* object flags */
|
||||||
|
HAS_LINENO | HAS_DEBUG |
|
||||||
|
HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ),
|
||||||
|
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
|
||||||
|
'_', /* leading char */
|
||||||
|
'/', /* ar_pad_char */
|
||||||
|
15, /* ar_max_namelen */
|
||||||
|
1, /* minimum section alignment */
|
||||||
|
bfd_getl64, bfd_getl_signed_64, bfd_putl64,
|
||||||
|
bfd_getl32, bfd_getl_signed_32, bfd_putl32,
|
||||||
|
bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
|
||||||
|
bfd_getl64, bfd_getl_signed_64, bfd_putl64,
|
||||||
|
bfd_getl32, bfd_getl_signed_32, bfd_putl32,
|
||||||
|
bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
|
||||||
|
|
||||||
|
{_bfd_dummy_target, coff_object_p, /* bfd_check_format */
|
||||||
|
bfd_generic_archive_p, _bfd_dummy_target},
|
||||||
|
{bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
|
||||||
|
bfd_false},
|
||||||
|
{bfd_false, coff_write_object_contents, /* bfd_write_contents */
|
||||||
|
_bfd_write_archive_contents, bfd_false},
|
||||||
|
|
||||||
|
BFD_JUMP_TABLE_GENERIC (coff),
|
||||||
|
BFD_JUMP_TABLE_COPY (coff),
|
||||||
|
BFD_JUMP_TABLE_CORE (_bfd_nocore),
|
||||||
|
BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
|
||||||
|
BFD_JUMP_TABLE_SYMBOLS (coff),
|
||||||
|
BFD_JUMP_TABLE_RELOCS (coff),
|
||||||
|
BFD_JUMP_TABLE_WRITE (coff),
|
||||||
|
BFD_JUMP_TABLE_LINK (coff),
|
||||||
|
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
|
||||||
|
|
||||||
|
COFF_SWAP_TABLE,
|
||||||
|
};
|
219
bfd/coffgen.c
219
bfd/coffgen.c
@ -16,7 +16,7 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
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. */
|
||||||
|
|
||||||
/* Most of this hacked by Steve Chamberlain, sac@cygnus.com.
|
/* Most of this hacked by Steve Chamberlain, sac@cygnus.com.
|
||||||
Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */
|
Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */
|
||||||
@ -476,7 +476,7 @@ coff_renumber_symbols (bfd_ptr, first_undef)
|
|||||||
I'm not certain. [raeburn:19920508.1711EST] */
|
I'm not certain. [raeburn:19920508.1711EST] */
|
||||||
{
|
{
|
||||||
asymbol **newsyms;
|
asymbol **newsyms;
|
||||||
int i;
|
unsigned int i;
|
||||||
|
|
||||||
newsyms = (asymbol **) bfd_alloc_by_size_t (bfd_ptr,
|
newsyms = (asymbol **) bfd_alloc_by_size_t (bfd_ptr,
|
||||||
sizeof (asymbol *)
|
sizeof (asymbol *)
|
||||||
@ -1167,8 +1167,8 @@ static void
|
|||||||
coff_pointerize_aux (abfd, table_base, type, class, auxent)
|
coff_pointerize_aux (abfd, table_base, type, class, auxent)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
combined_entry_type *table_base;
|
combined_entry_type *table_base;
|
||||||
int type;
|
unsigned int type;
|
||||||
int class;
|
unsigned int class;
|
||||||
combined_entry_type *auxent;
|
combined_entry_type *auxent;
|
||||||
{
|
{
|
||||||
/* Don't bother if this is a file or a section */
|
/* Don't bother if this is a file or a section */
|
||||||
@ -1198,39 +1198,6 @@ coff_pointerize_aux (abfd, table_base, type, class, auxent)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
|
||||||
build_string_table (abfd)
|
|
||||||
bfd *abfd;
|
|
||||||
{
|
|
||||||
char string_table_size_buffer[STRING_SIZE_SIZE];
|
|
||||||
unsigned int string_table_size;
|
|
||||||
char *string_table;
|
|
||||||
|
|
||||||
/* At this point we should be "seek"'d to the end of the
|
|
||||||
symbols === the symbol table size. */
|
|
||||||
if (bfd_read ((char *) string_table_size_buffer,
|
|
||||||
sizeof (string_table_size_buffer),
|
|
||||||
1, abfd) != sizeof (string_table_size))
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
#if STRING_SIZE_SIZE == 4
|
|
||||||
string_table_size = bfd_h_get_32 (abfd, (bfd_byte *) string_table_size_buffer);
|
|
||||||
#else
|
|
||||||
#error Change bfd_h_get_32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((string_table = (PTR) bfd_alloc (abfd,
|
|
||||||
string_table_size -= STRING_SIZE_SIZE))
|
|
||||||
== NULL)
|
|
||||||
{
|
|
||||||
bfd_set_error (bfd_error_no_memory);
|
|
||||||
return (NULL);
|
|
||||||
} /* on mallocation error */
|
|
||||||
if (bfd_read (string_table, string_table_size, 1, abfd) != string_table_size)
|
|
||||||
return (NULL);
|
|
||||||
return string_table;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate space for the ".debug" section, and read it.
|
/* Allocate space for the ".debug" section, and read it.
|
||||||
We did not read the debug section until now, because
|
We did not read the debug section until now, because
|
||||||
we didn't want to go to the trouble until someone needed it. */
|
we didn't want to go to the trouble until someone needed it. */
|
||||||
@ -1303,6 +1270,122 @@ copy_name (abfd, name, maxlen)
|
|||||||
return newname;
|
return newname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read in the external symbols. */
|
||||||
|
|
||||||
|
boolean
|
||||||
|
_bfd_coff_get_external_symbols (abfd)
|
||||||
|
bfd *abfd;
|
||||||
|
{
|
||||||
|
bfd_size_type symesz;
|
||||||
|
size_t size;
|
||||||
|
PTR syms;
|
||||||
|
|
||||||
|
if (obj_coff_external_syms (abfd) != NULL)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
symesz = bfd_coff_symesz (abfd);
|
||||||
|
|
||||||
|
size = obj_raw_syment_count (abfd) * symesz;
|
||||||
|
|
||||||
|
syms = malloc (size);
|
||||||
|
if (syms == NULL && size != 0)
|
||||||
|
{
|
||||||
|
bfd_set_error (bfd_error_no_memory);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
|
||||||
|
|| bfd_read (syms, size, 1, abfd) != size)
|
||||||
|
{
|
||||||
|
if (syms != NULL)
|
||||||
|
free (syms);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj_coff_external_syms (abfd) = syms;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read in the external strings. The strings are not loaded until
|
||||||
|
they are needed. This is because we have no simple way of
|
||||||
|
detecting a missing string table in an archive. */
|
||||||
|
|
||||||
|
const char *
|
||||||
|
_bfd_coff_read_string_table (abfd)
|
||||||
|
bfd *abfd;
|
||||||
|
{
|
||||||
|
char extstrsize[STRING_SIZE_SIZE];
|
||||||
|
size_t strsize;
|
||||||
|
char *strings;
|
||||||
|
|
||||||
|
if (obj_coff_strings (abfd) != NULL)
|
||||||
|
return obj_coff_strings (abfd);
|
||||||
|
|
||||||
|
if (bfd_seek (abfd,
|
||||||
|
(obj_sym_filepos (abfd)
|
||||||
|
+ obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd)),
|
||||||
|
SEEK_SET) != 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (bfd_read (extstrsize, sizeof extstrsize, 1, abfd) != sizeof extstrsize)
|
||||||
|
{
|
||||||
|
if (bfd_get_error () != bfd_error_file_truncated)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* There is no string table. */
|
||||||
|
strsize = STRING_SIZE_SIZE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if STRING_SIZE_SIZE == 4
|
||||||
|
strsize = bfd_h_get_32 (abfd, (bfd_byte *) extstrsize);
|
||||||
|
#else
|
||||||
|
#error Change bfd_h_get_32
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
strings = malloc (strsize);
|
||||||
|
if (strings == NULL)
|
||||||
|
{
|
||||||
|
bfd_set_error (bfd_error_no_memory);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bfd_read (strings + STRING_SIZE_SIZE,
|
||||||
|
strsize - STRING_SIZE_SIZE, 1, abfd)
|
||||||
|
!= strsize - STRING_SIZE_SIZE)
|
||||||
|
{
|
||||||
|
free (strings);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj_coff_strings (abfd) = strings;
|
||||||
|
|
||||||
|
return strings;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free up the external symbols and strings read from a COFF file. */
|
||||||
|
|
||||||
|
boolean
|
||||||
|
_bfd_coff_free_symbols (abfd)
|
||||||
|
bfd *abfd;
|
||||||
|
{
|
||||||
|
if (obj_coff_external_syms (abfd) != NULL
|
||||||
|
&& ! obj_coff_keep_syms (abfd))
|
||||||
|
{
|
||||||
|
free (obj_coff_external_syms (abfd));
|
||||||
|
obj_coff_external_syms (abfd) = NULL;
|
||||||
|
}
|
||||||
|
if (obj_coff_strings (abfd) != NULL
|
||||||
|
&& ! obj_coff_keep_strings (abfd))
|
||||||
|
{
|
||||||
|
free (obj_coff_strings (abfd));
|
||||||
|
obj_coff_strings (abfd) = NULL;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read a symbol table into freshly bfd_allocated memory, swap it, and
|
/* Read a symbol table into freshly bfd_allocated memory, swap it, and
|
||||||
knit the symbol names into a normalized form. By normalized here I
|
knit the symbol names into a normalized form. By normalized here I
|
||||||
mean that all symbols have an n_offset pointer that points to a null-
|
mean that all symbols have an n_offset pointer that points to a null-
|
||||||
@ -1317,13 +1400,11 @@ coff_get_normalized_symtab (abfd)
|
|||||||
combined_entry_type *symbol_ptr;
|
combined_entry_type *symbol_ptr;
|
||||||
combined_entry_type *internal_end;
|
combined_entry_type *internal_end;
|
||||||
bfd_size_type symesz;
|
bfd_size_type symesz;
|
||||||
PTR raw;
|
|
||||||
char *raw_src;
|
char *raw_src;
|
||||||
char *raw_end;
|
char *raw_end;
|
||||||
char *string_table = NULL;
|
const char *string_table = NULL;
|
||||||
char *debug_section = NULL;
|
char *debug_section = NULL;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
unsigned int raw_size;
|
|
||||||
|
|
||||||
if (obj_raw_syments (abfd) != NULL)
|
if (obj_raw_syments (abfd) != NULL)
|
||||||
return obj_raw_syments (abfd);
|
return obj_raw_syments (abfd);
|
||||||
@ -1337,27 +1418,20 @@ coff_get_normalized_symtab (abfd)
|
|||||||
}
|
}
|
||||||
internal_end = internal + obj_raw_syment_count (abfd);
|
internal_end = internal + obj_raw_syment_count (abfd);
|
||||||
|
|
||||||
symesz = bfd_coff_symesz (abfd);
|
if (! _bfd_coff_get_external_symbols (abfd))
|
||||||
raw_size = obj_raw_syment_count (abfd) * symesz;
|
|
||||||
raw = bfd_alloc (abfd, raw_size);
|
|
||||||
if (raw == NULL && raw_size != 0)
|
|
||||||
{
|
|
||||||
bfd_set_error (bfd_error_no_memory);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) == -1
|
|
||||||
|| bfd_read (raw, raw_size, 1, abfd) != raw_size)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
raw_src = (char *) obj_coff_external_syms (abfd);
|
||||||
|
|
||||||
/* mark the end of the symbols */
|
/* mark the end of the symbols */
|
||||||
raw_end = (char *) raw + obj_raw_syment_count (abfd) * symesz;
|
symesz = bfd_coff_symesz (abfd);
|
||||||
|
raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz;
|
||||||
|
|
||||||
/* FIXME SOMEDAY. A string table size of zero is very weird, but
|
/* FIXME SOMEDAY. A string table size of zero is very weird, but
|
||||||
probably possible. If one shows up, it will probably kill us. */
|
probably possible. If one shows up, it will probably kill us. */
|
||||||
|
|
||||||
/* Swap all the raw entries */
|
/* Swap all the raw entries */
|
||||||
for (raw_src = (char *) raw, internal_ptr = internal;
|
for (internal_ptr = internal;
|
||||||
raw_src < raw_end;
|
raw_src < raw_end;
|
||||||
raw_src += symesz, internal_ptr++)
|
raw_src += symesz, internal_ptr++)
|
||||||
{
|
{
|
||||||
@ -1401,9 +1475,10 @@ coff_get_normalized_symtab (abfd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free all the raw stuff */
|
/* Free the raw symbols, but not the strings (if we have them). */
|
||||||
if (raw != NULL)
|
obj_coff_keep_strings (abfd) = true;
|
||||||
bfd_release (abfd, raw);
|
if (! _bfd_coff_free_symbols (abfd))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
for (internal_ptr = internal; internal_ptr < internal_end;
|
for (internal_ptr = internal; internal_ptr < internal_end;
|
||||||
internal_ptr++)
|
internal_ptr++)
|
||||||
@ -1417,11 +1492,16 @@ coff_get_normalized_symtab (abfd)
|
|||||||
{
|
{
|
||||||
/* the filename is a long one, point into the string table */
|
/* the filename is a long one, point into the string table */
|
||||||
if (string_table == NULL)
|
if (string_table == NULL)
|
||||||
string_table = build_string_table (abfd);
|
{
|
||||||
|
string_table = _bfd_coff_read_string_table (abfd);
|
||||||
|
if (string_table == NULL)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
internal_ptr->u.syment._n._n_n._n_offset =
|
internal_ptr->u.syment._n._n_n._n_offset =
|
||||||
(long) (string_table - STRING_SIZE_SIZE +
|
((long)
|
||||||
(internal_ptr + 1)->u.auxent.x_file.x_n.x_offset);
|
(string_table
|
||||||
|
+ (internal_ptr + 1)->u.auxent.x_file.x_n.x_offset));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1466,11 +1546,15 @@ coff_get_normalized_symtab (abfd)
|
|||||||
/* Long name already. Point symbol at the string in the
|
/* Long name already. Point symbol at the string in the
|
||||||
table. */
|
table. */
|
||||||
if (string_table == NULL)
|
if (string_table == NULL)
|
||||||
string_table = build_string_table (abfd);
|
{
|
||||||
internal_ptr->u.syment._n._n_n._n_offset = (long int)
|
string_table = _bfd_coff_read_string_table (abfd);
|
||||||
(string_table
|
if (string_table == NULL)
|
||||||
- STRING_SIZE_SIZE
|
return NULL;
|
||||||
+ internal_ptr->u.syment._n._n_n._n_offset);
|
}
|
||||||
|
internal_ptr->u.syment._n._n_n._n_offset =
|
||||||
|
((long int)
|
||||||
|
(string_table
|
||||||
|
+ internal_ptr->u.syment._n._n_n._n_offset));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1485,7 +1569,8 @@ coff_get_normalized_symtab (abfd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
obj_raw_syments (abfd) = internal;
|
obj_raw_syments (abfd) = internal;
|
||||||
BFD_ASSERT (obj_raw_syment_count (abfd) == internal_ptr - internal);
|
BFD_ASSERT (obj_raw_syment_count (abfd)
|
||||||
|
== (unsigned int) (internal_ptr - internal));
|
||||||
|
|
||||||
return (internal);
|
return (internal);
|
||||||
} /* coff_get_normalized_symtab() */
|
} /* coff_get_normalized_symtab() */
|
||||||
@ -1753,8 +1838,8 @@ coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (p2 < pend
|
if (p2 < pend
|
||||||
&& offset >= p2->u.syment.n_value
|
&& offset >= (bfd_vma) p2->u.syment.n_value
|
||||||
&& offset - p2->u.syment.n_value < maxdiff)
|
&& offset - (bfd_vma) p2->u.syment.n_value < maxdiff)
|
||||||
{
|
{
|
||||||
*filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
|
*filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
|
||||||
maxdiff = offset - p2->u.syment.n_value;
|
maxdiff = offset - p2->u.syment.n_value;
|
||||||
|
327
bfd/cofflink.c
327
bfd/cofflink.c
@ -100,45 +100,6 @@ static boolean coff_reloc_link_order
|
|||||||
PARAMS ((bfd *, struct coff_final_link_info *, asection *,
|
PARAMS ((bfd *, struct coff_final_link_info *, asection *,
|
||||||
struct bfd_link_order *));
|
struct bfd_link_order *));
|
||||||
|
|
||||||
|
|
||||||
/* These new data and data types are used to keep track of the .idata$4 and
|
|
||||||
.idata$5 relocations which are put into the .idata section for all of the
|
|
||||||
*.dll input libraries linked in. This is not a great solution, and may
|
|
||||||
break in the future if MS changes the format of its libraries, but it
|
|
||||||
does work for the collection of mstools libraries we are currently working
|
|
||||||
with. The main problem is that there are some new majic symbols defined
|
|
||||||
in the libraries which are non-standard coff and simply aren't handled
|
|
||||||
completely by ld. What has been included here will help finish up the job.
|
|
||||||
Basically, during the link, .idata$4 and .idata$5 pointers are correctly
|
|
||||||
relocated to the image. At the very end of the link, the .idata$2
|
|
||||||
information is written. This data appears at the beginning of the .idata
|
|
||||||
section and a 'set' of information appears for each *.dll passed in.
|
|
||||||
Each set of information consists of 3 addresses, a pointer to the .idata$4
|
|
||||||
start, a pointer to .idata$6 (which has the name of the dll), and a pointer
|
|
||||||
to .idata$5 start. The idata$4 and 5 information is a list of pointers
|
|
||||||
which appear to point to the name of various functions found within the dll.
|
|
||||||
When invoked, the loader will write over these names with the correct
|
|
||||||
addresses to use for these functions.
|
|
||||||
Without this 'fix', all information appears correctly except for the
|
|
||||||
addresses of the .idata$4 and 5 starts within the .idata$2 portion of the
|
|
||||||
.idata section. What we will do is to keep track of the dll's processed
|
|
||||||
and the number of functions needed from each dll. From this information
|
|
||||||
we can correctly compute the start of the idata$4 and 5 lists for each
|
|
||||||
dll in the idata section */
|
|
||||||
static int num_DLLs_done = 0;
|
|
||||||
static int num_DLLs = 0;
|
|
||||||
static int all_entries = 0;
|
|
||||||
struct DLL_struct {
|
|
||||||
const char * DLL_name;
|
|
||||||
int num_entries;
|
|
||||||
};
|
|
||||||
struct DLL_struct MS_DLL[10];
|
|
||||||
static bfd_vma idata_4_prev = 0;
|
|
||||||
static bfd_vma idata_5_prev = 0;
|
|
||||||
static bfd_vma add_to_val = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Create an entry in a COFF linker hash table. */
|
/* Create an entry in a COFF linker hash table. */
|
||||||
|
|
||||||
static struct bfd_hash_entry *
|
static struct bfd_hash_entry *
|
||||||
@ -519,128 +480,7 @@ coff_link_add_symbols (abfd, info)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse out a -heap <reserved>,<commit> line */
|
|
||||||
|
|
||||||
static char *
|
|
||||||
dores_com (ptr, res, com)
|
|
||||||
char *ptr;
|
|
||||||
bfd_link_pe_info_dval *res;
|
|
||||||
bfd_link_pe_info_dval *com;
|
|
||||||
{
|
|
||||||
res->defined = 1;
|
|
||||||
res->value = strtoul (ptr, &ptr, 0);
|
|
||||||
if (ptr[0] == ',')
|
|
||||||
{
|
|
||||||
com->value = strtoul (ptr+1, &ptr, 0);
|
|
||||||
com->defined = 1;
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *get_name(ptr, dst)
|
|
||||||
char *ptr;
|
|
||||||
char **dst;
|
|
||||||
{
|
|
||||||
while (*ptr == ' ')
|
|
||||||
ptr++;
|
|
||||||
*dst = ptr;
|
|
||||||
while (*ptr && *ptr != ' ')
|
|
||||||
ptr++;
|
|
||||||
*ptr = 0;
|
|
||||||
return ptr+1;
|
|
||||||
}
|
|
||||||
/* Process any magic embedded commands in a section called .drectve */
|
|
||||||
|
|
||||||
static int
|
|
||||||
process_embedded_commands (info, abfd)
|
|
||||||
struct bfd_link_info *info;
|
|
||||||
bfd *abfd;
|
|
||||||
{
|
|
||||||
asection *sec = bfd_get_section_by_name (abfd, ".drectve");
|
|
||||||
char *s;
|
|
||||||
char *e;
|
|
||||||
char *copy;
|
|
||||||
if (!sec)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
copy = malloc ((size_t) sec->_raw_size);
|
|
||||||
if (!copy)
|
|
||||||
{
|
|
||||||
bfd_set_error (bfd_error_no_memory);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (! bfd_get_section_contents(abfd, sec, copy, 0, sec->_raw_size))
|
|
||||||
{
|
|
||||||
free (copy);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
e = copy + sec->_raw_size;
|
|
||||||
for (s = copy; s < e ; )
|
|
||||||
{
|
|
||||||
if (s[0]!= '-') {
|
|
||||||
s++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (strncmp (s,"-attr", 5) == 0)
|
|
||||||
{
|
|
||||||
char *name;
|
|
||||||
char *attribs;
|
|
||||||
asection *asec;
|
|
||||||
|
|
||||||
int loop = 1;
|
|
||||||
int had_write = 0;
|
|
||||||
int had_read = 0;
|
|
||||||
int had_exec= 0;
|
|
||||||
int had_shared= 0;
|
|
||||||
s += 5;
|
|
||||||
s = get_name(s, &name);
|
|
||||||
s = get_name(s, &attribs);
|
|
||||||
while (loop) {
|
|
||||||
switch (*attribs++)
|
|
||||||
{
|
|
||||||
case 'W':
|
|
||||||
had_write = 1;
|
|
||||||
break;
|
|
||||||
case 'R':
|
|
||||||
had_read = 1;
|
|
||||||
break;
|
|
||||||
case 'S':
|
|
||||||
had_shared = 1;
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
had_exec = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
loop = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
asec = bfd_get_section_by_name (abfd, name);
|
|
||||||
if (asec) {
|
|
||||||
if (had_exec)
|
|
||||||
asec->flags |= SEC_CODE;
|
|
||||||
if (!had_write)
|
|
||||||
asec->flags |= SEC_READONLY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strncmp (s,"-heap", 5) == 0)
|
|
||||||
{
|
|
||||||
s = dores_com (s+5,
|
|
||||||
&info->pe_info->heap_reserve,
|
|
||||||
&info->pe_info->heap_commit);
|
|
||||||
}
|
|
||||||
else if (strncmp (s,"-stack", 6) == 0)
|
|
||||||
{
|
|
||||||
s = dores_com (s+6,
|
|
||||||
&info->pe_info->stack_reserve,
|
|
||||||
&info->pe_info->stack_commit);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
free (copy);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
/* Do the final link step. */
|
/* Do the final link step. */
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
@ -941,7 +781,7 @@ _bfd_coff_final_link (abfd, info)
|
|||||||
index of the first external symbol. Write it out again if
|
index of the first external symbol. Write it out again if
|
||||||
necessary. */
|
necessary. */
|
||||||
if (finfo.last_file_index != -1
|
if (finfo.last_file_index != -1
|
||||||
&& finfo.last_file.n_value != obj_raw_syment_count (abfd))
|
&& (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd))
|
||||||
{
|
{
|
||||||
finfo.last_file.n_value = obj_raw_syment_count (abfd);
|
finfo.last_file.n_value = obj_raw_syment_count (abfd);
|
||||||
bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
|
bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
|
||||||
@ -1202,6 +1042,137 @@ _bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* parse out a -heap <reserved>,<commit> line */
|
||||||
|
|
||||||
|
static char *
|
||||||
|
dores_com (ptr, output_bfd, heap)
|
||||||
|
char *ptr;
|
||||||
|
bfd *output_bfd;
|
||||||
|
int heap;
|
||||||
|
{
|
||||||
|
if (coff_data(output_bfd)->pe)
|
||||||
|
{
|
||||||
|
int val = strtoul (ptr, &ptr, 0);
|
||||||
|
if (heap)
|
||||||
|
pe_data(output_bfd)->pe_opthdr.SizeOfHeapReserve =val;
|
||||||
|
else
|
||||||
|
pe_data(output_bfd)->pe_opthdr.SizeOfStackReserve =val;
|
||||||
|
|
||||||
|
if (ptr[0] == ',')
|
||||||
|
{
|
||||||
|
int val = strtoul (ptr+1, &ptr, 0);
|
||||||
|
if (heap)
|
||||||
|
pe_data(output_bfd)->pe_opthdr.SizeOfHeapCommit =val;
|
||||||
|
else
|
||||||
|
pe_data(output_bfd)->pe_opthdr.SizeOfStackCommit =val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *get_name(ptr, dst)
|
||||||
|
char *ptr;
|
||||||
|
char **dst;
|
||||||
|
{
|
||||||
|
while (*ptr == ' ')
|
||||||
|
ptr++;
|
||||||
|
*dst = ptr;
|
||||||
|
while (*ptr && *ptr != ' ')
|
||||||
|
ptr++;
|
||||||
|
*ptr = 0;
|
||||||
|
return ptr+1;
|
||||||
|
}
|
||||||
|
/* Process any magic embedded commands in a section called .drectve */
|
||||||
|
|
||||||
|
int
|
||||||
|
process_embedded_commands (output_bfd, info, abfd)
|
||||||
|
bfd *output_bfd;
|
||||||
|
struct bfd_link_info *info;
|
||||||
|
bfd *abfd;
|
||||||
|
{
|
||||||
|
asection *sec = bfd_get_section_by_name (abfd, ".drectve");
|
||||||
|
char *s;
|
||||||
|
char *e;
|
||||||
|
char *copy;
|
||||||
|
if (!sec)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
copy = malloc ((size_t) sec->_raw_size);
|
||||||
|
if (!copy)
|
||||||
|
{
|
||||||
|
bfd_set_error (bfd_error_no_memory);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (! bfd_get_section_contents(abfd, sec, copy, 0, sec->_raw_size))
|
||||||
|
{
|
||||||
|
free (copy);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
e = copy + sec->_raw_size;
|
||||||
|
for (s = copy; s < e ; )
|
||||||
|
{
|
||||||
|
if (s[0]!= '-') {
|
||||||
|
s++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (strncmp (s,"-attr", 5) == 0)
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
char *attribs;
|
||||||
|
asection *asec;
|
||||||
|
|
||||||
|
int loop = 1;
|
||||||
|
int had_write = 0;
|
||||||
|
int had_read = 0;
|
||||||
|
int had_exec= 0;
|
||||||
|
int had_shared= 0;
|
||||||
|
s += 5;
|
||||||
|
s = get_name(s, &name);
|
||||||
|
s = get_name(s, &attribs);
|
||||||
|
while (loop) {
|
||||||
|
switch (*attribs++)
|
||||||
|
{
|
||||||
|
case 'W':
|
||||||
|
had_write = 1;
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
had_read = 1;
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
had_shared = 1;
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
had_exec = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
loop = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
asec = bfd_get_section_by_name (abfd, name);
|
||||||
|
if (asec) {
|
||||||
|
if (had_exec)
|
||||||
|
asec->flags |= SEC_CODE;
|
||||||
|
if (!had_write)
|
||||||
|
asec->flags |= SEC_READONLY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strncmp (s,"-heap", 5) == 0)
|
||||||
|
{
|
||||||
|
s = dores_com (s+5, output_bfd, 1);
|
||||||
|
}
|
||||||
|
else if (strncmp (s,"-stack", 6) == 0)
|
||||||
|
{
|
||||||
|
s = dores_com (s+6, output_bfd, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
free (copy);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Link an input file into the linker output file. This function
|
/* Link an input file into the linker output file. This function
|
||||||
handles all the sections and relocations of the input file at once. */
|
handles all the sections and relocations of the input file at once. */
|
||||||
|
|
||||||
@ -1228,7 +1199,7 @@ coff_link_input_bfd (finfo, input_bfd)
|
|||||||
struct internal_syment *isymp;
|
struct internal_syment *isymp;
|
||||||
asection **secpp;
|
asection **secpp;
|
||||||
long *indexp;
|
long *indexp;
|
||||||
long output_index;
|
unsigned long output_index;
|
||||||
bfd_byte *outsym;
|
bfd_byte *outsym;
|
||||||
struct coff_link_hash_entry **sym_hash;
|
struct coff_link_hash_entry **sym_hash;
|
||||||
asection *o;
|
asection *o;
|
||||||
@ -1269,9 +1240,9 @@ coff_link_input_bfd (finfo, input_bfd)
|
|||||||
output_index = syment_base;
|
output_index = syment_base;
|
||||||
outsym = finfo->outsyms;
|
outsym = finfo->outsyms;
|
||||||
|
|
||||||
if (obj_pe (output_bfd))
|
if (coff_data(output_bfd)->pe)
|
||||||
{
|
{
|
||||||
if (!process_embedded_commands (finfo->info, input_bfd))
|
if (!process_embedded_commands (output_bfd, finfo->info, input_bfd))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1408,11 +1379,11 @@ coff_link_input_bfd (finfo, input_bfd)
|
|||||||
if (isym.n_sclass == C_FILE)
|
if (isym.n_sclass == C_FILE)
|
||||||
{
|
{
|
||||||
if (finfo->last_file_index != -1
|
if (finfo->last_file_index != -1
|
||||||
&& finfo->last_file.n_value != output_index)
|
&& finfo->last_file.n_value != (long) output_index)
|
||||||
{
|
{
|
||||||
/* We must correct the value of the last C_FILE entry. */
|
/* We must correct the value of the last C_FILE entry. */
|
||||||
finfo->last_file.n_value = output_index;
|
finfo->last_file.n_value = output_index;
|
||||||
if (finfo->last_file_index >= syment_base)
|
if ((bfd_size_type) finfo->last_file_index >= syment_base)
|
||||||
{
|
{
|
||||||
/* The last C_FILE symbol is in this input file. */
|
/* The last C_FILE symbol is in this input file. */
|
||||||
bfd_coff_swap_sym_out (output_bfd,
|
bfd_coff_swap_sym_out (output_bfd,
|
||||||
@ -1559,7 +1530,7 @@ coff_link_input_bfd (finfo, input_bfd)
|
|||||||
}
|
}
|
||||||
else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
|
else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
|
||||||
{
|
{
|
||||||
long indx;
|
unsigned long indx;
|
||||||
|
|
||||||
if (ISFCN (isymp->n_type)
|
if (ISFCN (isymp->n_type)
|
||||||
|| ISTAG (isymp->n_sclass)
|
|| ISTAG (isymp->n_sclass)
|
||||||
@ -1587,11 +1558,13 @@ coff_link_input_bfd (finfo, input_bfd)
|
|||||||
indx = auxp->x_sym.x_tagndx.l;
|
indx = auxp->x_sym.x_tagndx.l;
|
||||||
if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
|
if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
|
||||||
{
|
{
|
||||||
indx = finfo->sym_indices[indx];
|
long symindx;
|
||||||
if (indx < 0)
|
|
||||||
|
symindx = finfo->sym_indices[indx];
|
||||||
|
if (symindx < 0)
|
||||||
auxp->x_sym.x_tagndx.l = 0;
|
auxp->x_sym.x_tagndx.l = 0;
|
||||||
else
|
else
|
||||||
auxp->x_sym.x_tagndx.l = indx;
|
auxp->x_sym.x_tagndx.l = symindx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1652,7 +1625,7 @@ coff_link_input_bfd (finfo, input_bfd)
|
|||||||
if (iline.l_lnno != 0)
|
if (iline.l_lnno != 0)
|
||||||
iline.l_addr.l_paddr += offset;
|
iline.l_addr.l_paddr += offset;
|
||||||
else if (iline.l_addr.l_symndx >= 0
|
else if (iline.l_addr.l_symndx >= 0
|
||||||
&& (iline.l_addr.l_symndx
|
&& ((unsigned long) iline.l_addr.l_symndx
|
||||||
< obj_raw_syment_count (input_bfd)))
|
< obj_raw_syment_count (input_bfd)))
|
||||||
{
|
{
|
||||||
long indx;
|
long indx;
|
||||||
@ -1730,7 +1703,7 @@ coff_link_input_bfd (finfo, input_bfd)
|
|||||||
normal case, this will save us from writing out the C_FILE symbol
|
normal case, this will save us from writing out the C_FILE symbol
|
||||||
again. */
|
again. */
|
||||||
if (finfo->last_file_index != -1
|
if (finfo->last_file_index != -1
|
||||||
&& finfo->last_file_index >= syment_base)
|
&& (bfd_size_type) finfo->last_file_index >= syment_base)
|
||||||
{
|
{
|
||||||
finfo->last_file.n_value = output_index;
|
finfo->last_file.n_value = output_index;
|
||||||
bfd_coff_swap_sym_out (output_bfd, (PTR) &finfo->last_file,
|
bfd_coff_swap_sym_out (output_bfd, (PTR) &finfo->last_file,
|
||||||
@ -1745,8 +1718,9 @@ coff_link_input_bfd (finfo, input_bfd)
|
|||||||
if (bfd_seek (output_bfd,
|
if (bfd_seek (output_bfd,
|
||||||
obj_sym_filepos (output_bfd) + syment_base * osymesz,
|
obj_sym_filepos (output_bfd) + syment_base * osymesz,
|
||||||
SEEK_SET) != 0
|
SEEK_SET) != 0
|
||||||
|| bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1,
|
|| (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1,
|
||||||
output_bfd) != outsym - finfo->outsyms)
|
output_bfd)
|
||||||
|
!= (bfd_size_type) (outsym - finfo->outsyms)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
BFD_ASSERT ((obj_raw_syment_count (output_bfd)
|
BFD_ASSERT ((obj_raw_syment_count (output_bfd)
|
||||||
@ -2282,8 +2256,7 @@ _bfd_coff_generic_relocate_section (output_bfd, info, input_bfd,
|
|||||||
/* So if this is non pcrelative, and is referenced
|
/* So if this is non pcrelative, and is referenced
|
||||||
to a section or a common symbol, then it needs a reloc */
|
to a section or a common symbol, then it needs a reloc */
|
||||||
if (!howto->pc_relative
|
if (!howto->pc_relative
|
||||||
&& (sym->n_scnum
|
&& sym && (sym->n_scnum || sym->n_value))
|
||||||
|| sym->n_value))
|
|
||||||
{
|
{
|
||||||
/* relocation to a symbol in a section which
|
/* relocation to a symbol in a section which
|
||||||
isn't absolute - we output the address here
|
isn't absolute - we output the address here
|
||||||
@ -2291,6 +2264,8 @@ _bfd_coff_generic_relocate_section (output_bfd, info, input_bfd,
|
|||||||
bfd_vma addr = rel->r_vaddr
|
bfd_vma addr = rel->r_vaddr
|
||||||
+ input_section->output_offset
|
+ input_section->output_offset
|
||||||
+ input_section->output_section->vma;
|
+ input_section->output_section->vma;
|
||||||
|
if (coff_data(output_bfd)->pe)
|
||||||
|
addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
|
||||||
fwrite (&addr, 1,4, (FILE *) info->base_file);
|
fwrite (&addr, 1,4, (FILE *) info->base_file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
77
bfd/cpu-arc.c
Normal file
77
bfd/cpu-arc.c
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/* BFD support for the ARC processor
|
||||||
|
Copyright 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
Contributed by Doug Evans (dje@cygnus.com).
|
||||||
|
|
||||||
|
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 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. */
|
||||||
|
|
||||||
|
#include "bfd.h"
|
||||||
|
#include "sysdep.h"
|
||||||
|
#include "libbfd.h"
|
||||||
|
|
||||||
|
#define ARC(mach, print_name, default_p) \
|
||||||
|
{ \
|
||||||
|
32, /* 32 bits in a word */ \
|
||||||
|
32, /* 32 bits in an address */ \
|
||||||
|
8, /* 8 bits in a byte */ \
|
||||||
|
bfd_arch_arc, \
|
||||||
|
mach, \
|
||||||
|
"arc", \
|
||||||
|
print_name, \
|
||||||
|
4, /* section alignment power */ \
|
||||||
|
default_p, \
|
||||||
|
bfd_default_compatible, \
|
||||||
|
bfd_default_scan, \
|
||||||
|
0, \
|
||||||
|
}
|
||||||
|
|
||||||
|
static bfd_arch_info_type arch_info_struct[] =
|
||||||
|
{
|
||||||
|
ARC (bfd_mach_arc_base, "arc-base", true),
|
||||||
|
ARC (bfd_mach_arc_host, "arc-host", false),
|
||||||
|
ARC (bfd_mach_arc_graphics, "arc-graphics", false),
|
||||||
|
ARC (bfd_mach_arc_audio, "arc-audio", false),
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
bfd_arc_arch ()
|
||||||
|
{
|
||||||
|
register unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof (arch_info_struct) / sizeof (arch_info_struct[0]); i++)
|
||||||
|
bfd_arch_linkin (&arch_info_struct[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Utility routines. */
|
||||||
|
|
||||||
|
/* Given cpu type NAME, return its bfd_mach_arc_xxx value.
|
||||||
|
NAME is one of "base, audio, etc.".
|
||||||
|
Returns -1 if not found. */
|
||||||
|
|
||||||
|
int
|
||||||
|
arc_get_mach (name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
register unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof (arch_info_struct) / sizeof (arch_info_struct[0]); i++)
|
||||||
|
{
|
||||||
|
/* +4: skip over "arc-" */
|
||||||
|
if (strcmp (name, arch_info_struct[i].printable_name + 4) == 0)
|
||||||
|
return arch_info_struct[i].mach;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/* BFD library support routines for the i960 architecture.
|
/* BFD library support routines for the i960 architecture.
|
||||||
Copyright (C) 1990-1991 Free Software Foundation, Inc.
|
Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
|
||||||
Hacked by Steve Chamberlain of Cygnus Support.
|
Hacked by Steve Chamberlain of Cygnus Support.
|
||||||
|
|
||||||
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
||||||
@ -16,11 +16,11 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
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 <sysdep.h>
|
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
|
#include "sysdep.h"
|
||||||
#include "libbfd.h"
|
#include "libbfd.h"
|
||||||
|
|
||||||
|
|
||||||
@ -29,15 +29,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
info_struct pointer */
|
info_struct pointer */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
DEFUN(scan_960_mach, (ap, string),
|
scan_960_mach (ap, string)
|
||||||
CONST bfd_arch_info_struct_type *ap AND
|
CONST bfd_arch_info_type *ap;
|
||||||
CONST char *string)
|
CONST char *string;
|
||||||
{
|
{
|
||||||
unsigned long machine;
|
unsigned long machine;
|
||||||
|
|
||||||
/* Look for the string i960, or somesuch at the front of the string */
|
/* Look for the string i960, or somesuch at the front of the string */
|
||||||
|
|
||||||
if (strncmp("i960",string) == 0) {
|
if (strncmp("i960",string,4) == 0) {
|
||||||
string+=4;
|
string+=4;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -75,6 +75,10 @@ DEFUN(scan_960_mach, (ap, string),
|
|||||||
machine = bfd_mach_i960_ka_sa;
|
machine = bfd_mach_i960_ka_sa;
|
||||||
else if (string[0] == 's' && string[1] == 'a')
|
else if (string[0] == 's' && string[1] == 'a')
|
||||||
machine = bfd_mach_i960_ka_sa;
|
machine = bfd_mach_i960_ka_sa;
|
||||||
|
/* start-sanitize-i960xl */
|
||||||
|
else if (string[0] == 'x' && string[1] == 'l')
|
||||||
|
machine = bfd_mach_i960_xl;
|
||||||
|
/* end-sanitize-i960xl */
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
if (machine == ap->mach) return true;
|
if (machine == ap->mach) return true;
|
||||||
@ -87,15 +91,18 @@ DEFUN(scan_960_mach, (ap, string),
|
|||||||
machine which would be compatible with both and returns a pointer
|
machine which would be compatible with both and returns a pointer
|
||||||
to its info structure */
|
to its info structure */
|
||||||
|
|
||||||
CONST bfd_arch_info_struct_type *
|
static CONST bfd_arch_info_type *
|
||||||
DEFUN(compatible,(a,b),
|
compatible (a,b)
|
||||||
CONST bfd_arch_info_struct_type *a AND
|
CONST bfd_arch_info_type *a;
|
||||||
CONST bfd_arch_info_struct_type *b)
|
CONST bfd_arch_info_type *b;
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The i960 has two distinct subspecies which may not interbreed:
|
/* The i960 has distinct subspecies which may not interbreed:
|
||||||
CORE CA
|
CORE CA
|
||||||
CORE KA KB MC XA
|
CORE KA KB MC XA
|
||||||
|
start-sanitize-i960xl
|
||||||
|
CORE XL
|
||||||
|
end-sanitize-i960xl
|
||||||
Any architecture on the same line is compatible, the one on
|
Any architecture on the same line is compatible, the one on
|
||||||
the right is the least restrictive.
|
the right is the least restrictive.
|
||||||
|
|
||||||
@ -108,23 +115,33 @@ DEFUN(compatible,(a,b),
|
|||||||
#define MC bfd_mach_i960_mc /*4*/
|
#define MC bfd_mach_i960_mc /*4*/
|
||||||
#define XA bfd_mach_i960_xa /*5*/
|
#define XA bfd_mach_i960_xa /*5*/
|
||||||
#define CA bfd_mach_i960_ca /*6*/
|
#define CA bfd_mach_i960_ca /*6*/
|
||||||
|
#define MAX_ARCH ((int)CA)
|
||||||
|
|
||||||
|
/* start-sanitize-i960xl */
|
||||||
|
#define XL bfd_mach_i960_xl /*7*/
|
||||||
|
#undef MAX_ARCH
|
||||||
|
#define MAX_ARCH ((int)XL)
|
||||||
|
/* end-sanitize-i960xl */
|
||||||
|
|
||||||
|
|
||||||
static CONST char matrix[7][7] =
|
static CONST unsigned long matrix[MAX_ARCH+1][MAX_ARCH+1] =
|
||||||
{
|
{
|
||||||
ERROR,CORE, KA, KB, MC, XA, CA,
|
{ ERROR, CORE, KA, KB, MC, XA, CA },
|
||||||
CORE, CORE, KA, KB, MC, XA, CA,
|
{ CORE, CORE, KA, KB, MC, XA, CA },
|
||||||
KA, KA, KA, KB, MC, XA, ERROR,
|
{ KA, KA, KA, KB, MC, XA, ERROR },
|
||||||
KB, KB, KB, KB, MC, XA, ERROR,
|
{ KB, KB, KB, KB, MC, XA, ERROR },
|
||||||
MC, MC, MC, MC, MC, XA, ERROR,
|
{ MC, MC, MC, MC, MC, XA, ERROR },
|
||||||
XA, XA, XA, XA, XA, XA, ERROR,
|
{ XA, XA, XA, XA, XA, XA, ERROR },
|
||||||
CA, CA, ERROR, ERROR, ERROR, ERROR, CA
|
{ CA, CA, ERROR, ERROR, ERROR, ERROR, CA },
|
||||||
};
|
/* start-sanitize-i960xl */
|
||||||
|
{ XL, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, XL },
|
||||||
|
/* end-sanitize-i960xl */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
if (a->arch != b->arch || matrix[a->mach][b->mach] == ERROR)
|
if (a->arch != b->arch || matrix[a->mach][b->mach] == ERROR)
|
||||||
{
|
{
|
||||||
return (bfd_arch_info_struct_type *)NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -136,23 +153,27 @@ DEFUN(compatible,(a,b),
|
|||||||
|
|
||||||
int bfd_default_scan_num_mach();
|
int bfd_default_scan_num_mach();
|
||||||
#define N(a,b,d) \
|
#define N(a,b,d) \
|
||||||
{ 32, 32, 8,bfd_arch_i960,a,"i960",b,d,compatible,scan_960_mach,0,}
|
{ 32, 32, 8,bfd_arch_i960,a,"i960",b,3,d,compatible,scan_960_mach,0,}
|
||||||
|
|
||||||
static bfd_arch_info_struct_type arch_info_struct[] =
|
static bfd_arch_info_type arch_info_struct[] =
|
||||||
{
|
{
|
||||||
N(bfd_mach_i960_core,"i960:core",true),
|
N(bfd_mach_i960_core, "i960:core", true),
|
||||||
N(bfd_mach_i960_ka_sa,"i960:ka_sa",false),
|
N(bfd_mach_i960_ka_sa,"i960:ka_sa",false),
|
||||||
N(bfd_mach_i960_kb_sb,"i960:kb_sb",false),
|
N(bfd_mach_i960_kb_sb,"i960:kb_sb",false),
|
||||||
N(bfd_mach_i960_mc,"i960:mc",false),
|
N(bfd_mach_i960_mc, "i960:mc", false),
|
||||||
N(bfd_mach_i960_xa,"i960:xa",false),
|
N(bfd_mach_i960_xa, "i960:xa", false),
|
||||||
N(bfd_mach_i960_ca,"i960:ca",false)
|
N(bfd_mach_i960_ca, "i960:ca", false),
|
||||||
};
|
/* start-sanitize-i960xl */
|
||||||
|
N(bfd_mach_i960_xl, "i960:xl", false),
|
||||||
|
/* end-sanitize-i960xl */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
void DEFUN_VOID(bfd_i960_arch)
|
void
|
||||||
|
bfd_i960_arch ()
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < sizeof(arch_info_struct)/sizeof (*arch_info_struct); i++) {
|
||||||
bfd_arch_linkin(arch_info_struct + i);
|
bfd_arch_linkin(arch_info_struct + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
92
bfd/cpu-mips.c
Normal file
92
bfd/cpu-mips.c
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/* bfd back-end for mips support
|
||||||
|
Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
|
||||||
|
Written by Steve Chamberlain of Cygnus Support.
|
||||||
|
|
||||||
|
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 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. */
|
||||||
|
|
||||||
|
#include "bfd.h"
|
||||||
|
#include "sysdep.h"
|
||||||
|
#include "libbfd.h"
|
||||||
|
|
||||||
|
static bfd_arch_info_type arch_info_struct[] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
32, /* 32 bits in a word */
|
||||||
|
32, /* 32 bits in an address */
|
||||||
|
8, /* 8 bits in a byte */
|
||||||
|
bfd_arch_mips,
|
||||||
|
3000,
|
||||||
|
"mips",
|
||||||
|
"mips:3000",
|
||||||
|
3,
|
||||||
|
true,
|
||||||
|
bfd_default_compatible,
|
||||||
|
bfd_default_scan,
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
32, /* 32 bits in a word */
|
||||||
|
32, /* 32 bits in an address */
|
||||||
|
8, /* 8 bits in a byte */
|
||||||
|
bfd_arch_mips,
|
||||||
|
6000,
|
||||||
|
"mips",
|
||||||
|
"mips:6000",
|
||||||
|
3,
|
||||||
|
false,
|
||||||
|
bfd_default_compatible,
|
||||||
|
bfd_default_scan,
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
64, /* 64 bits in a word */
|
||||||
|
64, /* 64 bits in an address */
|
||||||
|
8, /* 8 bits in a byte */
|
||||||
|
bfd_arch_mips,
|
||||||
|
4000,
|
||||||
|
"mips",
|
||||||
|
"mips:4000",
|
||||||
|
3,
|
||||||
|
false,
|
||||||
|
bfd_default_compatible,
|
||||||
|
bfd_default_scan ,
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
64, /* 64 bits in a word */
|
||||||
|
64, /* 64 bits in an address */
|
||||||
|
8, /* 8 bits in a byte */
|
||||||
|
bfd_arch_mips,
|
||||||
|
8000,
|
||||||
|
"mips",
|
||||||
|
"mips:8000",
|
||||||
|
3,
|
||||||
|
false,
|
||||||
|
bfd_default_compatible,
|
||||||
|
bfd_default_scan ,
|
||||||
|
0,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
bfd_mips_arch ()
|
||||||
|
{
|
||||||
|
register unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof (arch_info_struct) / sizeof (*arch_info_struct); i++)
|
||||||
|
bfd_arch_linkin(&arch_info_struct[i]);
|
||||||
|
}
|
38
bfd/ecoff.c
38
bfd/ecoff.c
@ -579,8 +579,8 @@ _bfd_ecoff_slurp_symbolic_info (abfd, ignore, debug)
|
|||||||
debug->off2 = (type) NULL; \
|
debug->off2 = (type) NULL; \
|
||||||
else \
|
else \
|
||||||
debug->off2 = (type) ((char *) raw \
|
debug->off2 = (type) ((char *) raw \
|
||||||
+ internal_symhdr->off1 \
|
+ (internal_symhdr->off1 \
|
||||||
- raw_base)
|
- raw_base))
|
||||||
FIX (cbLineOffset, line, unsigned char *);
|
FIX (cbLineOffset, line, unsigned char *);
|
||||||
FIX (cbDnOffset, external_dnr, PTR);
|
FIX (cbDnOffset, external_dnr, PTR);
|
||||||
FIX (cbPdOffset, external_pdr, PTR);
|
FIX (cbPdOffset, external_pdr, PTR);
|
||||||
@ -1181,7 +1181,7 @@ ecoff_type_to_string (abfd, fdr, indx)
|
|||||||
qualifiers[i].stride = 0;
|
qualifiers[i].stride = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == -1)
|
if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == (bfd_vma) -1)
|
||||||
return "-1 (no type)";
|
return "-1 (no type)";
|
||||||
_bfd_ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti);
|
_bfd_ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti);
|
||||||
|
|
||||||
@ -2437,7 +2437,7 @@ _bfd_ecoff_write_object_contents (abfd)
|
|||||||
siz = filhsz;
|
siz = filhsz;
|
||||||
if (siz < aoutsz)
|
if (siz < aoutsz)
|
||||||
siz = aoutsz;
|
siz = aoutsz;
|
||||||
buff = (PTR) malloc (siz);
|
buff = (PTR) malloc ((size_t) siz);
|
||||||
if (buff == NULL)
|
if (buff == NULL)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
@ -3313,12 +3313,12 @@ _bfd_ecoff_bfd_link_hash_table_create (abfd)
|
|||||||
struct ecoff_link_hash_table *ret;
|
struct ecoff_link_hash_table *ret;
|
||||||
|
|
||||||
ret = ((struct ecoff_link_hash_table *)
|
ret = ((struct ecoff_link_hash_table *)
|
||||||
malloc (sizeof (struct ecoff_link_hash_table)));
|
bfd_alloc (abfd, sizeof (struct ecoff_link_hash_table)));
|
||||||
if (!ret)
|
if (ret == NULL)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (! _bfd_link_hash_table_init (&ret->root, abfd,
|
if (! _bfd_link_hash_table_init (&ret->root, abfd,
|
||||||
ecoff_link_hash_newfunc))
|
ecoff_link_hash_newfunc))
|
||||||
{
|
{
|
||||||
@ -3574,7 +3574,8 @@ ecoff_link_check_archive_element (abfd, info, pneeded)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
|
if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
|
||||||
|| bfd_read (ssext, 1, symhdr->issExtMax, abfd) != symhdr->issExtMax)
|
|| (bfd_read (ssext, 1, symhdr->issExtMax, abfd) !=
|
||||||
|
(bfd_size_type) symhdr->issExtMax))
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
/* Look through the external symbols to see if they define some
|
/* Look through the external symbols to see if they define some
|
||||||
@ -3698,7 +3699,8 @@ ecoff_link_add_object_symbols (abfd, info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
|
if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
|
||||||
|| bfd_read (ssext, 1, symhdr->issExtMax, abfd) != symhdr->issExtMax)
|
|| (bfd_read (ssext, 1, symhdr->issExtMax, abfd)
|
||||||
|
!= (bfd_size_type) symhdr->issExtMax))
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
|
result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
|
||||||
@ -4161,7 +4163,7 @@ ecoff_final_link_debug_accumulate (output_bfd, input_bfd, info, handle)
|
|||||||
debug->ptr = NULL; \
|
debug->ptr = NULL; \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
debug->ptr = (type) malloc (size * symhdr->count); \
|
debug->ptr = (type) malloc ((size_t) (size * symhdr->count)); \
|
||||||
if (debug->ptr == NULL) \
|
if (debug->ptr == NULL) \
|
||||||
{ \
|
{ \
|
||||||
bfd_set_error (bfd_error_no_memory); \
|
bfd_set_error (bfd_error_no_memory); \
|
||||||
@ -4404,8 +4406,8 @@ ecoff_indirect_link_order (output_bfd, info, output_section, link_order)
|
|||||||
/* Get the section contents. We allocate memory for the larger of
|
/* Get the section contents. We allocate memory for the larger of
|
||||||
the size before relocating and the size after relocating. */
|
the size before relocating and the size after relocating. */
|
||||||
contents = (bfd_byte *) malloc (raw_size >= cooked_size
|
contents = (bfd_byte *) malloc (raw_size >= cooked_size
|
||||||
? raw_size
|
? (size_t) raw_size
|
||||||
: cooked_size);
|
: (size_t) cooked_size);
|
||||||
if (contents == NULL && raw_size != 0)
|
if (contents == NULL && raw_size != 0)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
@ -4417,7 +4419,7 @@ ecoff_indirect_link_order (output_bfd, info, output_section, link_order)
|
|||||||
simply reuse the old buffer in case cooked_size > raw_size. */
|
simply reuse the old buffer in case cooked_size > raw_size. */
|
||||||
if (section_tdata != (struct ecoff_section_tdata *) NULL
|
if (section_tdata != (struct ecoff_section_tdata *) NULL
|
||||||
&& section_tdata->contents != (bfd_byte *) NULL)
|
&& section_tdata->contents != (bfd_byte *) NULL)
|
||||||
memcpy (contents, section_tdata->contents, raw_size);
|
memcpy (contents, section_tdata->contents, (size_t) raw_size);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (! bfd_get_section_contents (input_bfd, input_section,
|
if (! bfd_get_section_contents (input_bfd, input_section,
|
||||||
@ -4435,7 +4437,7 @@ ecoff_indirect_link_order (output_bfd, info, output_section, link_order)
|
|||||||
external_relocs = section_tdata->external_relocs;
|
external_relocs = section_tdata->external_relocs;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
external_relocs = (PTR) malloc (external_relocs_size);
|
external_relocs = (PTR) malloc ((size_t) external_relocs_size);
|
||||||
if (external_relocs == NULL && external_relocs_size != 0)
|
if (external_relocs == NULL && external_relocs_size != 0)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
@ -4651,7 +4653,7 @@ ecoff_reloc_link_order (output_bfd, info, output_section, link_order)
|
|||||||
|
|
||||||
/* Get some memory and swap out the reloc. */
|
/* Get some memory and swap out the reloc. */
|
||||||
external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
|
external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
|
||||||
rbuf = (bfd_byte *) malloc (external_reloc_size);
|
rbuf = (bfd_byte *) malloc ((size_t) external_reloc_size);
|
||||||
if (rbuf == (bfd_byte *) NULL)
|
if (rbuf == (bfd_byte *) NULL)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
|
91
bfd/elf.c
91
bfd/elf.c
@ -77,7 +77,7 @@ static char *
|
|||||||
elf_read (abfd, offset, size)
|
elf_read (abfd, offset, size)
|
||||||
bfd * abfd;
|
bfd * abfd;
|
||||||
long offset;
|
long offset;
|
||||||
int size;
|
unsigned int size;
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
||||||
@ -609,8 +609,40 @@ bfd_section_from_shdr (abfd, shindex)
|
|||||||
Elf_Internal_Shdr *hdr2;
|
Elf_Internal_Shdr *hdr2;
|
||||||
int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
|
int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
|
||||||
|
|
||||||
|
/* For some incomprehensible reason Oracle distributes
|
||||||
|
libraries for Solaris in which some of the objects have
|
||||||
|
bogus sh_link fields. It would be nice if we could just
|
||||||
|
reject them, but, unfortunately, some people need to use
|
||||||
|
them. We scan through the section headers; if we find only
|
||||||
|
one suitable symbol table, we clobber the sh_link to point
|
||||||
|
to it. I hope this doesn't break anything. */
|
||||||
|
if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_SYMTAB
|
||||||
|
&& elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_DYNSYM)
|
||||||
|
{
|
||||||
|
int scan;
|
||||||
|
int found;
|
||||||
|
|
||||||
|
found = 0;
|
||||||
|
for (scan = 1; scan < ehdr->e_shnum; scan++)
|
||||||
|
{
|
||||||
|
if (elf_elfsections (abfd)[scan]->sh_type == SHT_SYMTAB
|
||||||
|
|| elf_elfsections (abfd)[scan]->sh_type == SHT_DYNSYM)
|
||||||
|
{
|
||||||
|
if (found != 0)
|
||||||
|
{
|
||||||
|
found = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
found = scan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found != 0)
|
||||||
|
hdr->sh_link = found;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the symbol table. */
|
/* Get the symbol table. */
|
||||||
if (! bfd_section_from_shdr (abfd, hdr->sh_link))
|
if (elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB
|
||||||
|
&& ! bfd_section_from_shdr (abfd, hdr->sh_link))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* If this reloc section does not use the main symbol table we
|
/* If this reloc section does not use the main symbol table we
|
||||||
@ -757,6 +789,7 @@ bfd_section_from_phdr (abfd, hdr, index)
|
|||||||
if (newsect == NULL)
|
if (newsect == NULL)
|
||||||
return false;
|
return false;
|
||||||
newsect->vma = hdr->p_vaddr;
|
newsect->vma = hdr->p_vaddr;
|
||||||
|
newsect->lma = hdr->p_paddr;
|
||||||
newsect->_raw_size = hdr->p_filesz;
|
newsect->_raw_size = hdr->p_filesz;
|
||||||
newsect->filepos = hdr->p_offset;
|
newsect->filepos = hdr->p_offset;
|
||||||
newsect->flags |= SEC_HAS_CONTENTS;
|
newsect->flags |= SEC_HAS_CONTENTS;
|
||||||
@ -790,6 +823,7 @@ bfd_section_from_phdr (abfd, hdr, index)
|
|||||||
if (newsect == NULL)
|
if (newsect == NULL)
|
||||||
return false;
|
return false;
|
||||||
newsect->vma = hdr->p_vaddr + hdr->p_filesz;
|
newsect->vma = hdr->p_vaddr + hdr->p_filesz;
|
||||||
|
newsect->lma = hdr->p_paddr + hdr->p_filesz;
|
||||||
newsect->_raw_size = hdr->p_memsz - hdr->p_filesz;
|
newsect->_raw_size = hdr->p_memsz - hdr->p_filesz;
|
||||||
if (hdr->p_type == PT_LOAD)
|
if (hdr->p_type == PT_LOAD)
|
||||||
{
|
{
|
||||||
@ -836,10 +870,22 @@ elf_fake_sections (abfd, asect, failedptrarg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
this_hdr->sh_flags = 0;
|
this_hdr->sh_flags = 0;
|
||||||
|
|
||||||
|
/* FIXME: This should really use vma, rather than lma. However,
|
||||||
|
that would mean that the lma information was lost, which would
|
||||||
|
mean that the AT keyword in linker scripts would not work.
|
||||||
|
Fortunately, native scripts do not use the AT keyword, so we can
|
||||||
|
get away with using lma here. The right way to handle this is to
|
||||||
|
1) read the program headers as well as the section headers, and
|
||||||
|
set the lma fields of the BFD sections based on the p_paddr
|
||||||
|
fields of the program headers, and 2) set the p_paddr fields of
|
||||||
|
the program headers based on the section lma fields when writing
|
||||||
|
them out. */
|
||||||
if ((asect->flags & SEC_ALLOC) != 0)
|
if ((asect->flags & SEC_ALLOC) != 0)
|
||||||
this_hdr->sh_addr = asect->vma;
|
this_hdr->sh_addr = asect->lma;
|
||||||
else
|
else
|
||||||
this_hdr->sh_addr = 0;
|
this_hdr->sh_addr = 0;
|
||||||
|
|
||||||
this_hdr->sh_offset = 0;
|
this_hdr->sh_offset = 0;
|
||||||
this_hdr->sh_size = asect->_raw_size;
|
this_hdr->sh_size = asect->_raw_size;
|
||||||
this_hdr->sh_link = 0;
|
this_hdr->sh_link = 0;
|
||||||
@ -1434,6 +1480,7 @@ get_program_header_size (abfd, sorted_hdrs, count, maxpagesize)
|
|||||||
{
|
{
|
||||||
size_t segs;
|
size_t segs;
|
||||||
asection *s;
|
asection *s;
|
||||||
|
struct elf_backend_data *bed = get_elf_backend_data (abfd);
|
||||||
|
|
||||||
/* We can't return a different result each time we're called. */
|
/* We can't return a different result each time we're called. */
|
||||||
if (elf_tdata (abfd)->program_header_size != 0)
|
if (elf_tdata (abfd)->program_header_size != 0)
|
||||||
@ -1538,7 +1585,12 @@ get_program_header_size (abfd, sorted_hdrs, count, maxpagesize)
|
|||||||
++segs;
|
++segs;
|
||||||
}
|
}
|
||||||
|
|
||||||
elf_tdata (abfd)->program_header_size = segs * get_elf_backend_data (abfd)->s->sizeof_phdr;
|
/* Let the backend count up any program headers it might need. */
|
||||||
|
if (bed->elf_backend_create_program_headers)
|
||||||
|
segs = ((*bed->elf_backend_create_program_headers)
|
||||||
|
(abfd, (Elf_Internal_Phdr *) NULL, segs));
|
||||||
|
|
||||||
|
elf_tdata (abfd)->program_header_size = segs * bed->s->sizeof_phdr;
|
||||||
return elf_tdata (abfd)->program_header_size;
|
return elf_tdata (abfd)->program_header_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1574,7 +1626,10 @@ map_program_segments (abfd, off, first, sorted_hdrs, phdr_size)
|
|||||||
phdr_count = 0;
|
phdr_count = 0;
|
||||||
phdr = phdrs;
|
phdr = phdrs;
|
||||||
|
|
||||||
phdr_size_adjust = 0;
|
if (bed->want_hdr_in_seg)
|
||||||
|
phdr_size_adjust = first->sh_offset - phdr_size;
|
||||||
|
else
|
||||||
|
phdr_size_adjust = 0;
|
||||||
|
|
||||||
/* If we have a loadable .interp section, we must create a PT_INTERP
|
/* If we have a loadable .interp section, we must create a PT_INTERP
|
||||||
segment which must precede all PT_LOAD segments. We assume that
|
segment which must precede all PT_LOAD segments. We assume that
|
||||||
@ -1693,8 +1748,9 @@ map_program_segments (abfd, off, first, sorted_hdrs, phdr_size)
|
|||||||
phdr->p_align = bed->maxpagesize;
|
phdr->p_align = bed->maxpagesize;
|
||||||
|
|
||||||
if (hdr == first
|
if (hdr == first
|
||||||
&& sinterp != NULL
|
&& (bed->want_hdr_in_seg
|
||||||
&& (sinterp->flags & SEC_LOAD) != 0)
|
|| (sinterp != NULL
|
||||||
|
&& (sinterp->flags & SEC_LOAD) != 0)))
|
||||||
{
|
{
|
||||||
phdr->p_offset -= phdr_size + phdr_size_adjust;
|
phdr->p_offset -= phdr_size + phdr_size_adjust;
|
||||||
phdr->p_vaddr -= phdr_size + phdr_size_adjust;
|
phdr->p_vaddr -= phdr_size + phdr_size_adjust;
|
||||||
@ -1732,6 +1788,12 @@ map_program_segments (abfd, off, first, sorted_hdrs, phdr_size)
|
|||||||
++phdr_count;
|
++phdr_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Let the backend create additional program headers. */
|
||||||
|
if (bed->elf_backend_create_program_headers)
|
||||||
|
phdr_count = (*bed->elf_backend_create_program_headers) (abfd,
|
||||||
|
phdrs,
|
||||||
|
phdr_count);
|
||||||
|
|
||||||
/* Make sure the return value from get_program_header_size matches
|
/* Make sure the return value from get_program_header_size matches
|
||||||
what we computed here. Actually, it's OK if we allocated too
|
what we computed here. Actually, it's OK if we allocated too
|
||||||
much space in the program header. */
|
much space in the program header. */
|
||||||
@ -1864,8 +1926,8 @@ assign_file_positions_except_relocs (abfd, dosyms)
|
|||||||
}
|
}
|
||||||
|
|
||||||
memcpy (sorted_hdrs, i_shdrpp + 1, hdrppsize);
|
memcpy (sorted_hdrs, i_shdrpp + 1, hdrppsize);
|
||||||
qsort (sorted_hdrs, i_ehdrp->e_shnum - 1, sizeof (Elf_Internal_Shdr *),
|
qsort (sorted_hdrs, (size_t) i_ehdrp->e_shnum - 1,
|
||||||
elf_sort_hdrs);
|
sizeof (Elf_Internal_Shdr *), elf_sort_hdrs);
|
||||||
|
|
||||||
/* We can't actually create the program header until we have set the
|
/* We can't actually create the program header until we have set the
|
||||||
file positions for the sections, and we can't do that until we know
|
file positions for the sections, and we can't do that until we know
|
||||||
@ -1874,7 +1936,7 @@ assign_file_positions_except_relocs (abfd, dosyms)
|
|||||||
phdr_size = get_program_header_size (abfd,
|
phdr_size = get_program_header_size (abfd,
|
||||||
sorted_hdrs, i_ehdrp->e_shnum - 1,
|
sorted_hdrs, i_ehdrp->e_shnum - 1,
|
||||||
maxpagesize);
|
maxpagesize);
|
||||||
if (phdr_size == (file_ptr) -1)
|
if (phdr_size == (bfd_size_type) -1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Compute the file offsets of each section. */
|
/* Compute the file offsets of each section. */
|
||||||
@ -1900,6 +1962,8 @@ assign_file_positions_except_relocs (abfd, dosyms)
|
|||||||
hdr->sh_offset = -1;
|
hdr->sh_offset = -1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
off = _bfd_elf_assign_file_position_for_section (hdr, off,
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1910,9 +1974,9 @@ assign_file_positions_except_relocs (abfd, dosyms)
|
|||||||
the page size. This is required by the program
|
the page size. This is required by the program
|
||||||
header. */
|
header. */
|
||||||
off += (hdr->sh_addr - off) % maxpagesize;
|
off += (hdr->sh_addr - off) % maxpagesize;
|
||||||
|
off = _bfd_elf_assign_file_position_for_section (hdr, off,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
off = _bfd_elf_assign_file_position_for_section (hdr, off, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the program header. */
|
/* Create the program header. */
|
||||||
@ -1920,7 +1984,8 @@ assign_file_positions_except_relocs (abfd, dosyms)
|
|||||||
phdr_size);
|
phdr_size);
|
||||||
if (phdr_map == (file_ptr) -1)
|
if (phdr_map == (file_ptr) -1)
|
||||||
return false;
|
return false;
|
||||||
BFD_ASSERT ((bfd_size_type) phdr_map <= (bfd_size_type) phdr_off + phdr_size);
|
BFD_ASSERT ((bfd_size_type) phdr_map
|
||||||
|
<= (bfd_size_type) phdr_off + phdr_size);
|
||||||
|
|
||||||
free (sorted_hdrs);
|
free (sorted_hdrs);
|
||||||
}
|
}
|
||||||
|
@ -2808,7 +2808,7 @@ elf_link_input_bfd (finfo, input_bfd)
|
|||||||
+ o->output_section->reloc_count);
|
+ o->output_section->reloc_count);
|
||||||
for (; irela < irelaend; irela++, rel_hash++)
|
for (; irela < irelaend; irela++, rel_hash++)
|
||||||
{
|
{
|
||||||
long r_symndx;
|
unsigned long r_symndx;
|
||||||
Elf_Internal_Sym *isym;
|
Elf_Internal_Sym *isym;
|
||||||
asection *sec;
|
asection *sec;
|
||||||
|
|
||||||
|
@ -217,7 +217,7 @@ linux_link_hash_table_create (abfd)
|
|||||||
struct linux_link_hash_table *ret;
|
struct linux_link_hash_table *ret;
|
||||||
|
|
||||||
ret = ((struct linux_link_hash_table *)
|
ret = ((struct linux_link_hash_table *)
|
||||||
malloc (sizeof (struct linux_link_hash_table)));
|
bfd_alloc (abfd, sizeof (struct linux_link_hash_table)));
|
||||||
if (ret == (struct linux_link_hash_table *) NULL)
|
if (ret == (struct linux_link_hash_table *) NULL)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
@ -586,7 +586,7 @@ bfd_linux_size_dynamic_sections (output_bfd, info)
|
|||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
memset (s->contents, 0, s->_raw_size);
|
memset (s->contents, 0, (size_t) s->_raw_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -607,7 +607,7 @@ linux_finish_dynamic_link (output_bfd, info)
|
|||||||
struct fixup *f;
|
struct fixup *f;
|
||||||
unsigned int new_addr;
|
unsigned int new_addr;
|
||||||
int section_offset;
|
int section_offset;
|
||||||
int fixups_written;
|
unsigned int fixups_written;
|
||||||
|
|
||||||
if (linux_hash_table (info)->dynobj == NULL)
|
if (linux_hash_table (info)->dynobj == NULL)
|
||||||
return true;
|
return true;
|
||||||
|
@ -543,7 +543,8 @@ parse_expression (ieee, value, symbol, pcrel, extra, section)
|
|||||||
#define ieee_seek(abfd, offset) \
|
#define ieee_seek(abfd, offset) \
|
||||||
IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset
|
IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset
|
||||||
|
|
||||||
#define ieee_pos(abfd) IEEE_DATA(abfd)->h.input_p -IEEE_DATA(abfd)->h.first_byte
|
#define ieee_pos(abfd) \
|
||||||
|
(IEEE_DATA(abfd)->h.input_p - IEEE_DATA(abfd)->h.first_byte)
|
||||||
|
|
||||||
static unsigned int last_index;
|
static unsigned int last_index;
|
||||||
static char last_type; /* is the index for an X or a D */
|
static char last_type; /* is the index for an X or a D */
|
||||||
@ -1133,7 +1134,7 @@ ieee_archive_p (abfd)
|
|||||||
|
|
||||||
/* Make sure that we don't go over the end of the buffer */
|
/* Make sure that we don't go over the end of the buffer */
|
||||||
|
|
||||||
if (ieee_pos (abfd) > sizeof (buffer) / 2)
|
if ((size_t) ieee_pos (abfd) > sizeof (buffer) / 2)
|
||||||
{
|
{
|
||||||
/* Past half way, reseek and reprime */
|
/* Past half way, reseek and reprime */
|
||||||
buffer_offset += ieee_pos (abfd);
|
buffer_offset += ieee_pos (abfd);
|
||||||
@ -1936,7 +1937,7 @@ do_with_relocs (abfd, s)
|
|||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
memset ((PTR) stream, 0, s->_raw_size);
|
memset ((PTR) stream, 0, (size_t) s->_raw_size);
|
||||||
}
|
}
|
||||||
while (current_byte_index < s->_raw_size)
|
while (current_byte_index < s->_raw_size)
|
||||||
{
|
{
|
||||||
@ -2116,7 +2117,7 @@ flush ()
|
|||||||
{
|
{
|
||||||
if (bfd_write ((PTR) (output_ptr_start), 1, output_ptr - output_ptr_start,
|
if (bfd_write ((PTR) (output_ptr_start), 1, output_ptr - output_ptr_start,
|
||||||
output_bfd)
|
output_bfd)
|
||||||
!= output_ptr - output_ptr_start)
|
!= (bfd_size_type) (output_ptr - output_ptr_start))
|
||||||
abort ();
|
abort ();
|
||||||
output_ptr = output_ptr_start;
|
output_ptr = output_ptr_start;
|
||||||
output_buffer++;
|
output_buffer++;
|
||||||
|
@ -94,7 +94,7 @@ typedef struct ecoff_tdata
|
|||||||
/* The maximum size of objects to optimize using gp. This is
|
/* The maximum size of objects to optimize using gp. This is
|
||||||
typically set by the -G option to the compiler, assembler or
|
typically set by the -G option to the compiler, assembler or
|
||||||
linker. */
|
linker. */
|
||||||
int gp_size;
|
unsigned int gp_size;
|
||||||
|
|
||||||
/* The register masks. When linking, all the masks found in the
|
/* The register masks. When linking, all the masks found in the
|
||||||
input files are combined into the masks of the output file.
|
input files are combined into the masks of the output file.
|
||||||
@ -253,7 +253,7 @@ extern boolean _bfd_ecoff_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *));
|
|||||||
_bfd_generic_bfd_copy_private_symbol_data
|
_bfd_generic_bfd_copy_private_symbol_data
|
||||||
|
|
||||||
#define _bfd_ecoff_bfd_print_private_bfd_data \
|
#define _bfd_ecoff_bfd_print_private_bfd_data \
|
||||||
_bfd_generic_bfd_pritn_private_bfd_data
|
_bfd_generic_bfd_print_private_bfd_data
|
||||||
|
|
||||||
#define _bfd_ecoff_bfd_merge_private_bfd_data \
|
#define _bfd_ecoff_bfd_merge_private_bfd_data \
|
||||||
_bfd_generic_bfd_merge_private_bfd_data
|
_bfd_generic_bfd_merge_private_bfd_data
|
||||||
|
@ -249,7 +249,7 @@ struct elf_backend_data
|
|||||||
entire ELF symbol table. */
|
entire ELF symbol table. */
|
||||||
boolean (*elf_backend_symbol_table_processing) PARAMS ((bfd *,
|
boolean (*elf_backend_symbol_table_processing) PARAMS ((bfd *,
|
||||||
elf_symbol_type *,
|
elf_symbol_type *,
|
||||||
int));
|
unsigned int));
|
||||||
|
|
||||||
/* A function to do additional processing on the ELF section header
|
/* A function to do additional processing on the ELF section header
|
||||||
just before writing it out. This is used to set the flags and
|
just before writing it out. This is used to set the flags and
|
||||||
@ -488,12 +488,13 @@ struct elf_obj_tdata
|
|||||||
Elf_Internal_Shdr strtab_hdr;
|
Elf_Internal_Shdr strtab_hdr;
|
||||||
Elf_Internal_Shdr dynsymtab_hdr;
|
Elf_Internal_Shdr dynsymtab_hdr;
|
||||||
Elf_Internal_Shdr dynstrtab_hdr;
|
Elf_Internal_Shdr dynstrtab_hdr;
|
||||||
int symtab_section, shstrtab_section, strtab_section, dynsymtab_section;
|
unsigned int symtab_section, shstrtab_section;
|
||||||
|
unsigned int strtab_section, dynsymtab_section;
|
||||||
file_ptr next_file_pos;
|
file_ptr next_file_pos;
|
||||||
void *prstatus; /* The raw /proc prstatus structure */
|
void *prstatus; /* The raw /proc prstatus structure */
|
||||||
void *prpsinfo; /* The raw /proc prpsinfo structure */
|
void *prpsinfo; /* The raw /proc prpsinfo structure */
|
||||||
bfd_vma gp; /* The gp value (MIPS only, for now) */
|
bfd_vma gp; /* The gp value (MIPS only, for now) */
|
||||||
int gp_size; /* The gp size (MIPS only, for now) */
|
unsigned int gp_size; /* The gp size (MIPS only, for now) */
|
||||||
|
|
||||||
/* This is set to true if the object was created by the backend
|
/* This is set to true if the object was created by the backend
|
||||||
linker. */
|
linker. */
|
||||||
|
105
bfd/linker.c
105
bfd/linker.c
@ -424,6 +424,7 @@ static boolean generic_link_check_archive_element
|
|||||||
static boolean generic_link_add_symbol_list
|
static boolean generic_link_add_symbol_list
|
||||||
PARAMS ((bfd *, struct bfd_link_info *, bfd_size_type count, asymbol **,
|
PARAMS ((bfd *, struct bfd_link_info *, bfd_size_type count, asymbol **,
|
||||||
boolean collect));
|
boolean collect));
|
||||||
|
static bfd *hash_entry_bfd PARAMS ((struct bfd_link_hash_entry *));
|
||||||
static void set_symbol_from_hash
|
static void set_symbol_from_hash
|
||||||
PARAMS ((asymbol *, struct bfd_link_hash_entry *));
|
PARAMS ((asymbol *, struct bfd_link_hash_entry *));
|
||||||
static boolean generic_add_output_symbol
|
static boolean generic_add_output_symbol
|
||||||
@ -455,10 +456,7 @@ _bfd_link_hash_newfunc (entry, table, string)
|
|||||||
ret = ((struct bfd_link_hash_entry *)
|
ret = ((struct bfd_link_hash_entry *)
|
||||||
bfd_hash_allocate (table, sizeof (struct bfd_link_hash_entry)));
|
bfd_hash_allocate (table, sizeof (struct bfd_link_hash_entry)));
|
||||||
if (ret == (struct bfd_link_hash_entry *) NULL)
|
if (ret == (struct bfd_link_hash_entry *) NULL)
|
||||||
{
|
return NULL;
|
||||||
bfd_set_error (bfd_error_no_memory);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Call the allocation method of the superclass. */
|
/* Call the allocation method of the superclass. */
|
||||||
ret = ((struct bfd_link_hash_entry *)
|
ret = ((struct bfd_link_hash_entry *)
|
||||||
@ -568,10 +566,7 @@ generic_link_hash_newfunc (entry, table, string)
|
|||||||
ret = ((struct generic_link_hash_entry *)
|
ret = ((struct generic_link_hash_entry *)
|
||||||
bfd_hash_allocate (table, sizeof (struct generic_link_hash_entry)));
|
bfd_hash_allocate (table, sizeof (struct generic_link_hash_entry)));
|
||||||
if (ret == (struct generic_link_hash_entry *) NULL)
|
if (ret == (struct generic_link_hash_entry *) NULL)
|
||||||
{
|
return NULL;
|
||||||
bfd_set_error (bfd_error_no_memory);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Call the allocation method of the superclass. */
|
/* Call the allocation method of the superclass. */
|
||||||
ret = ((struct generic_link_hash_entry *)
|
ret = ((struct generic_link_hash_entry *)
|
||||||
@ -770,10 +765,7 @@ archive_hash_newfunc (entry, table, string)
|
|||||||
ret = ((struct archive_hash_entry *)
|
ret = ((struct archive_hash_entry *)
|
||||||
bfd_hash_allocate (table, sizeof (struct archive_hash_entry)));
|
bfd_hash_allocate (table, sizeof (struct archive_hash_entry)));
|
||||||
if (ret == (struct archive_hash_entry *) NULL)
|
if (ret == (struct archive_hash_entry *) NULL)
|
||||||
{
|
return NULL;
|
||||||
bfd_set_error (bfd_error_no_memory);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Call the allocation method of the superclass. */
|
/* Call the allocation method of the superclass. */
|
||||||
ret = ((struct archive_hash_entry *)
|
ret = ((struct archive_hash_entry *)
|
||||||
@ -1321,7 +1313,7 @@ enum link_action
|
|||||||
static const enum link_action link_action[8][8] =
|
static const enum link_action link_action[8][8] =
|
||||||
{
|
{
|
||||||
/* current\prev new undef undefw def defw com indr warn */
|
/* current\prev new undef undefw def defw com indr warn */
|
||||||
/* UNDEF_ROW */ {UND, NOACT, NOACT, REF, REF, NOACT, REFC, WARNC },
|
/* UNDEF_ROW */ {UND, NOACT, UND, REF, REF, NOACT, REFC, WARNC },
|
||||||
/* UNDEFW_ROW */ {WEAK, NOACT, NOACT, REF, REF, NOACT, REFC, WARNC },
|
/* UNDEFW_ROW */ {WEAK, NOACT, NOACT, REF, REF, NOACT, REFC, WARNC },
|
||||||
/* DEF_ROW */ {DEF, DEF, DEF, MDEF, DEF, CDEF, MDEF, CYCLE },
|
/* DEF_ROW */ {DEF, DEF, DEF, MDEF, DEF, CDEF, MDEF, CYCLE },
|
||||||
/* DEFW_ROW */ {DEFW, DEFW, DEFW, NOACT, NOACT, NOACT, NOACT, CYCLE },
|
/* DEFW_ROW */ {DEFW, DEFW, DEFW, NOACT, NOACT, NOACT, NOACT, CYCLE },
|
||||||
@ -1354,6 +1346,30 @@ static const enum link_action link_action[8][8] =
|
|||||||
Adding an entry to a set does not count as a reference to a set,
|
Adding an entry to a set does not count as a reference to a set,
|
||||||
and no warning is issued (SET_ROW/warn). */
|
and no warning is issued (SET_ROW/warn). */
|
||||||
|
|
||||||
|
/* Return the BFD in which a hash entry has been defined, if known. */
|
||||||
|
|
||||||
|
static bfd *
|
||||||
|
hash_entry_bfd (h)
|
||||||
|
struct bfd_link_hash_entry *h;
|
||||||
|
{
|
||||||
|
while (h->type == bfd_link_hash_warning)
|
||||||
|
h = h->u.i.link;
|
||||||
|
switch (h->type)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
case bfd_link_hash_undefined:
|
||||||
|
case bfd_link_hash_undefweak:
|
||||||
|
return h->u.undef.abfd;
|
||||||
|
case bfd_link_hash_defined:
|
||||||
|
case bfd_link_hash_defweak:
|
||||||
|
return h->u.def.section->owner;
|
||||||
|
case bfd_link_hash_common:
|
||||||
|
return h->u.c.p->section->owner;
|
||||||
|
}
|
||||||
|
/*NOTREACHED*/
|
||||||
|
}
|
||||||
|
|
||||||
/* Add a symbol to the global hash table.
|
/* Add a symbol to the global hash table.
|
||||||
ABFD is the BFD the symbol comes from.
|
ABFD is the BFD the symbol comes from.
|
||||||
NAME is the name of the symbol.
|
NAME is the name of the symbol.
|
||||||
@ -1737,7 +1753,9 @@ _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, value,
|
|||||||
/* Issue a warning and cycle. */
|
/* Issue a warning and cycle. */
|
||||||
if (h->u.i.warning != NULL)
|
if (h->u.i.warning != NULL)
|
||||||
{
|
{
|
||||||
if (! (*info->callbacks->warning) (info, h->u.i.warning))
|
if (! (*info->callbacks->warning) (info, h->u.i.warning,
|
||||||
|
abfd, (asection *) NULL,
|
||||||
|
(bfd_vma) 0))
|
||||||
return false;
|
return false;
|
||||||
/* Only issue a warning once. */
|
/* Only issue a warning once. */
|
||||||
h->u.i.warning = NULL;
|
h->u.i.warning = NULL;
|
||||||
@ -1759,7 +1777,9 @@ _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, value,
|
|||||||
|
|
||||||
case WARN:
|
case WARN:
|
||||||
/* Issue a warning. */
|
/* Issue a warning. */
|
||||||
if (! (*info->callbacks->warning) (info, string))
|
if (! (*info->callbacks->warning) (info, string,
|
||||||
|
hash_entry_bfd (h),
|
||||||
|
(asection *) NULL, (bfd_vma) 0))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1771,7 +1791,10 @@ _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, value,
|
|||||||
ensure this. */
|
ensure this. */
|
||||||
if (h->next != NULL || info->hash->undefs_tail == h)
|
if (h->next != NULL || info->hash->undefs_tail == h)
|
||||||
{
|
{
|
||||||
if (! (*info->callbacks->warning) (info, string))
|
if (! (*info->callbacks->warning) (info, string,
|
||||||
|
hash_entry_bfd (h),
|
||||||
|
(asection *) NULL,
|
||||||
|
(bfd_vma) 0))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1783,27 +1806,33 @@ _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, value,
|
|||||||
|
|
||||||
/* STRING is the warning to give. */
|
/* STRING is the warning to give. */
|
||||||
sub = ((struct bfd_link_hash_entry *)
|
sub = ((struct bfd_link_hash_entry *)
|
||||||
bfd_hash_allocate (&info->hash->table,
|
((*info->hash->table.newfunc)
|
||||||
sizeof (struct bfd_link_hash_entry)));
|
((struct bfd_hash_entry *) NULL, &info->hash->table,
|
||||||
if (!sub)
|
h->root.string)));
|
||||||
{
|
if (sub == NULL)
|
||||||
bfd_set_error (bfd_error_no_memory);
|
return false;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*sub = *h;
|
*sub = *h;
|
||||||
h->type = bfd_link_hash_warning;
|
sub->type = bfd_link_hash_warning;
|
||||||
h->u.i.link = sub;
|
sub->u.i.link = h;
|
||||||
if (! copy)
|
if (! copy)
|
||||||
h->u.i.warning = string;
|
sub->u.i.warning = string;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *w;
|
char *w;
|
||||||
|
|
||||||
w = bfd_hash_allocate (&info->hash->table,
|
w = bfd_hash_allocate (&info->hash->table,
|
||||||
strlen (string) + 1);
|
strlen (string) + 1);
|
||||||
|
if (w == NULL)
|
||||||
|
return false;
|
||||||
strcpy (w, string);
|
strcpy (w, string);
|
||||||
h->u.i.warning = w;
|
sub->u.i.warning = w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bfd_hash_replace (&info->hash->table,
|
||||||
|
(struct bfd_hash_entry *) h,
|
||||||
|
(struct bfd_hash_entry *) sub);
|
||||||
|
if (hashp != NULL)
|
||||||
|
*hashp = sub;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1886,7 +1915,8 @@ _bfd_generic_final_link (abfd, info)
|
|||||||
symbols);
|
symbols);
|
||||||
if (reloc_count < 0)
|
if (reloc_count < 0)
|
||||||
return false;
|
return false;
|
||||||
BFD_ASSERT (reloc_count == input_section->reloc_count);
|
BFD_ASSERT ((unsigned long) reloc_count
|
||||||
|
== input_section->reloc_count);
|
||||||
o->reloc_count += reloc_count;
|
o->reloc_count += reloc_count;
|
||||||
free (relocs);
|
free (relocs);
|
||||||
}
|
}
|
||||||
@ -2209,8 +2239,22 @@ set_symbol_from_hash (sym, h)
|
|||||||
switch (h->type)
|
switch (h->type)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case bfd_link_hash_new:
|
|
||||||
abort ();
|
abort ();
|
||||||
|
break;
|
||||||
|
case bfd_link_hash_new:
|
||||||
|
/* This can happen when a constructor symbol is seen but we are
|
||||||
|
not building constructors. */
|
||||||
|
if (sym->section != NULL)
|
||||||
|
{
|
||||||
|
BFD_ASSERT ((sym->flags & BSF_CONSTRUCTOR) != 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sym->flags |= BSF_CONSTRUCTOR;
|
||||||
|
sym->section = bfd_abs_section_ptr;
|
||||||
|
sym->value = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case bfd_link_hash_undefined:
|
case bfd_link_hash_undefined:
|
||||||
sym->section = bfd_und_section_ptr;
|
sym->section = bfd_und_section_ptr;
|
||||||
sym->value = 0;
|
sym->value = 0;
|
||||||
@ -2598,7 +2642,8 @@ default_indirect_link_order (output_bfd, info, output_section, link_order,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get and relocate the section contents. */
|
/* Get and relocate the section contents. */
|
||||||
contents = (bfd_byte *) malloc (bfd_section_size (input_bfd, input_section));
|
contents = ((bfd_byte *)
|
||||||
|
malloc ((size_t) bfd_section_size (input_bfd, input_section)));
|
||||||
if (contents == NULL && bfd_section_size (input_bfd, input_section) != 0)
|
if (contents == NULL && bfd_section_size (input_bfd, input_section) != 0)
|
||||||
{
|
{
|
||||||
bfd_set_error (bfd_error_no_memory);
|
bfd_set_error (bfd_error_no_memory);
|
||||||
|
@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||||||
#define UNDERSCORE_HACK 1
|
#define UNDERSCORE_HACK 1
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
|
#include <ctype.h>
|
||||||
#include "libbfd.h"
|
#include "libbfd.h"
|
||||||
#include "oasys.h"
|
#include "oasys.h"
|
||||||
#include "liboasys.h"
|
#include "liboasys.h"
|
||||||
@ -1351,7 +1352,7 @@ oasys_set_section_contents (abfd, section, location, offset, count)
|
|||||||
}
|
}
|
||||||
(void) memcpy ((PTR) (oasys_per_section (section)->data + offset),
|
(void) memcpy ((PTR) (oasys_per_section (section)->data + offset),
|
||||||
location,
|
location,
|
||||||
count);
|
(size_t) count);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -704,6 +704,13 @@ coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
|
|||||||
bfd_h_get_32 (abfd, src->DataDirectory[idx][1]);
|
bfd_h_get_32 (abfd, src->DataDirectory[idx][1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (aouthdr_int->entry)
|
||||||
|
aouthdr_int->entry += a->ImageBase;
|
||||||
|
if (aouthdr_int->tsize)
|
||||||
|
aouthdr_int->text_start += a->ImageBase;
|
||||||
|
if (aouthdr_int->dsize)
|
||||||
|
aouthdr_int->data_start += a->ImageBase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -993,35 +1000,43 @@ pe_print_private_bfd_data (abfd, vfile)
|
|||||||
int j;
|
int j;
|
||||||
pe_data_type *pe = pe_data (abfd);
|
pe_data_type *pe = pe_data (abfd);
|
||||||
struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
|
struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
|
||||||
fprintf (file,"ImageBase\t\t%08x\n", i->ImageBase);
|
fprintf (file,"ImageBase\t\t");
|
||||||
fprintf (file,"SectionAlignment\t%08x\n", i->SectionAlignment);
|
fprintf_vma (file, i->ImageBase);
|
||||||
fprintf (file,"FileAlignment\t\t%08x\n", i->FileAlignment);
|
fprintf (file,"SectionAlignment\t");
|
||||||
|
fprintf_vma (file, i->SectionAlignment);
|
||||||
|
fprintf (file,"FileAlignment\t\t");
|
||||||
|
fprintf_vma (file, i->FileAlignment);
|
||||||
fprintf (file,"MajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
|
fprintf (file,"MajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
|
||||||
fprintf (file,"MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
|
fprintf (file,"MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
|
||||||
fprintf (file,"MajorImageVersion\t%d\n", i->MajorImageVersion);
|
fprintf (file,"MajorImageVersion\t%d\n", i->MajorImageVersion);
|
||||||
fprintf (file,"MinorImageVersion\t%d\n", i->MinorImageVersion);
|
fprintf (file,"MinorImageVersion\t%d\n", i->MinorImageVersion);
|
||||||
fprintf (file,"MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
|
fprintf (file,"MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
|
||||||
fprintf (file,"MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
|
fprintf (file,"MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
|
||||||
fprintf (file,"Reserved1\t\t%08x\n", i->Reserved1);
|
fprintf (file,"Reserved1\t\t%08lx\n", i->Reserved1);
|
||||||
fprintf (file,"SizeOfImage\t\t%08x\n", i->SizeOfImage);
|
fprintf (file,"SizeOfImage\t\t%08lx\n", i->SizeOfImage);
|
||||||
fprintf (file,"SizeOfHeaders\t\t%08x\n", i->SizeOfHeaders);
|
fprintf (file,"SizeOfHeaders\t\t%08lx\n", i->SizeOfHeaders);
|
||||||
fprintf (file,"CheckSum\t\t%08x\n", i->CheckSum);
|
fprintf (file,"CheckSum\t\t%08lx\n", i->CheckSum);
|
||||||
fprintf (file,"Subsystem\t\t%08x\n", i->Subsystem);
|
fprintf (file,"Subsystem\t\t%08x\n", i->Subsystem);
|
||||||
fprintf (file,"DllCharacteristics\t%08x\n", i->DllCharacteristics);
|
fprintf (file,"DllCharacteristics\t%08x\n", i->DllCharacteristics);
|
||||||
fprintf (file,"SizeOfStackReserve\t%08x\n", i->SizeOfStackReserve);
|
fprintf (file,"SizeOfStackReserve\t");
|
||||||
fprintf (file,"SizeOfStackCommit\t%08x\n", i->SizeOfStackCommit);
|
fprintf_vma (file, i->SizeOfStackReserve);
|
||||||
fprintf (file,"SizeOfHeapReserve\t%08x\n", i->SizeOfHeapReserve);
|
fprintf (file,"SizeOfStackCommit\t");
|
||||||
fprintf (file,"SizeOfHeapCommit\t%08x\n", i->SizeOfHeapCommit);
|
fprintf_vma (file, i->SizeOfStackCommit);
|
||||||
fprintf (file,"LoaderFlags\t\t%08x\n", i->LoaderFlags);
|
fprintf (file,"SizeOfHeapReserve\t");
|
||||||
fprintf (file,"NumberOfRvaAndSizes\t%08x\n", i->NumberOfRvaAndSizes);
|
fprintf_vma (file, i->SizeOfHeapReserve);
|
||||||
|
fprintf (file,"SizeOfHeapCommit\t");
|
||||||
|
fprintf_vma (file, i->SizeOfHeapCommit);
|
||||||
|
fprintf (file,"LoaderFlags\t\t%08lx\n", i->LoaderFlags);
|
||||||
|
fprintf (file,"NumberOfRvaAndSizes\t%08lx\n", i->NumberOfRvaAndSizes);
|
||||||
|
|
||||||
for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
|
for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
|
||||||
{
|
{
|
||||||
fprintf(file, "Entry %2d %08x %08x\n",
|
fprintf (file, "Entry %2d ", j);
|
||||||
j,
|
fprintf_vma (file, i->DataDirectory[j].VirtualAddress);
|
||||||
i->DataDirectory[j].VirtualAddress,
|
fprintf (file, " %08lx\n", i->DataDirectory[j].Size);
|
||||||
i->DataDirectory[j].Size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
|
@ -874,6 +874,7 @@ srec_write_record (abfd, type, address, data, end)
|
|||||||
CONST bfd_byte *src = data;
|
CONST bfd_byte *src = data;
|
||||||
char *dst = buffer;
|
char *dst = buffer;
|
||||||
char *length;
|
char *length;
|
||||||
|
bfd_size_type wrlen;
|
||||||
|
|
||||||
*dst++ = 'S';
|
*dst++ = 'S';
|
||||||
*dst++ = '0' + type;
|
*dst++ = '0' + type;
|
||||||
@ -916,7 +917,8 @@ srec_write_record (abfd, type, address, data, end)
|
|||||||
|
|
||||||
*dst++ = '\r';
|
*dst++ = '\r';
|
||||||
*dst++ = '\n';
|
*dst++ = '\n';
|
||||||
if (bfd_write ((PTR) buffer, 1, dst - buffer, abfd) != dst - buffer)
|
wrlen = dst - buffer;
|
||||||
|
if (bfd_write ((PTR) buffer, 1, wrlen, abfd) != wrlen)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1032,8 +1034,7 @@ srec_write_symbols (abfd)
|
|||||||
&& s->name[0] != 't')
|
&& s->name[0] != 't')
|
||||||
{
|
{
|
||||||
/* Just dump out non debug symbols */
|
/* Just dump out non debug symbols */
|
||||||
|
bfd_size_type l;
|
||||||
int l;
|
|
||||||
char buf2[40], *p;
|
char buf2[40], *p;
|
||||||
|
|
||||||
sprintf_vma (buf2,
|
sprintf_vma (buf2,
|
||||||
|
20
bfd/sunos.c
20
bfd/sunos.c
@ -89,7 +89,7 @@ struct sunos_dynamic_info
|
|||||||
/* Dynamic information. */
|
/* Dynamic information. */
|
||||||
struct internal_sun4_dynamic_link dyninfo;
|
struct internal_sun4_dynamic_link dyninfo;
|
||||||
/* Number of dynamic symbols. */
|
/* Number of dynamic symbols. */
|
||||||
long dynsym_count;
|
unsigned long dynsym_count;
|
||||||
/* Read in nlists for dynamic symbols. */
|
/* Read in nlists for dynamic symbols. */
|
||||||
struct external_nlist *dynsym;
|
struct external_nlist *dynsym;
|
||||||
/* asymbol structures for dynamic symbols. */
|
/* asymbol structures for dynamic symbols. */
|
||||||
@ -97,7 +97,7 @@ struct sunos_dynamic_info
|
|||||||
/* Read in dynamic string table. */
|
/* Read in dynamic string table. */
|
||||||
char *dynstr;
|
char *dynstr;
|
||||||
/* Number of dynamic relocs. */
|
/* Number of dynamic relocs. */
|
||||||
long dynrel_count;
|
unsigned long dynrel_count;
|
||||||
/* Read in dynamic relocs. This may be reloc_std_external or
|
/* Read in dynamic relocs. This may be reloc_std_external or
|
||||||
reloc_ext_external. */
|
reloc_ext_external. */
|
||||||
PTR dynrel;
|
PTR dynrel;
|
||||||
@ -122,7 +122,7 @@ sunos_read_dynamic_info (abfd)
|
|||||||
{
|
{
|
||||||
struct sunos_dynamic_info *info;
|
struct sunos_dynamic_info *info;
|
||||||
asection *dynsec;
|
asection *dynsec;
|
||||||
file_ptr dynoff;
|
bfd_vma dynoff;
|
||||||
struct external_sun4_dynamic dyninfo;
|
struct external_sun4_dynamic dyninfo;
|
||||||
unsigned long dynver;
|
unsigned long dynver;
|
||||||
struct external_sun4_dynamic_link linkinfo;
|
struct external_sun4_dynamic_link linkinfo;
|
||||||
@ -177,7 +177,7 @@ sunos_read_dynamic_info (abfd)
|
|||||||
else
|
else
|
||||||
dynsec = obj_datasec (abfd);
|
dynsec = obj_datasec (abfd);
|
||||||
dynoff -= bfd_get_section_vma (abfd, dynsec);
|
dynoff -= bfd_get_section_vma (abfd, dynsec);
|
||||||
if (dynoff < 0 || dynoff > bfd_section_size (abfd, dynsec))
|
if (dynoff > bfd_section_size (abfd, dynsec))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
/* This executable appears to be dynamically linked in a way that we
|
/* This executable appears to be dynamically linked in a way that we
|
||||||
@ -207,13 +207,15 @@ sunos_read_dynamic_info (abfd)
|
|||||||
info->dynsym_count = ((info->dyninfo.ld_symbols - info->dyninfo.ld_stab)
|
info->dynsym_count = ((info->dyninfo.ld_symbols - info->dyninfo.ld_stab)
|
||||||
/ EXTERNAL_NLIST_SIZE);
|
/ EXTERNAL_NLIST_SIZE);
|
||||||
BFD_ASSERT (info->dynsym_count * EXTERNAL_NLIST_SIZE
|
BFD_ASSERT (info->dynsym_count * EXTERNAL_NLIST_SIZE
|
||||||
== info->dyninfo.ld_symbols - info->dyninfo.ld_stab);
|
== (unsigned long) (info->dyninfo.ld_symbols
|
||||||
|
- info->dyninfo.ld_stab));
|
||||||
|
|
||||||
/* Similarly, the relocs end at the hash table. */
|
/* Similarly, the relocs end at the hash table. */
|
||||||
info->dynrel_count = ((info->dyninfo.ld_hash - info->dyninfo.ld_rel)
|
info->dynrel_count = ((info->dyninfo.ld_hash - info->dyninfo.ld_rel)
|
||||||
/ obj_reloc_entry_size (abfd));
|
/ obj_reloc_entry_size (abfd));
|
||||||
BFD_ASSERT (info->dynrel_count * obj_reloc_entry_size (abfd)
|
BFD_ASSERT (info->dynrel_count * obj_reloc_entry_size (abfd)
|
||||||
== info->dyninfo.ld_hash - info->dyninfo.ld_rel);
|
== (unsigned long) (info->dyninfo.ld_hash
|
||||||
|
- info->dyninfo.ld_rel));
|
||||||
|
|
||||||
info->valid = true;
|
info->valid = true;
|
||||||
|
|
||||||
@ -249,7 +251,7 @@ sunos_canonicalize_dynamic_symtab (abfd, storage)
|
|||||||
asymbol **storage;
|
asymbol **storage;
|
||||||
{
|
{
|
||||||
struct sunos_dynamic_info *info;
|
struct sunos_dynamic_info *info;
|
||||||
long i;
|
unsigned long i;
|
||||||
|
|
||||||
/* Get the general dynamic information. */
|
/* Get the general dynamic information. */
|
||||||
if (obj_aout_dynamic_info (abfd) == NULL)
|
if (obj_aout_dynamic_info (abfd) == NULL)
|
||||||
@ -422,7 +424,7 @@ sunos_canonicalize_dynamic_reloc (abfd, storage, syms)
|
|||||||
asymbol **syms;
|
asymbol **syms;
|
||||||
{
|
{
|
||||||
struct sunos_dynamic_info *info;
|
struct sunos_dynamic_info *info;
|
||||||
long i;
|
unsigned long i;
|
||||||
|
|
||||||
/* Get the general dynamic information. */
|
/* Get the general dynamic information. */
|
||||||
if (obj_aout_dynamic_info (abfd) == (PTR) NULL)
|
if (obj_aout_dynamic_info (abfd) == (PTR) NULL)
|
||||||
@ -1520,7 +1522,7 @@ sunos_scan_ext_relocs (info, abfd, sec, relocs, rel_size)
|
|||||||
relend = relocs + rel_size / RELOC_EXT_SIZE;
|
relend = relocs + rel_size / RELOC_EXT_SIZE;
|
||||||
for (rel = relocs; rel < relend; rel++)
|
for (rel = relocs; rel < relend; rel++)
|
||||||
{
|
{
|
||||||
int r_index;
|
unsigned int r_index;
|
||||||
int r_extern;
|
int r_extern;
|
||||||
int r_type;
|
int r_type;
|
||||||
struct sunos_link_hash_entry *h = NULL;
|
struct sunos_link_hash_entry *h = NULL;
|
||||||
|
71
bfd/tekhex.c
71
bfd/tekhex.c
@ -1,5 +1,5 @@
|
|||||||
/* BFD backend for Extended Tektronix Hex Format objects.
|
/* BFD backend for Extended Tektronix Hex Format objects.
|
||||||
Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
|
Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ GNU General Public License for more details.
|
|||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
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. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SUBSECTION
|
SUBSECTION
|
||||||
@ -72,6 +72,7 @@ serial protocol, so big files are unlikely, so we keep a list of 8k chunks
|
|||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
#include "libbfd.h"
|
#include "libbfd.h"
|
||||||
|
#include "libiberty.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -87,23 +88,17 @@ typedef struct tekhex_symbol_struct
|
|||||||
|
|
||||||
} tekhex_symbol_type;
|
} tekhex_symbol_type;
|
||||||
|
|
||||||
static char digs[] = "0123456789ABCDEF";
|
static const char digs[] = "0123456789ABCDEF";
|
||||||
|
|
||||||
static char sum_block[256];
|
static char sum_block[256];
|
||||||
|
|
||||||
/* Horrible ascii dependent macros for converting between hex and
|
|
||||||
binary */
|
|
||||||
|
|
||||||
#define CHARS_IN_SET 256
|
|
||||||
static char hex_value[CHARS_IN_SET];
|
|
||||||
|
|
||||||
#define NOT_HEX 20
|
#define NOT_HEX 20
|
||||||
#define NIBBLE(x) hex_value[x]
|
#define NIBBLE(x) hex_value(x)
|
||||||
#define HEX(buffer) ((NIBBLE((buffer)[0])<<4) + NIBBLE((buffer)[1]))
|
#define HEX(buffer) ((NIBBLE((buffer)[0])<<4) + NIBBLE((buffer)[1]))
|
||||||
#define TOHEX(d,x) \
|
#define TOHEX(d,x) \
|
||||||
(d)[1] = digs[(x) & 0xf]; \
|
(d)[1] = digs[(x) & 0xf]; \
|
||||||
(d)[0] = digs[((x)>>4)&0xf];
|
(d)[0] = digs[((x)>>4)&0xf];
|
||||||
#define ISHEX(x) (hex_value[x] != NOT_HEX)
|
#define ISHEX(x) hex_p(x)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Here's an example
|
Here's an example
|
||||||
@ -223,24 +218,8 @@ tekhex_init ()
|
|||||||
|
|
||||||
if (inited == false)
|
if (inited == false)
|
||||||
{
|
{
|
||||||
|
|
||||||
inited = true;
|
inited = true;
|
||||||
|
hex_init ();
|
||||||
for (i = 0; i < CHARS_IN_SET; i++)
|
|
||||||
{
|
|
||||||
hex_value[i] = NOT_HEX;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 10; i++)
|
|
||||||
{
|
|
||||||
hex_value[i + '0'] = i;
|
|
||||||
|
|
||||||
}
|
|
||||||
for (i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
hex_value[i + 'a'] = i + 10;
|
|
||||||
hex_value[i + 'A'] = i + 10;
|
|
||||||
}
|
|
||||||
val = 0;
|
val = 0;
|
||||||
for (i = 0; i < 10; i++)
|
for (i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
@ -305,13 +284,13 @@ getvalue (srcp)
|
|||||||
{
|
{
|
||||||
char *src = *srcp;
|
char *src = *srcp;
|
||||||
bfd_vma value = 0;
|
bfd_vma value = 0;
|
||||||
unsigned int len = hex_value[*src++];
|
unsigned int len = hex_value(*src++);
|
||||||
|
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
len = 16;
|
len = 16;
|
||||||
while (len--)
|
while (len--)
|
||||||
{
|
{
|
||||||
value = value << 4 | hex_value[*src++];
|
value = value << 4 | hex_value(*src++);
|
||||||
}
|
}
|
||||||
*srcp = src;
|
*srcp = src;
|
||||||
return value;
|
return value;
|
||||||
@ -324,7 +303,7 @@ getsym (dstp, srcp)
|
|||||||
{
|
{
|
||||||
char *src = *srcp;
|
char *src = *srcp;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int len = hex_value[*src++];
|
unsigned int len = hex_value(*src++);
|
||||||
|
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
len = 16;
|
len = 16;
|
||||||
@ -350,7 +329,6 @@ find_chunk (abfd, vma)
|
|||||||
if (!d)
|
if (!d)
|
||||||
{
|
{
|
||||||
char *sname = bfd_alloc (abfd, 12);
|
char *sname = bfd_alloc (abfd, 12);
|
||||||
asection *s;
|
|
||||||
|
|
||||||
/* No chunk for this address, so make one up */
|
/* No chunk for this address, so make one up */
|
||||||
d = (struct data_struct *)
|
d = (struct data_struct *)
|
||||||
@ -392,7 +370,7 @@ first_phase (abfd, type, src)
|
|||||||
char type;
|
char type;
|
||||||
char *src;
|
char *src;
|
||||||
{
|
{
|
||||||
asection *section = &bfd_abs_section;
|
asection *section = bfd_abs_section_ptr;
|
||||||
int len;
|
int len;
|
||||||
char sym[17]; /* A symbol can only be 16chars long */
|
char sym[17]; /* A symbol can only be 16chars long */
|
||||||
|
|
||||||
@ -432,15 +410,13 @@ first_phase (abfd, type, src)
|
|||||||
{
|
{
|
||||||
switch (*src)
|
switch (*src)
|
||||||
{
|
{
|
||||||
asection *s;
|
|
||||||
|
|
||||||
case '1': /* section range */
|
case '1': /* section range */
|
||||||
src++;
|
src++;
|
||||||
section->vma = getvalue (&src);
|
section->vma = getvalue (&src);
|
||||||
section->_raw_size = getvalue (&src) - section->vma;
|
section->_raw_size = getvalue (&src) - section->vma;
|
||||||
section->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC;
|
section->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC;
|
||||||
break;
|
break;
|
||||||
|
case '0':
|
||||||
case '2':
|
case '2':
|
||||||
case '3':
|
case '3':
|
||||||
case '4':
|
case '4':
|
||||||
@ -504,7 +480,6 @@ static void
|
|||||||
char buffer[MAXCHUNK];
|
char buffer[MAXCHUNK];
|
||||||
char *src = buffer;
|
char *src = buffer;
|
||||||
char type;
|
char type;
|
||||||
bfd_vma address = 0;
|
|
||||||
|
|
||||||
/* Find first '%' */
|
/* Find first '%' */
|
||||||
eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1);
|
eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1);
|
||||||
@ -591,7 +566,6 @@ tekhex_object_p (abfd)
|
|||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
char b[4];
|
char b[4];
|
||||||
asection *section;
|
|
||||||
|
|
||||||
tekhex_init ();
|
tekhex_init ();
|
||||||
|
|
||||||
@ -608,7 +582,7 @@ tekhex_object_p (abfd)
|
|||||||
return abfd->xvec;
|
return abfd->xvec;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean
|
static void
|
||||||
move_section_contents (abfd, section, locationp, offset, count, get)
|
move_section_contents (abfd, section, locationp, offset, count, get)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
asection *section;
|
asection *section;
|
||||||
@ -797,6 +771,7 @@ out (abfd, type, start, end)
|
|||||||
int sum = 0;
|
int sum = 0;
|
||||||
char *s;
|
char *s;
|
||||||
char front[6];
|
char front[6];
|
||||||
|
bfd_size_type wrlen;
|
||||||
|
|
||||||
front[0] = '%';
|
front[0] = '%';
|
||||||
TOHEX (front + 1, end - start + 5);
|
TOHEX (front + 1, end - start + 5);
|
||||||
@ -804,17 +779,18 @@ out (abfd, type, start, end)
|
|||||||
|
|
||||||
for (s = start; s < end; s++)
|
for (s = start; s < end; s++)
|
||||||
{
|
{
|
||||||
sum += sum_block[*s];
|
sum += sum_block[(unsigned char) *s];
|
||||||
}
|
}
|
||||||
|
|
||||||
sum += sum_block[front[1]]; /* length */
|
sum += sum_block[(unsigned char) front[1]]; /* length */
|
||||||
sum += sum_block[front[2]];
|
sum += sum_block[(unsigned char) front[2]];
|
||||||
sum += sum_block[front[3]]; /* type */
|
sum += sum_block[(unsigned char) front[3]]; /* type */
|
||||||
TOHEX (front + 4, sum);
|
TOHEX (front + 4, sum);
|
||||||
if (bfd_write (front, 1, 6, abfd) != 6)
|
if (bfd_write (front, 1, 6, abfd) != 6)
|
||||||
abort ();
|
abort ();
|
||||||
end[0] = '\n';
|
end[0] = '\n';
|
||||||
if (bfd_write (start, 1, end - start + 1, abfd) != end - start + 1)
|
wrlen = end - start + 1;
|
||||||
|
if (bfd_write (start, 1, wrlen, abfd) != wrlen)
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -825,8 +801,6 @@ tekhex_write_object_contents (abfd)
|
|||||||
int bytes_written;
|
int bytes_written;
|
||||||
char buffer[100];
|
char buffer[100];
|
||||||
asymbol **p;
|
asymbol **p;
|
||||||
tdata_type *tdata = abfd->tdata.tekhex_data;
|
|
||||||
tekhex_data_list_type *list;
|
|
||||||
asection *s;
|
asection *s;
|
||||||
struct data_struct *d;
|
struct data_struct *d;
|
||||||
|
|
||||||
@ -929,7 +903,7 @@ tekhex_write_object_contents (abfd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* And the terminator */
|
/* And the terminator */
|
||||||
if (bfd_write ("%7081010\n", 1, 9, abfd) != 9)
|
if (bfd_write ("%0781010\n", 1, 9, abfd) != 9)
|
||||||
abort ();
|
abort ();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1007,6 +981,8 @@ tekhex_print_symbol (ignore_abfd, filep, symbol, how)
|
|||||||
#define tekhex_get_lineno _bfd_nosymbols_get_lineno
|
#define tekhex_get_lineno _bfd_nosymbols_get_lineno
|
||||||
#define tekhex_find_nearest_line _bfd_nosymbols_find_nearest_line
|
#define tekhex_find_nearest_line _bfd_nosymbols_find_nearest_line
|
||||||
#define tekhex_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
|
#define tekhex_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
|
||||||
|
#define tekhex_read_minisymbols _bfd_generic_read_minisymbols
|
||||||
|
#define tekhex_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
|
||||||
|
|
||||||
#define tekhex_bfd_get_relocated_section_contents \
|
#define tekhex_bfd_get_relocated_section_contents \
|
||||||
bfd_generic_get_relocated_section_contents
|
bfd_generic_get_relocated_section_contents
|
||||||
@ -1014,6 +990,7 @@ tekhex_print_symbol (ignore_abfd, filep, symbol, how)
|
|||||||
#define tekhex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
|
#define tekhex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
|
||||||
#define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols
|
#define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols
|
||||||
#define tekhex_bfd_final_link _bfd_generic_final_link
|
#define tekhex_bfd_final_link _bfd_generic_final_link
|
||||||
|
#define tekhex_bfd_link_split_section _bfd_generic_link_split_section
|
||||||
|
|
||||||
const bfd_target tekhex_vec =
|
const bfd_target tekhex_vec =
|
||||||
{
|
{
|
||||||
|
@ -387,7 +387,6 @@ process_otr (abfd, otr, pass)
|
|||||||
int pass;
|
int pass;
|
||||||
{
|
{
|
||||||
unsigned long shift;
|
unsigned long shift;
|
||||||
long val;
|
|
||||||
unsigned char *srcp = otr->data;
|
unsigned char *srcp = otr->data;
|
||||||
unsigned char *endp = (unsigned char *) otr + otr->size;
|
unsigned char *endp = (unsigned char *) otr + otr->size;
|
||||||
unsigned int bits = (otr->map[0] << 24)
|
unsigned int bits = (otr->map[0] << 24)
|
||||||
@ -398,7 +397,7 @@ process_otr (abfd, otr, pass)
|
|||||||
struct esdid *esdid = &EDATA (abfd, otr->esdid - 1);
|
struct esdid *esdid = &EDATA (abfd, otr->esdid - 1);
|
||||||
unsigned char *contents = esdid->contents;
|
unsigned char *contents = esdid->contents;
|
||||||
int need_contents = 0;
|
int need_contents = 0;
|
||||||
int dst_idx = esdid->pc;
|
unsigned int dst_idx = esdid->pc;
|
||||||
|
|
||||||
for (shift = (1 << 31); shift && srcp < endp; shift >>= 1)
|
for (shift = (1 << 31); shift && srcp < endp; shift >>= 1)
|
||||||
{
|
{
|
||||||
@ -668,7 +667,7 @@ versados_get_section_contents (abfd, section, location, offset, count)
|
|||||||
|
|
||||||
memcpy (location,
|
memcpy (location,
|
||||||
EDATA (abfd, section->target_index).contents + offset,
|
EDATA (abfd, section->target_index).contents + offset,
|
||||||
count);
|
(size_t) count);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -721,7 +720,7 @@ versados_get_symtab (abfd, alocation)
|
|||||||
asymbol **alocation;
|
asymbol **alocation;
|
||||||
{
|
{
|
||||||
unsigned int symcount = bfd_get_symcount (abfd);
|
unsigned int symcount = bfd_get_symcount (abfd);
|
||||||
int i;
|
unsigned int i;
|
||||||
asymbol *s;
|
asymbol *s;
|
||||||
|
|
||||||
versados_pass_2 (abfd);
|
versados_pass_2 (abfd);
|
||||||
@ -787,7 +786,7 @@ versados_canonicalize_reloc (abfd, section, relptr, symbols)
|
|||||||
arelent **relptr;
|
arelent **relptr;
|
||||||
asymbol **symbols;
|
asymbol **symbols;
|
||||||
{
|
{
|
||||||
int count;
|
unsigned int count;
|
||||||
arelent *src;
|
arelent *src;
|
||||||
|
|
||||||
versados_pass_2 (abfd);
|
versados_pass_2 (abfd);
|
||||||
|
Reference in New Issue
Block a user