Arm specific code changed to conform to BFD coding conventions.
This commit is contained in:
parent
5de921b816
commit
7d6d10f9b3
@ -1,3 +1,21 @@
|
||||
Tue Apr 21 10:00:12 1998 Nick Clifton <nickc@cygnus.com>
|
||||
|
||||
* libcoff.h: Add extra parameter to
|
||||
bfd_coff_link_output_has_begun overrideable function.
|
||||
* cofflink.c: Pass extra parameter to
|
||||
bfd_coff_link_output_has_begun function.
|
||||
* bfd-in.h: Add prototypes for exported ARM interworking
|
||||
functions.
|
||||
* peicode.h: ARM specific code reorganised to conform to BFD
|
||||
coding conventions.
|
||||
* coffcode.h: ARM specific code reorganised to conform to BFD
|
||||
coding conventions.
|
||||
* coff-arm.c: Code reorganised to conform to the BFD coding
|
||||
conventions. Global variables have been moved into an ARM
|
||||
specific hash table structure and a new function:
|
||||
bfd_arm_get_bfd_for_interworking() has been created which is
|
||||
called from the linker scripts.
|
||||
|
||||
Tue Apr 21 00:11:51 1998 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* archive.c (_bfd_generic_read_ar_hdr_mag): Simplify end-of-name test.
|
||||
|
29
bfd/bfd-in.h
29
bfd/bfd-in.h
@ -1,5 +1,6 @@
|
||||
/* Main header file for the bfd library -- portable access to object files.
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 1998
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Cygnus Support.
|
||||
|
||||
** NOTE: bfd.h and bfd-in2.h are GENERATED files. Don't change them;
|
||||
@ -49,7 +50,6 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ansidecl.h"
|
||||
#include "obstack.h"
|
||||
|
||||
/* These two lines get substitutions done by commands in Makefile.in. */
|
||||
#define BFD_VERSION "@VERSION@"
|
||||
@ -310,6 +310,7 @@ typedef struct sec *sec_ptr;
|
||||
#define bfd_section_name(bfd, ptr) ((ptr)->name)
|
||||
#define bfd_section_size(bfd, ptr) (bfd_get_section_size_before_reloc(ptr))
|
||||
#define bfd_section_vma(bfd, ptr) ((ptr)->vma)
|
||||
#define bfd_section_lma(bfd, ptr) ((ptr)->lma)
|
||||
#define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power)
|
||||
#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags + 0)
|
||||
#define bfd_get_section_userdata(bfd, ptr) ((ptr)->userdata)
|
||||
@ -380,8 +381,9 @@ struct bfd_hash_table
|
||||
struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
|
||||
struct bfd_hash_table *,
|
||||
const char *));
|
||||
/* An obstack for this hash table. */
|
||||
struct obstack memory;
|
||||
/* An objalloc for this hash table. This is a struct objalloc *,
|
||||
but we use PTR to avoid requiring the inclusion of objalloc.h. */
|
||||
PTR memory;
|
||||
};
|
||||
|
||||
/* Initialize a hash table. */
|
||||
@ -539,6 +541,7 @@ struct ecoff_extr;
|
||||
struct symbol_cache_entry;
|
||||
struct bfd_link_info;
|
||||
struct bfd_link_hash_entry;
|
||||
struct bfd_elf_version_tree;
|
||||
#endif
|
||||
extern bfd_vma bfd_ecoff_get_gp_value PARAMS ((bfd * abfd));
|
||||
extern boolean bfd_ecoff_set_gp_value PARAMS ((bfd *abfd, bfd_vma gp_value));
|
||||
@ -606,10 +609,12 @@ extern struct bfd_link_needed_list *bfd_elf_get_needed_list
|
||||
PARAMS ((bfd *, struct bfd_link_info *));
|
||||
extern boolean bfd_elf32_size_dynamic_sections
|
||||
PARAMS ((bfd *, const char *, const char *, boolean, const char *,
|
||||
const char *, struct bfd_link_info *, struct sec **));
|
||||
const char * const *, struct bfd_link_info *, struct sec **,
|
||||
struct bfd_elf_version_tree *));
|
||||
extern boolean bfd_elf64_size_dynamic_sections
|
||||
PARAMS ((bfd *, const char *, const char *, boolean, const char *,
|
||||
const char *, struct bfd_link_info *, struct sec **));
|
||||
const char * const *, struct bfd_link_info *, struct sec **,
|
||||
struct bfd_elf_version_tree *));
|
||||
extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *));
|
||||
extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *));
|
||||
|
||||
@ -629,6 +634,8 @@ extern boolean bfd_i386linux_size_dynamic_sections
|
||||
PARAMS ((bfd *, struct bfd_link_info *));
|
||||
extern boolean bfd_m68klinux_size_dynamic_sections
|
||||
PARAMS ((bfd *, struct bfd_link_info *));
|
||||
extern boolean bfd_sparclinux_size_dynamic_sections
|
||||
PARAMS ((bfd *, struct bfd_link_info *));
|
||||
|
||||
/* mmap hacks */
|
||||
|
||||
@ -685,4 +692,14 @@ extern boolean bfd_coff_get_syment
|
||||
extern boolean bfd_coff_get_auxent
|
||||
PARAMS ((bfd *, struct symbol_cache_entry *, int, union internal_auxent *));
|
||||
|
||||
/* ARM Interworking support. Called from linker. */
|
||||
extern boolean bfd_arm_allocate_interworking_sections
|
||||
PARAMS ((struct bfd_link_info *));
|
||||
|
||||
extern boolean bfd_arm_process_before_allocation
|
||||
PARAMS ((bfd *, struct bfd_link_info *));
|
||||
|
||||
extern boolean bfd_arm_get_bfd_for_interworking
|
||||
PARAMS ((bfd *, struct bfd_link_info *));
|
||||
|
||||
/* And more from the source. */
|
||||
|
454
bfd/coff-arm.c
454
bfd/coff-arm.c
@ -33,6 +33,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "libcoff.h"
|
||||
|
||||
/* Macros for manipulation the bits in the flags field of the coff data
|
||||
structure. */
|
||||
#define APCS_26_FLAG( abfd ) (coff_data (abfd)->flags & F_APCS_26)
|
||||
#define APCS_FLOAT_FLAG( abfd ) (coff_data (abfd)->flags & F_APCS_FLOAT)
|
||||
#define PIC_FLAG( abfd ) (coff_data (abfd)->flags & F_PIC)
|
||||
@ -366,15 +368,17 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
|
||||
0x07ff07ff,
|
||||
PCRELOFFSET),
|
||||
};
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
/* Return true if this relocation should
|
||||
appear in the output .reloc section. */
|
||||
|
||||
static boolean in_reloc_p (abfd, howto)
|
||||
static boolean
|
||||
in_reloc_p (abfd, howto)
|
||||
bfd * abfd;
|
||||
reloc_howto_type *howto;
|
||||
reloc_howto_type * howto;
|
||||
{
|
||||
return !howto->pc_relative && howto->type != 11;
|
||||
return !howto->pc_relative && howto->type != ARM_RVA32;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -689,8 +693,8 @@ coff_thumb_pcrel_9 (abfd, reloc_entry, symbol, data, input_section,
|
||||
|
||||
|
||||
static CONST struct reloc_howto_struct *
|
||||
arm_reloc_type_lookup(abfd,code)
|
||||
bfd *abfd;
|
||||
coff_arm_reloc_type_lookup (abfd, code)
|
||||
bfd * abfd;
|
||||
bfd_reloc_code_real_type code;
|
||||
{
|
||||
#define ASTD(i,j) case i: return &aoutarm_std_reloc_howto[j]
|
||||
@ -720,9 +724,6 @@ arm_reloc_type_lookup(abfd,code)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define coff_bfd_reloc_type_lookup arm_reloc_type_lookup
|
||||
|
||||
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
|
||||
#define COFF_PAGE_SIZE 0x1000
|
||||
/* Turn a howto into a reloc nunmber */
|
||||
@ -731,29 +732,54 @@ arm_reloc_type_lookup(abfd,code)
|
||||
#define BADMAG(x) ARMBADMAG(x)
|
||||
#define ARM 1 /* Customize coffcode.h */
|
||||
|
||||
/* The set of global variables that mark the total size of each kind
|
||||
of glue required, plus a BFD to hang the glue sections onto.
|
||||
Note: These variable should not be made static, since in a *-pe
|
||||
build there are two versions of this file compiled, one for pe
|
||||
objects and one for pei objects, and they want to share these
|
||||
variables. */
|
||||
#if defined COFF_IMAGE_WITH_PE
|
||||
extern long int global_thumb_glue_size;
|
||||
#else
|
||||
long int global_thumb_glue_size = 0;
|
||||
#endif
|
||||
/* Extend the coff_link_hash_table structure with a few ARM specific fields.
|
||||
This allows us to store global data here without actually creating any
|
||||
global variables, which is a no-no in the BFD world. */
|
||||
struct coff_arm_link_hash_table
|
||||
{
|
||||
/* The original coff_link_hash_table structure. MUST be first field. */
|
||||
struct coff_link_hash_table root;
|
||||
|
||||
/* The size in bytes of the section containg the Thumb-to-ARM glue. */
|
||||
long int thumb_glue_size;
|
||||
|
||||
/* The size in bytes of the section containg the ARM-to-Thumb glue. */
|
||||
long int arm_glue_size;
|
||||
|
||||
#if defined COFF_IMAGE_WITH_PE
|
||||
extern long int global_arm_glue_size;
|
||||
#else
|
||||
long int global_arm_glue_size = 0;
|
||||
#endif
|
||||
/* An arbitary input BFD chosen to hold the glue sections. */
|
||||
bfd * bfd_of_glue_owner;
|
||||
};
|
||||
|
||||
#if defined COFF_IMAGE_WITH_PE
|
||||
extern bfd * bfd_of_glue_owner;
|
||||
#else
|
||||
bfd * bfd_of_glue_owner = NULL;
|
||||
#endif
|
||||
/* Get the ARM coff linker hash table from a link_info structure. */
|
||||
#define coff_arm_hash_table(info) \
|
||||
((struct coff_arm_link_hash_table *) ((info)->hash))
|
||||
|
||||
/* Create an ARM coff linker hash table. */
|
||||
|
||||
static struct bfd_link_hash_table *
|
||||
coff_arm_link_hash_table_create (abfd)
|
||||
bfd * abfd;
|
||||
{
|
||||
struct coff_arm_link_hash_table * ret;
|
||||
|
||||
ret = ((struct coff_arm_link_hash_table *)
|
||||
bfd_alloc (abfd, sizeof (struct coff_arm_link_hash_table)));
|
||||
if (ret == (struct coff_arm_link_hash_table *) NULL)
|
||||
return NULL;
|
||||
|
||||
if (! _bfd_coff_link_hash_table_init
|
||||
(& ret->root, abfd, _bfd_coff_link_hash_newfunc))
|
||||
{
|
||||
bfd_release (abfd, ret);
|
||||
return (struct bfd_link_hash_table *) NULL;
|
||||
}
|
||||
|
||||
ret->thumb_glue_size = 0;
|
||||
ret->arm_glue_size = 0;
|
||||
ret->bfd_of_glue_owner = NULL;
|
||||
|
||||
return & ret->root.root;
|
||||
}
|
||||
|
||||
/* some typedefs for holding instructions */
|
||||
typedef unsigned long int insn32;
|
||||
@ -804,7 +830,7 @@ insert_thumb_branch (br_insn, rel_off)
|
||||
|
||||
rel_off >>= 1; /* half word aligned address */
|
||||
low_bits = rel_off & 0x000007FF; /* the bottom 11 bits */
|
||||
high_bits = ( rel_off >> 11 ) & 0x000007FF; /* the top 11 bits */
|
||||
high_bits = (rel_off >> 11) & 0x000007FF; /* the top 11 bits */
|
||||
|
||||
if ((br_insn & LOW_HI_ORDER) == LOW_HI_ORDER)
|
||||
br_insn = LOW_HI_ORDER | (low_bits << 16) | high_bits;
|
||||
@ -825,8 +851,8 @@ find_thumb_glue (info, name, input_bfd)
|
||||
char * name;
|
||||
bfd * input_bfd;
|
||||
{
|
||||
char * tmp_name = 0;
|
||||
struct coff_link_hash_entry * myh = 0;
|
||||
char * tmp_name;
|
||||
struct coff_link_hash_entry * myh;
|
||||
|
||||
tmp_name = ((char *)
|
||||
bfd_malloc (strlen (name) + strlen (THUMB2ARM_GLUE_ENTRY_NAME)));
|
||||
@ -835,14 +861,12 @@ find_thumb_glue (info, name, input_bfd)
|
||||
|
||||
sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
|
||||
|
||||
myh = coff_link_hash_lookup (coff_hash_table (info),
|
||||
tmp_name,
|
||||
false, false, true);
|
||||
myh = coff_link_hash_lookup
|
||||
(coff_hash_table (info), tmp_name, false, false, true);
|
||||
|
||||
if (myh == NULL)
|
||||
{
|
||||
_bfd_error_handler ("%s: unable to find THUMB glue '%s' for `%s'",
|
||||
bfd_get_filename (input_bfd), tmp_name, name);
|
||||
}
|
||||
_bfd_error_handler ("%s: unable to find THUMB glue '%s' for `%s'",
|
||||
bfd_get_filename (input_bfd), tmp_name, name);
|
||||
|
||||
free (tmp_name);
|
||||
|
||||
@ -855,8 +879,8 @@ find_arm_glue (info, name, input_bfd)
|
||||
char * name;
|
||||
bfd * input_bfd;
|
||||
{
|
||||
char *tmp_name = 0;
|
||||
struct coff_link_hash_entry *myh = 0;
|
||||
char * tmp_name;
|
||||
struct coff_link_hash_entry * myh;
|
||||
|
||||
tmp_name = ((char *)
|
||||
bfd_malloc (strlen (name) + strlen (ARM2THUMB_GLUE_ENTRY_NAME)));
|
||||
@ -865,15 +889,12 @@ find_arm_glue (info, name, input_bfd)
|
||||
|
||||
sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
|
||||
|
||||
myh = coff_link_hash_lookup (coff_hash_table (info),
|
||||
tmp_name,
|
||||
false, false, true);
|
||||
myh = coff_link_hash_lookup
|
||||
(coff_hash_table (info), tmp_name, false, false, true);
|
||||
|
||||
if (myh == NULL)
|
||||
{
|
||||
_bfd_error_handler ("%s: unable to find ARM glue '%s' for `%s'",
|
||||
bfd_get_filename (input_bfd), tmp_name, name);
|
||||
}
|
||||
_bfd_error_handler ("%s: unable to find ARM glue '%s' for `%s'",
|
||||
bfd_get_filename (input_bfd), tmp_name, name);
|
||||
|
||||
free (tmp_name);
|
||||
|
||||
@ -898,8 +919,8 @@ find_arm_glue (info, name, input_bfd)
|
||||
|
||||
#define ARM2THUMB_GLUE_SIZE 12
|
||||
static const insn32
|
||||
a2t1_ldr_insn = 0xe59fc000,
|
||||
a2t2_bx_r12_insn = 0xe12fff1c,
|
||||
a2t1_ldr_insn = 0xe59fc000,
|
||||
a2t2_bx_r12_insn = 0xe12fff1c,
|
||||
a2t3_func_addr_insn = 0x00000001;
|
||||
|
||||
/*
|
||||
@ -1094,22 +1115,29 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
|| h->class == C_THUMBEXTFUNC)
|
||||
{
|
||||
/* Arm code calling a Thumb function */
|
||||
unsigned long int tmp;
|
||||
long int my_offset;
|
||||
asection * s = 0;
|
||||
long int ret_offset;
|
||||
struct coff_link_hash_entry * myh;
|
||||
|
||||
unsigned long int tmp;
|
||||
long int my_offset;
|
||||
asection * s;
|
||||
long int ret_offset;
|
||||
struct coff_link_hash_entry * myh;
|
||||
struct coff_arm_link_hash_table * globals;
|
||||
|
||||
myh = find_arm_glue (info, name, input_bfd);
|
||||
if (myh == NULL)
|
||||
return false;
|
||||
|
||||
my_offset = myh->root.u.def.value;
|
||||
globals = coff_arm_hash_table (info);
|
||||
|
||||
s = bfd_get_section_by_name (bfd_of_glue_owner,
|
||||
BFD_ASSERT (globals != NULL);
|
||||
BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
|
||||
|
||||
my_offset = myh->root.u.def.value;
|
||||
|
||||
s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
|
||||
ARM2THUMB_GLUE_SECTION_NAME);
|
||||
BFD_ASSERT (s != NULL);
|
||||
BFD_ASSERT (s->contents != NULL);
|
||||
BFD_ASSERT (s->output_section != NULL);
|
||||
|
||||
if ((my_offset & 0x01) == 0x01)
|
||||
{
|
||||
@ -1128,20 +1156,24 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
--my_offset;
|
||||
myh->root.u.def.value = my_offset;
|
||||
|
||||
bfd_put_32 (output_bfd, a2t1_ldr_insn, s->contents + my_offset);
|
||||
bfd_put_32 (output_bfd, a2t1_ldr_insn,
|
||||
s->contents + my_offset);
|
||||
|
||||
bfd_put_32 (output_bfd, a2t2_bx_r12_insn, s->contents + my_offset + 4);
|
||||
bfd_put_32 (output_bfd, a2t2_bx_r12_insn,
|
||||
s->contents + my_offset + 4);
|
||||
|
||||
/* It's a thumb address. Add the low order bit. */
|
||||
bfd_put_32 (output_bfd, h_val | a2t3_func_addr_insn, s->contents + my_offset + 8);
|
||||
bfd_put_32 (output_bfd, h_val | a2t3_func_addr_insn,
|
||||
s->contents + my_offset + 8);
|
||||
}
|
||||
|
||||
BFD_ASSERT (my_offset <= global_arm_glue_size);
|
||||
BFD_ASSERT (my_offset <= globals->arm_glue_size);
|
||||
|
||||
tmp = bfd_get_32 (input_bfd, contents + rel->r_vaddr - input_section->vma);
|
||||
tmp = bfd_get_32 (input_bfd, contents + rel->r_vaddr
|
||||
- input_section->vma);
|
||||
|
||||
tmp = tmp & 0xFF000000;
|
||||
|
||||
|
||||
/* Somehow these are both 4 too far, so subtract 8. */
|
||||
ret_offset =
|
||||
s->output_offset
|
||||
@ -1154,7 +1186,8 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
|
||||
tmp = tmp | ((ret_offset >> 2) & 0x00FFFFFF);
|
||||
|
||||
bfd_put_32 (output_bfd, tmp, contents + rel->r_vaddr - input_section->vma);
|
||||
bfd_put_32 (output_bfd, tmp, contents + rel->r_vaddr
|
||||
- input_section->vma);
|
||||
|
||||
done = 1;
|
||||
}
|
||||
@ -1168,23 +1201,30 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
|| h->class == C_LABEL)
|
||||
{
|
||||
/* Thumb code calling an ARM function */
|
||||
asection * s = 0;
|
||||
long int my_offset;
|
||||
unsigned long int tmp;
|
||||
long int ret_offset;
|
||||
struct coff_link_hash_entry * myh;
|
||||
asection * s = 0;
|
||||
long int my_offset;
|
||||
unsigned long int tmp;
|
||||
long int ret_offset;
|
||||
struct coff_link_hash_entry * myh;
|
||||
struct coff_arm_link_hash_table * globals;
|
||||
|
||||
myh = find_thumb_glue (info, name, input_bfd);
|
||||
if (myh == NULL)
|
||||
return false;
|
||||
|
||||
globals = coff_arm_hash_table (info);
|
||||
|
||||
BFD_ASSERT (globals != NULL);
|
||||
BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
|
||||
|
||||
my_offset = myh->root.u.def.value;
|
||||
|
||||
s = bfd_get_section_by_name (bfd_of_glue_owner,
|
||||
s = bfd_get_section_by_name (globals->bfd_of_glue_owner,
|
||||
THUMB2ARM_GLUE_SECTION_NAME);
|
||||
|
||||
BFD_ASSERT (s != NULL);
|
||||
BFD_ASSERT (s->contents != NULL);
|
||||
BFD_ASSERT (s->output_section != NULL);
|
||||
|
||||
if ((my_offset & 0x01) == 0x01)
|
||||
{
|
||||
@ -1222,9 +1262,10 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
s->contents + my_offset + 4);
|
||||
}
|
||||
|
||||
BFD_ASSERT (my_offset <= global_thumb_glue_size);
|
||||
BFD_ASSERT (my_offset <= globals->thumb_glue_size);
|
||||
|
||||
/* Now go back and fix up the original bl insn to point here. */
|
||||
/* Now go back and fix up the original BL insn to point
|
||||
to here. */
|
||||
ret_offset =
|
||||
s->output_offset
|
||||
+ my_offset
|
||||
@ -1232,11 +1273,13 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
+ rel->r_vaddr)
|
||||
-4;
|
||||
|
||||
tmp = bfd_get_32 (input_bfd, contents + rel->r_vaddr - input_section->vma);
|
||||
tmp = bfd_get_32 (input_bfd, contents + rel->r_vaddr
|
||||
- input_section->vma);
|
||||
|
||||
bfd_put_32 (output_bfd,
|
||||
insert_thumb_branch (tmp, ret_offset),
|
||||
contents + rel->r_vaddr - input_section->vma);
|
||||
contents + rel->r_vaddr
|
||||
- input_section->vma);
|
||||
|
||||
done = 1;
|
||||
}
|
||||
@ -1308,7 +1351,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
bfd_vma address = rel->r_vaddr - input_section->vma;
|
||||
|
||||
if (address > input_section->_raw_size)
|
||||
rstat = bfd_reloc_outofrange;
|
||||
rstat = bfd_reloc_outofrange;
|
||||
else
|
||||
{
|
||||
bfd_vma relocation = val + addend;
|
||||
@ -1492,48 +1535,57 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined COFF_IMAGE_WITH_PE || ! defined COFF_WITH_PE
|
||||
#ifndef COFF_WITH_PE
|
||||
boolean
|
||||
arm_allocate_interworking_sections (info)
|
||||
struct bfd_link_info *info;
|
||||
bfd_arm_allocate_interworking_sections (info)
|
||||
struct bfd_link_info * info;
|
||||
{
|
||||
asection * s;
|
||||
bfd_byte * foo;
|
||||
asection * s;
|
||||
bfd_byte * foo;
|
||||
struct coff_arm_link_hash_table * globals;
|
||||
#if 0
|
||||
static char test_char = '1';
|
||||
static char test_char = '1';
|
||||
#endif
|
||||
|
||||
if (global_arm_glue_size != 0)
|
||||
globals = coff_arm_hash_table (info);
|
||||
|
||||
BFD_ASSERT (globals != NULL);
|
||||
|
||||
if (globals->arm_glue_size != 0)
|
||||
{
|
||||
BFD_ASSERT (bfd_of_glue_owner != NULL);
|
||||
BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
|
||||
|
||||
s = bfd_get_section_by_name (bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
|
||||
s = bfd_get_section_by_name
|
||||
(globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
|
||||
|
||||
BFD_ASSERT (s != NULL);
|
||||
|
||||
foo = (bfd_byte *) bfd_alloc (bfd_of_glue_owner, global_arm_glue_size);
|
||||
foo = (bfd_byte *) bfd_alloc
|
||||
(globals->bfd_of_glue_owner, globals->arm_glue_size);
|
||||
#if 0
|
||||
memset (foo, test_char, global_arm_glue_size);
|
||||
memset (foo, test_char, globals->arm_glue_size);
|
||||
#endif
|
||||
|
||||
s->_raw_size = s->_cooked_size = global_arm_glue_size;
|
||||
s->_raw_size = s->_cooked_size = globals->arm_glue_size;
|
||||
s->contents = foo;
|
||||
}
|
||||
|
||||
if (global_thumb_glue_size != 0)
|
||||
if (globals->thumb_glue_size != 0)
|
||||
{
|
||||
BFD_ASSERT (bfd_of_glue_owner != NULL);
|
||||
BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
|
||||
|
||||
s = bfd_get_section_by_name (bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
|
||||
s = bfd_get_section_by_name
|
||||
(globals->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
|
||||
|
||||
BFD_ASSERT (s != NULL);
|
||||
|
||||
foo = (bfd_byte *) bfd_alloc (bfd_of_glue_owner, global_thumb_glue_size);
|
||||
foo = (bfd_byte *) bfd_alloc
|
||||
(globals->bfd_of_glue_owner, globals->thumb_glue_size);
|
||||
#if 0
|
||||
memset (foo, test_char, global_thumb_glue_size);
|
||||
memset (foo, test_char, globals->thumb_glue_size);
|
||||
#endif
|
||||
|
||||
s->_raw_size = s->_cooked_size = global_thumb_glue_size;
|
||||
s->_raw_size = s->_cooked_size = globals->thumb_glue_size;
|
||||
s->contents = foo;
|
||||
}
|
||||
|
||||
@ -1545,16 +1597,19 @@ record_arm_to_thumb_glue (info, h)
|
||||
struct bfd_link_info * info;
|
||||
struct coff_link_hash_entry * h;
|
||||
{
|
||||
const char * name = h->root.root.string;
|
||||
register asection * s;
|
||||
char * tmp_name;
|
||||
struct coff_link_hash_entry * myh;
|
||||
const char * name = h->root.root.string;
|
||||
register asection * s;
|
||||
char * tmp_name;
|
||||
struct coff_link_hash_entry * myh;
|
||||
struct coff_arm_link_hash_table * globals;
|
||||
|
||||
globals = coff_arm_hash_table (info);
|
||||
|
||||
BFD_ASSERT (bfd_of_glue_owner != NULL);
|
||||
BFD_ASSERT (globals != NULL);
|
||||
BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
|
||||
|
||||
s = bfd_get_section_by_name (bfd_of_glue_owner,
|
||||
ARM2THUMB_GLUE_SECTION_NAME);
|
||||
s = bfd_get_section_by_name
|
||||
(globals->bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
|
||||
|
||||
BFD_ASSERT (s != NULL);
|
||||
|
||||
@ -1565,9 +1620,8 @@ record_arm_to_thumb_glue (info, h)
|
||||
|
||||
sprintf (tmp_name, ARM2THUMB_GLUE_ENTRY_NAME, name);
|
||||
|
||||
myh = coff_link_hash_lookup (coff_hash_table (info),
|
||||
tmp_name,
|
||||
false, false, true);
|
||||
myh = coff_link_hash_lookup
|
||||
(coff_hash_table (info), tmp_name, false, false, true);
|
||||
|
||||
if (myh != NULL)
|
||||
{
|
||||
@ -1575,18 +1629,17 @@ record_arm_to_thumb_glue (info, h)
|
||||
return; /* we've already seen this guy */
|
||||
}
|
||||
|
||||
|
||||
/* The only trick here is using global_arm_glue_size as the value. Even
|
||||
/* The only trick here is using globals->arm_glue_size as the value. Even
|
||||
though the section isn't allocated yet, this is where we will be putting
|
||||
it. */
|
||||
|
||||
bfd_coff_link_add_one_symbol (info, bfd_of_glue_owner, tmp_name,
|
||||
bfd_coff_link_add_one_symbol (info, globals->bfd_of_glue_owner, tmp_name,
|
||||
BSF_EXPORT | BSF_GLOBAL,
|
||||
s, global_arm_glue_size + 1,
|
||||
s, globals->arm_glue_size + 1,
|
||||
NULL, true, false,
|
||||
(struct bfd_link_hash_entry **) & myh);
|
||||
|
||||
global_arm_glue_size += ARM2THUMB_GLUE_SIZE;
|
||||
globals->arm_glue_size += ARM2THUMB_GLUE_SIZE;
|
||||
|
||||
free (tmp_name);
|
||||
|
||||
@ -1598,14 +1651,20 @@ record_thumb_to_arm_glue (info, h)
|
||||
struct bfd_link_info * info;
|
||||
struct coff_link_hash_entry * h;
|
||||
{
|
||||
const char * name = h->root.root.string;
|
||||
register asection * s;
|
||||
char * tmp_name;
|
||||
struct coff_link_hash_entry * myh;
|
||||
const char * name = h->root.root.string;
|
||||
register asection * s;
|
||||
char * tmp_name;
|
||||
struct coff_link_hash_entry * myh;
|
||||
struct coff_arm_link_hash_table * globals;
|
||||
|
||||
BFD_ASSERT (bfd_of_glue_owner != NULL);
|
||||
|
||||
globals = coff_arm_hash_table (info);
|
||||
|
||||
BFD_ASSERT (globals != NULL);
|
||||
BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
|
||||
|
||||
s = bfd_get_section_by_name (bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
|
||||
s = bfd_get_section_by_name
|
||||
(globals->bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
|
||||
|
||||
BFD_ASSERT (s != NULL);
|
||||
|
||||
@ -1615,9 +1674,8 @@ record_thumb_to_arm_glue (info, h)
|
||||
|
||||
sprintf (tmp_name, THUMB2ARM_GLUE_ENTRY_NAME, name);
|
||||
|
||||
myh = coff_link_hash_lookup (coff_hash_table (info),
|
||||
tmp_name,
|
||||
false, false, true);
|
||||
myh = coff_link_hash_lookup
|
||||
(coff_hash_table (info), tmp_name, false, false, true);
|
||||
|
||||
if (myh != NULL)
|
||||
{
|
||||
@ -1625,8 +1683,8 @@ record_thumb_to_arm_glue (info, h)
|
||||
return; /* we've already seen this guy */
|
||||
}
|
||||
|
||||
bfd_coff_link_add_one_symbol (info, bfd_of_glue_owner, tmp_name,
|
||||
BSF_LOCAL, s, global_thumb_glue_size + 1,
|
||||
bfd_coff_link_add_one_symbol (info, globals->bfd_of_glue_owner, tmp_name,
|
||||
BSF_LOCAL, s, globals->thumb_glue_size + 1,
|
||||
NULL, true, false,
|
||||
(struct bfd_link_hash_entry **) & myh);
|
||||
|
||||
@ -1647,24 +1705,83 @@ record_thumb_to_arm_glue (info, h)
|
||||
myh = NULL;
|
||||
|
||||
/* Now allocate another symbol to switch back to arm mode. */
|
||||
bfd_coff_link_add_one_symbol (info, bfd_of_glue_owner, tmp_name,
|
||||
BSF_LOCAL, s, global_thumb_glue_size + 4,
|
||||
bfd_coff_link_add_one_symbol (info, globals->bfd_of_glue_owner, tmp_name,
|
||||
BSF_LOCAL, s, globals->thumb_glue_size + 4,
|
||||
NULL, true, false,
|
||||
(struct bfd_link_hash_entry **) & myh);
|
||||
|
||||
free (tmp_name);
|
||||
|
||||
global_thumb_glue_size += THUMB2ARM_GLUE_SIZE;
|
||||
globals->thumb_glue_size += THUMB2ARM_GLUE_SIZE;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Select a BFD to be used to hold the sections used by the glue code.
|
||||
This function is called from the linker scripts in ld/emultempl/
|
||||
{armcoff/pe}.em */
|
||||
boolean
|
||||
arm_process_before_allocation (abfd, info)
|
||||
bfd_arm_get_bfd_for_interworking (abfd, info)
|
||||
bfd * abfd;
|
||||
struct bfd_link_info * info;
|
||||
{
|
||||
struct coff_arm_link_hash_table * globals;
|
||||
flagword flags;
|
||||
asection * sec;
|
||||
|
||||
/* If we are only performing a partial link do not bother
|
||||
getting a bfd to hold the glue. */
|
||||
if (info->relocateable)
|
||||
return true;
|
||||
|
||||
globals = coff_arm_hash_table (info);
|
||||
|
||||
BFD_ASSERT (globals != NULL);
|
||||
|
||||
if (globals->bfd_of_glue_owner != NULL)
|
||||
return true;
|
||||
|
||||
sec = bfd_get_section_by_name (abfd, ARM2THUMB_GLUE_SECTION_NAME);
|
||||
|
||||
if (sec == NULL)
|
||||
{
|
||||
flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
|
||||
|
||||
sec = bfd_make_section (abfd, ARM2THUMB_GLUE_SECTION_NAME);
|
||||
|
||||
if (sec == NULL
|
||||
|| ! bfd_set_section_flags (abfd, sec, flags)
|
||||
|| ! bfd_set_section_alignment (abfd, sec, 2))
|
||||
return false;
|
||||
}
|
||||
|
||||
sec = bfd_get_section_by_name (abfd, THUMB2ARM_GLUE_SECTION_NAME);
|
||||
|
||||
if (sec == NULL)
|
||||
{
|
||||
flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
|
||||
|
||||
sec = bfd_make_section (abfd, THUMB2ARM_GLUE_SECTION_NAME);
|
||||
|
||||
if (sec == NULL
|
||||
|| ! bfd_set_section_flags (abfd, sec, flags)
|
||||
|| ! bfd_set_section_alignment (abfd, sec, 2))
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Save the bfd for later use. */
|
||||
globals->bfd_of_glue_owner = abfd;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean
|
||||
bfd_arm_process_before_allocation (abfd, info)
|
||||
bfd * abfd;
|
||||
struct bfd_link_info * info;
|
||||
{
|
||||
asection * sec;
|
||||
struct coff_arm_link_hash_table * globals;
|
||||
|
||||
/* If we are only performing a partial link do not bother
|
||||
to construct any glue. */
|
||||
@ -1676,7 +1793,10 @@ arm_process_before_allocation (abfd, info)
|
||||
|
||||
_bfd_coff_get_external_symbols (abfd);
|
||||
|
||||
BFD_ASSERT (bfd_of_glue_owner != NULL);
|
||||
globals = coff_arm_hash_table (info);
|
||||
|
||||
BFD_ASSERT (globals != NULL);
|
||||
BFD_ASSERT (globals->bfd_of_glue_owner != NULL);
|
||||
|
||||
/* Rummage around all the relocs and map the glue vectors. */
|
||||
sec = abfd->sections;
|
||||
@ -1707,7 +1827,7 @@ arm_process_before_allocation (abfd, info)
|
||||
|
||||
symndx = rel->r_symndx;
|
||||
|
||||
/* If the relocation is not against a symbol it cannot concern us. */
|
||||
/* If the relocation is not against a symbol it cannot concern us. */
|
||||
if (symndx == -1)
|
||||
continue;
|
||||
|
||||
@ -1758,9 +1878,20 @@ arm_process_before_allocation (abfd, info)
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif /* COFF_IMAGE_WITH_PE or not COFF_WITH_PE */
|
||||
#endif /* ! COFF_WITH_PE */
|
||||
|
||||
#define coff_bfd_reloc_type_lookup coff_arm_reloc_type_lookup
|
||||
#define coff_relocate_section coff_arm_relocate_section
|
||||
#define coff_bfd_is_local_label_name coff_arm_is_local_label_name
|
||||
#define coff_adjust_symndx coff_arm_adjust_symndx
|
||||
#define coff_link_output_has_begun coff_arm_link_output_has_begun
|
||||
#define coff_final_link_postscript coff_arm_final_link_postscript
|
||||
#define coff_bfd_merge_private_bfd_data coff_arm_merge_private_bfd_data
|
||||
#define coff_bfd_print_private_bfd_data coff_arm_print_private_bfd_data
|
||||
#define coff_bfd_set_private_flags _bfd_coff_arm_set_private_flags
|
||||
#define coff_bfd_copy_private_bfd_data coff_arm_copy_private_bfd_data
|
||||
#define coff_bfd_link_hash_table_create coff_arm_link_hash_table_create
|
||||
|
||||
#define coff_relocate_section coff_arm_relocate_section
|
||||
|
||||
/* When doing a relocateable link, we want to convert ARM26 relocs
|
||||
into ARM26D relocs. */
|
||||
@ -1789,14 +1920,13 @@ coff_arm_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp)
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined COFF_IMAGE_WITH_PE || ! defined COFF_WITH_PE
|
||||
/* Called when merging the private data areas of two BFDs.
|
||||
This is important as it allows us to detect if we are
|
||||
attempting to merge binaries compiled for different ARM
|
||||
targets, eg different CPUs or differents APCS's. */
|
||||
|
||||
boolean
|
||||
coff_arm_bfd_merge_private_bfd_data (ibfd, obfd)
|
||||
static boolean
|
||||
coff_arm_merge_private_bfd_data (ibfd, obfd)
|
||||
bfd * ibfd;
|
||||
bfd * obfd;
|
||||
{
|
||||
@ -1892,8 +2022,8 @@ coff_arm_bfd_merge_private_bfd_data (ibfd, obfd)
|
||||
|
||||
/* Display the flags field. */
|
||||
|
||||
boolean
|
||||
coff_arm_bfd_print_private_bfd_data (abfd, ptr)
|
||||
static boolean
|
||||
coff_arm_print_private_bfd_data (abfd, ptr)
|
||||
bfd * abfd;
|
||||
PTR ptr;
|
||||
{
|
||||
@ -1925,10 +2055,12 @@ coff_arm_bfd_print_private_bfd_data (abfd, ptr)
|
||||
/* Copies the given flags into the coff_tdata.flags field.
|
||||
Typically these flags come from the f_flags[] field of
|
||||
the COFF filehdr structure, which contains important,
|
||||
target specific information. */
|
||||
target specific information.
|
||||
Note: Although this function is static, it is explicitly
|
||||
called from both coffcode.h and peicode.h. */
|
||||
|
||||
boolean
|
||||
coff_arm_bfd_set_private_flags (abfd, flags)
|
||||
static boolean
|
||||
_bfd_coff_arm_set_private_flags (abfd, flags)
|
||||
bfd * abfd;
|
||||
flagword flags;
|
||||
{
|
||||
@ -1965,8 +2097,8 @@ coff_arm_bfd_set_private_flags (abfd, flags)
|
||||
/* Copy the important parts of the target specific data
|
||||
from one instance of a BFD to another. */
|
||||
|
||||
boolean
|
||||
coff_arm_bfd_copy_private_bfd_data (src, dest)
|
||||
static boolean
|
||||
coff_arm_copy_private_bfd_data (src, dest)
|
||||
bfd * src;
|
||||
bfd * dest;
|
||||
{
|
||||
@ -2020,7 +2152,7 @@ coff_arm_bfd_copy_private_bfd_data (src, dest)
|
||||
#define LOCAL_LABEL_PREFIX "."
|
||||
#define USER_LABEL_PREFIX "_"
|
||||
|
||||
boolean
|
||||
static boolean
|
||||
coff_arm_is_local_label_name (abfd, name)
|
||||
bfd * abfd;
|
||||
const char * name;
|
||||
@ -2052,27 +2184,7 @@ coff_arm_is_local_label_name (abfd, name)
|
||||
default: return false; /* Cannot make our minds up - default to false so that it will not be stripped by accident. */
|
||||
}
|
||||
}
|
||||
#endif /* COFF_IMAGE_WITH_PE or not COFF_WITH_PE */
|
||||
|
||||
#define coff_bfd_is_local_label_name coff_arm_is_local_label_name
|
||||
#define coff_adjust_symndx coff_arm_adjust_symndx
|
||||
|
||||
#define coff_link_output_has_begun coff_arm_link_output_has_begun
|
||||
#define coff_final_link_postscript coff_arm_final_link_postscript
|
||||
#define coff_bfd_merge_private_bfd_data coff_arm_bfd_merge_private_bfd_data
|
||||
#define coff_bfd_print_private_bfd_data coff_arm_bfd_print_private_bfd_data
|
||||
#define coff_bfd_set_private_flags coff_arm_bfd_set_private_flags
|
||||
#define coff_bfd_copy_private_bfd_data coff_arm_bfd_copy_private_bfd_data
|
||||
|
||||
extern boolean coff_arm_bfd_set_private_flags ();
|
||||
extern boolean coff_arm_bfd_merge_private_bfd_data ();
|
||||
extern boolean coff_arm_bfd_copy_private_bfd_data ();
|
||||
extern boolean coff_arm_bfd_print_private_bfd_data ();
|
||||
extern boolean coff_arm_final_link_postscript ();
|
||||
extern boolean coff_arm_link_output_has_begun ();
|
||||
extern boolean coff_arm_is_local_label_name ();
|
||||
|
||||
#if defined COFF_IMAGE_WITH_PE || ! defined COFF_WITH_PE
|
||||
/* This piece of machinery exists only to guarantee that the bfd that holds
|
||||
the glue section is written last.
|
||||
|
||||
@ -2081,28 +2193,35 @@ extern boolean coff_arm_is_local_label_name ();
|
||||
|
||||
krk@cygnus.com */
|
||||
|
||||
boolean
|
||||
coff_arm_link_output_has_begun (sub)
|
||||
static boolean
|
||||
coff_arm_link_output_has_begun (sub, info)
|
||||
bfd * sub;
|
||||
struct coff_final_link_info * info;
|
||||
{
|
||||
return (sub->output_has_begun || sub == bfd_of_glue_owner);
|
||||
return (sub->output_has_begun || sub == coff_arm_hash_table (info->info)->bfd_of_glue_owner);
|
||||
}
|
||||
|
||||
boolean
|
||||
static boolean
|
||||
coff_arm_final_link_postscript (abfd, pfinfo)
|
||||
bfd * abfd;
|
||||
struct coff_final_link_info * pfinfo;
|
||||
{
|
||||
if (bfd_of_glue_owner != NULL)
|
||||
struct coff_arm_link_hash_table * globals = coff_arm_hash_table (pfinfo->info);
|
||||
|
||||
BFD_ASSERT (globals != NULL);
|
||||
|
||||
if (globals->bfd_of_glue_owner != NULL)
|
||||
{
|
||||
if (! _bfd_coff_link_input_bfd (pfinfo, bfd_of_glue_owner))
|
||||
if (! _bfd_coff_link_input_bfd (pfinfo, globals->bfd_of_glue_owner))
|
||||
return false;
|
||||
bfd_of_glue_owner->output_has_begun = true;
|
||||
|
||||
globals->bfd_of_glue_owner->output_has_begun = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif /* COFF_IMAGE_WITH_PE or not COFF_WITH_PE */
|
||||
|
||||
#if 0
|
||||
#define coff_SWAP_sym_in arm_bfd_coff_swap_sym_in
|
||||
|
||||
static void coff_swap_sym_in PARAMS ((bfd *, PTR, PTR));
|
||||
@ -2164,6 +2283,7 @@ arm_bfd_coff_swap_sym_in (abfd, ext1, in1)
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#include "coffcode.h"
|
||||
|
||||
|
@ -863,7 +863,8 @@ dependent COFF routines:
|
||||
. struct bfd_link_hash_entry **hashp));
|
||||
.
|
||||
. boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
|
||||
. bfd * abfd ));
|
||||
. bfd * abfd,
|
||||
. struct coff_final_link_info * pfinfo));
|
||||
. boolean (*_bfd_coff_final_link_postscript) PARAMS ((
|
||||
. bfd * abfd,
|
||||
. struct coff_final_link_info * pfinfo));
|
||||
@ -982,8 +983,8 @@ dependent COFF routines:
|
||||
. ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
|
||||
. (info, abfd, name, flags, section, value, string, cp, coll, hashp))
|
||||
.
|
||||
.#define bfd_coff_link_output_has_begun(a) \
|
||||
. ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a))
|
||||
.#define bfd_coff_link_output_has_begun(a,p) \
|
||||
. ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
|
||||
.#define bfd_coff_final_link_postscript(a,p) \
|
||||
. ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
|
||||
.
|
||||
@ -1028,6 +1029,8 @@ coff_new_section_hook (abfd, section)
|
||||
bfd * abfd;
|
||||
asection * section;
|
||||
{
|
||||
combined_entry_type *native;
|
||||
|
||||
section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
|
||||
|
||||
#ifdef RS6000COFF_C
|
||||
@ -1044,9 +1047,21 @@ coff_new_section_hook (abfd, section)
|
||||
|
||||
@@ The 10 is a guess at a plausible maximum number of aux entries
|
||||
(but shouldn't be a constant). */
|
||||
coffsymbol (section->symbol)->native =
|
||||
(combined_entry_type *) bfd_zalloc (abfd,
|
||||
sizeof (combined_entry_type) * 10);
|
||||
native = ((combined_entry_type *)
|
||||
bfd_zalloc (abfd, sizeof (combined_entry_type) * 10));
|
||||
if (native == NULL)
|
||||
return false;
|
||||
|
||||
/* We don't need to set up n_name, n_value, or n_scnum in the native
|
||||
symbol information, since they'll be overriden by the BFD symbol
|
||||
anyhow. However, we do need to set the type and storage class,
|
||||
in case this symbol winds up getting written out. The value 0
|
||||
for n_numaux is already correct. */
|
||||
|
||||
native->u.syment.n_type = T_NULL;
|
||||
native->u.syment.n_sclass = C_STAT;
|
||||
|
||||
coffsymbol (section->symbol)->native = native;
|
||||
|
||||
/* The .stab section must be aligned to 2**2 at most, because
|
||||
otherwise there may be gaps in the section which gdb will not
|
||||
@ -1329,7 +1344,7 @@ coff_mkobject_hook (abfd, filehdr, aouthdr)
|
||||
|
||||
#ifdef ARM
|
||||
/* Set the flags field from the COFF header read in */
|
||||
if (! coff_arm_bfd_set_private_flags (abfd, internal_f->f_flags))
|
||||
if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
|
||||
coff->flags = 0;
|
||||
#endif
|
||||
|
||||
@ -2198,11 +2213,10 @@ coff_compute_section_file_positions (abfd)
|
||||
asection *previous = (asection *) NULL;
|
||||
file_ptr sofar = FILHSZ;
|
||||
boolean align_adjust;
|
||||
|
||||
#ifndef I960
|
||||
unsigned int count;
|
||||
#ifdef ALIGN_SECTIONS_IN_FILE
|
||||
file_ptr old_sofar;
|
||||
#endif
|
||||
unsigned int count;
|
||||
|
||||
#ifdef RS6000COFF_C
|
||||
/* On XCOFF, if we have symbols, set up the .debug section. */
|
||||
@ -2741,13 +2755,22 @@ coff_write_object_contents (abfd)
|
||||
{
|
||||
unsigned int i, count;
|
||||
asymbol **psym;
|
||||
coff_symbol_type *csym;
|
||||
coff_symbol_type *csym = NULL;
|
||||
asymbol **psymsec;
|
||||
|
||||
psymsec = NULL;
|
||||
count = bfd_get_symcount (abfd);
|
||||
for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
|
||||
{
|
||||
/* Here *PSYM is the section symbol for CURRENT. */
|
||||
if ((*psym)->section != current)
|
||||
continue;
|
||||
|
||||
/* Remember the location of the first symbol in this
|
||||
section. */
|
||||
if (psymsec == NULL)
|
||||
psymsec = psym;
|
||||
|
||||
/* See if this is the section symbol. */
|
||||
if (strcmp ((*psym)->name, current->name) == 0)
|
||||
{
|
||||
csym = coff_symbol_from (abfd, *psym);
|
||||
@ -2757,6 +2780,9 @@ coff_write_object_contents (abfd)
|
||||
|| csym->native->u.syment.n_sclass != C_STAT
|
||||
|| csym->native->u.syment.n_type != T_NULL)
|
||||
continue;
|
||||
|
||||
/* Here *PSYM is the section symbol for CURRENT. */
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2793,6 +2819,24 @@ coff_write_object_contents (abfd)
|
||||
IMAGE_COMDAT_SELECT_EXACT_MATCH;
|
||||
break;
|
||||
}
|
||||
|
||||
/* The COMDAT symbol must be the first symbol from this
|
||||
section in the symbol table. In order to make this
|
||||
work, we move the COMDAT symbol before the first
|
||||
symbol we found in the search above. It's OK to
|
||||
rearrange the symbol table at this point, because
|
||||
coff_renumber_symbols is going to rearrange it
|
||||
further and fix up all the aux entries. */
|
||||
if (psym != psymsec)
|
||||
{
|
||||
asymbol *hold;
|
||||
asymbol **pcopy;
|
||||
|
||||
hold = *psym;
|
||||
for (pcopy = psym; pcopy > psymsec; pcopy--)
|
||||
pcopy[0] = pcopy[-1];
|
||||
*psymsec = hold;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* COFF_WITH_PE */
|
||||
@ -3353,7 +3397,8 @@ coff_slurp_line_table (abfd, asect)
|
||||
|
||||
warned = false;
|
||||
symndx = dst.l_addr.l_symndx;
|
||||
if (symndx < 0 || symndx >= obj_raw_syment_count (abfd))
|
||||
if (symndx < 0
|
||||
|| (unsigned long) symndx >= obj_raw_syment_count (abfd))
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
("%s: warning: illegal symbol index %ld in line numbers",
|
||||
@ -4098,8 +4143,9 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
|
||||
#ifndef coff_link_output_has_begun
|
||||
#define coff_link_output_has_begun _coff_link_output_has_begun
|
||||
static boolean
|
||||
_coff_link_output_has_begun (abfd)
|
||||
_coff_link_output_has_begun (abfd, info)
|
||||
bfd * abfd;
|
||||
struct bfd_link_info * info;
|
||||
{
|
||||
return abfd->output_has_begun;
|
||||
}
|
||||
|
@ -244,6 +244,9 @@ coff_link_check_ar_symbols (abfd, info, pneeded)
|
||||
bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
|
||||
|
||||
if ((sym.n_sclass == C_EXT
|
||||
#ifdef C_SYSTEM
|
||||
|| sym.n_sclass == C_SYSTEM
|
||||
#endif
|
||||
|| (sym_is_global && (*sym_is_global) (abfd, &sym)))
|
||||
&& (sym.n_scnum != 0 || sym.n_value != 0))
|
||||
{
|
||||
@ -334,6 +337,9 @@ coff_link_add_symbols (abfd, info)
|
||||
bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
|
||||
|
||||
if (sym.n_sclass == C_EXT
|
||||
#ifdef C_SYSTEM
|
||||
|| sym.n_sclass == C_SYSTEM
|
||||
#endif
|
||||
|| (sym_is_global && (*sym_is_global) (abfd, &sym)))
|
||||
{
|
||||
const char *name;
|
||||
@ -762,7 +768,7 @@ _bfd_coff_final_link (abfd, info)
|
||||
== bfd_target_coff_flavour))
|
||||
{
|
||||
sub = p->u.indirect.section->owner;
|
||||
if (! sub->output_has_begun)
|
||||
if (! bfd_coff_link_output_has_begun (sub, & finfo))
|
||||
{
|
||||
if (! _bfd_coff_link_input_bfd (&finfo, sub))
|
||||
goto error_return;
|
||||
@ -783,6 +789,9 @@ _bfd_coff_final_link (abfd, info)
|
||||
}
|
||||
}
|
||||
|
||||
if (! bfd_coff_final_link_postscript (abfd, & finfo))
|
||||
goto error_return;
|
||||
|
||||
/* Free up the buffers used by _bfd_coff_link_input_bfd. */
|
||||
|
||||
coff_debug_merge_hash_table_free (&finfo.debug_merge);
|
||||
@ -1298,8 +1307,9 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
|
||||
*secpp = bfd_com_section_ptr;
|
||||
}
|
||||
|
||||
/* Extract the flag indicating if this symbol is used by a relocation */
|
||||
if (( finfo->info->strip != strip_none
|
||||
/* Extract the flag indicating if this symbol is used by a
|
||||
relocation. */
|
||||
if ((finfo->info->strip != strip_none
|
||||
|| finfo->info->discard != discard_none)
|
||||
&& finfo->info->relocateable)
|
||||
dont_skip_symbol = *indexp;
|
||||
@ -1319,6 +1329,9 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
|
||||
if (! skip)
|
||||
{
|
||||
if (isym.n_sclass == C_EXT
|
||||
#ifdef C_SYSTEM
|
||||
|| isym.n_sclass == C_SYSTEM
|
||||
#endif
|
||||
|| (sym_is_global && (*sym_is_global) (input_bfd, &isym)))
|
||||
{
|
||||
/* This is a global symbol. Global symbols come at the
|
||||
@ -1339,11 +1352,23 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
|
||||
}
|
||||
|
||||
/* If we stripping debugging symbols, and this is a debugging
|
||||
symbol, then skip it. */
|
||||
symbol, then skip it. FIXME: gas sets the section to N_ABS
|
||||
for some types of debugging symbols; I don't know if this is
|
||||
a bug or not. In any case, we handle it here. */
|
||||
if (! skip
|
||||
&& finfo->info->strip == strip_debugger
|
||||
&& ! dont_skip_symbol
|
||||
&& isym.n_scnum == N_DEBUG)
|
||||
&& (isym.n_scnum == N_DEBUG
|
||||
|| (isym.n_scnum == N_ABS
|
||||
&& (isym.n_sclass == C_AUTO
|
||||
|| isym.n_sclass == C_REG
|
||||
|| isym.n_sclass == C_MOS
|
||||
|| isym.n_sclass == C_MOE
|
||||
|| isym.n_sclass == C_MOU
|
||||
|| isym.n_sclass == C_ARG
|
||||
|| isym.n_sclass == C_REGPARM
|
||||
|| isym.n_sclass == C_FIELD
|
||||
|| isym.n_sclass == C_EOS))))
|
||||
skip = true;
|
||||
|
||||
/* If some symbols are stripped based on the name, work out the
|
||||
@ -2373,6 +2398,7 @@ _bfd_coff_write_task_globals (h, data)
|
||||
{
|
||||
struct coff_final_link_info *finfo = (struct coff_final_link_info *) data;
|
||||
boolean rtnval = true;
|
||||
boolean save_global_to_static;
|
||||
|
||||
if (h->indx < 0)
|
||||
{
|
||||
@ -2380,9 +2406,12 @@ _bfd_coff_write_task_globals (h, data)
|
||||
{
|
||||
case bfd_link_hash_defined:
|
||||
case bfd_link_hash_defweak:
|
||||
save_global_to_static = finfo->global_to_static;
|
||||
finfo->global_to_static = true;
|
||||
rtnval = _bfd_coff_write_global_sym (h, data);
|
||||
finfo->global_to_static = false;
|
||||
finfo->global_to_static = save_global_to_static;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1355,8 +1355,8 @@ pe_print_idata(abfd, vfile)
|
||||
bfd_vma forward_chain;
|
||||
bfd_vma dll_name;
|
||||
bfd_vma first_thunk;
|
||||
int idx;
|
||||
int j;
|
||||
int idx = 0;
|
||||
bfd_size_type j;
|
||||
char *dll;
|
||||
|
||||
fprintf (file,
|
||||
@ -1438,13 +1438,9 @@ pe_print_idata(abfd, vfile)
|
||||
{
|
||||
int ordinal;
|
||||
char *member_name;
|
||||
bfd_vma hint_member;
|
||||
bfd_vma hint_member = 0;
|
||||
bfd_vma iat_member;
|
||||
|
||||
if (time_stamp != 0)
|
||||
{
|
||||
}
|
||||
|
||||
if (hint_addr != 0)
|
||||
hint_member = bfd_get_32 (abfd, data + idx + j);
|
||||
iat_member = bfd_get_32 (abfd, data + idx2 + j);
|
||||
@ -1517,8 +1513,8 @@ pe_print_edata (abfd, vfile)
|
||||
short minor_ver;
|
||||
bfd_vma name; /* rva - relative to image base */
|
||||
long base; /* ordinal base */
|
||||
long num_functions; /* Number in the export address table */
|
||||
long num_names; /* Number in the name pointer table */
|
||||
unsigned long num_functions; /* Number in the export address table */
|
||||
unsigned long num_names; /* Number in the name pointer table */
|
||||
bfd_vma eat_addr; /* rva to the export address table */
|
||||
bfd_vma npt_addr; /* rva to the Export Name Pointer Table */
|
||||
bfd_vma ot_addr; /* rva to the Ordinal Table */
|
||||
@ -1608,10 +1604,10 @@ pe_print_edata (abfd, vfile)
|
||||
|
||||
fprintf(file,
|
||||
"\tExport Address Table \t\t%lx\n",
|
||||
(unsigned long) edt.num_functions);
|
||||
edt.num_functions);
|
||||
|
||||
fprintf(file,
|
||||
"\t[Name Pointer/Ordinal] Table\t%ld\n", edt.num_names);
|
||||
"\t[Name Pointer/Ordinal] Table\t%lu\n", edt.num_names);
|
||||
|
||||
fprintf(file,
|
||||
"Table Addresses\n");
|
||||
@ -1981,7 +1977,7 @@ pe_print_private_bfd_data (abfd, vfile)
|
||||
{
|
||||
fputc ('\n', file);
|
||||
|
||||
return pe_saved_bfd_print_private_bfd_data (abfd, vfile);
|
||||
return pe_saved_coff_bfd_print_private_bfd_data (abfd, vfile);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -2046,7 +2042,7 @@ pe_mkobject_hook (abfd, filehdr, aouthdr)
|
||||
#endif
|
||||
|
||||
#ifdef ARM
|
||||
if (! coff_arm_bfd_set_private_flags (abfd, internal_f->f_flags))
|
||||
if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
|
||||
coff_data (abfd) ->flags = 0;
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user