* reloc.c: Fix formatting.
* riscix.c: Likewise.
* rs6000-core.c: Likewise.
* xcoff-target.h: Likewise.
+2001-01-01 Kazu Hirata <kazu@hxi.com>
+
+ * reloc.c: Fix formatting.
+ * riscix.c: Likewise.
+ * rs6000-core.c: Likewise.
+ * xcoff-target.h: Likewise.
+
2000-12-29 Hans-Peter Nilsson <hp@bitrange.com>
* elfcode.h (elf_object_p): Also restore the bfd mach field on
to the relocation offset. Its interpretation is dependent upon
the howto. For example, on the 68k the code:
-
| char foo[];
| main()
| {
| unlk fp
| rts
-
This could create a reloc pointing to <<foo>>, but leave the
offset in the data, something like:
-
|RELOCATION RECORDS FOR [.text]:
|offset type value
|00000006 32 _foo
|0000000c 4e5e ; unlk fp
|0000000e 4e75 ; rts
-
Using coff and an 88k, some instructions don't have enough
space in them to represent the full address range, and
pointers have to be loaded in two parts. So you'd get something like:
-
| or.u r13,r0,hi16(_foo+0x12345678)
| ld.b r2,r13,lo16(_foo+0x12345678)
| jmp r1
-
This should create two relocs, both pointing to <<_foo>>, and with
0x12340000 in their addend field. The data would consist of:
-
|RELOCATION RECORDS FOR [.text]:
|offset type value
|00000002 HVRT16 _foo+0x12340000
|00000004 1c4d5678 ; ld.b r2,r13,0x5678
|00000008 f400c001 ; jmp r1
-
The relocation routine digs out the value from the data, adds
it to the addend to get the original offset, and then adds the
value of <<_foo>>. Note that all 32 bits have to be kept around
Both relocs contain a pointer to <<foo>>, and the offsets
contain junk.
-
|RELOCATION RECORDS FOR [.text]:
|offset type value
|00000004 HI22 _foo+0x12345678
|0000000c 81c7e008 ; ret
|00000010 81e80000 ; restore
-
o <<howto>>
The <<howto>> field can be imagined as a
DESCRIPTION
The HOWTO define is horrible and will go away.
-
.#define HOWTO(C, R,S,B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
. {(unsigned)C,R,S,B, P, BI, O,SF,NAME,INPLACE,MASKSRC,MASKDST,PC}
And will be replaced with the totally magic way. But for the
moment, we are compatible, so do it this way.
-
.#define NEWHOWTO( FUNCTION, NAME,SIZE,REL,IN) HOWTO(0,0,SIZE,0,REL,0,complain_overflow_dont,FUNCTION, NAME,false,0,0,IN)
.
*/
-
bfd_reloc_status_type
bfd_perform_relocation (abfd, reloc_entry, data, input_section, output_bfd,
error_message)
else
relocation = symbol->value;
-
reloc_target_output_section = symbol->section->output_section;
/* Convert input-section-relative symbol value to absolute. */
*/
-
bfd_reloc_status_type
bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset,
input_section, error_message)
handled specially, because the value the register will have is
decided relatively late.
-
ENUM
BFD_RELOC_I960_CALLJ
ENUMDOC
ENUM
BFD_RELOC_TIC54X_16_OF_23
ENUMDOC
- This is a 16-bit reloc for the tms320c54x, where the least
- significant 16 bits of a 23-bit extended address are placed into
+ This is a 16-bit reloc for the tms320c54x, where the least
+ significant 16 bits of a 23-bit extended address are placed into
the opcode.
ENUM
BFD_RELOC_TIC54X_MS7_OF_23
ENUMDOC
This is a reloc for the tms320c54x, where the most
- significant 7 bits of a 23-bit extended address are placed into
+ significant 7 bits of a 23-bit extended address are placed into
the opcode.
ENUM
BFD_RELOC_AVR_16_PM
ENUMDOC
This is a 16 bit reloc for the AVR that stores 17 bit value (usually
- program memory address) into 16 bits.
+ program memory address) into 16 bits.
ENUM
BFD_RELOC_AVR_LO8_LDI
ENUMDOC
.typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
*/
-
/*
FUNCTION
bfd_reloc_type_lookup
*/
-
reloc_howto_type *
bfd_reloc_type_lookup (abfd, code)
bfd *abfd;
static reloc_howto_type bfd_howto_32 =
HOWTO (0, 00, 2, 32, false, 0, complain_overflow_bitfield, 0, "VRT32", false, 0xffffffff, 0xffffffff, true);
-
/*
INTERNAL_FUNCTION
bfd_default_reloc_type_lookup
DESCRIPTION
Provides a default relocation lookup routine for any architecture.
-
*/
reloc_howto_type *
Copyright (C) 1994, 95, 96, 97, 98, 99, 2000
Free Software Foundation, Inc.
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
-
+
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
/* RISC iX overloads the MAGIC field to indicate more than just the usual
[ZNO]MAGIC values. Also included are squeezing information and
shared library usage. */
#define SPOMAGIC (MF_USES_SL|OMAGIC) /* OMAGIC with large header */
/* -- may contain a ref to a */
/* shared lib required by the */
- /* object. */
+ /* object. */
#define SLOMAGIC (MF_IS_SL|OMAGIC) /* A reference to a shared library */
/* The text portion of the object */
/* contains "overflow text" from */
/* the shared library to be linked */
/* in with an object */
-#define QMAGIC (MF_SQUEEZED|ZMAGIC) /* Sqeezed demand paged. */
+#define QMAGIC (MF_SQUEEZED|ZMAGIC) /* Sqeezed demand paged. */
/* NOTE: This interpretation of */
/* QMAGIC seems to be at variance */
/* With that used on other */
- /* architectures. */
+ /* architectures. */
#define SPZMAGIC (MF_USES_SL|ZMAGIC) /* program which uses sl */
#define SPQMAGIC (MF_USES_SL|QMAGIC) /* sqeezed ditto */
#define SLZMAGIC (MF_IS_SL|ZMAGIC) /* shared lib part of prog */
if (bfd_get_outsymbols (abfd) != (asymbol **) NULL \
&& bfd_get_symcount (abfd) != 0) \
{ \
- if (bfd_seek (abfd, (file_ptr)(N_SYMOFF(*execp)), SEEK_SET) != 0) \
+ if (bfd_seek (abfd, (file_ptr) (N_SYMOFF(*execp)), SEEK_SET) != 0) \
return false; \
\
- if (! NAME(aout,write_syms)(abfd)) return false; \
+ if (! NAME(aout,write_syms) (abfd)) return false; \
\
- if (bfd_seek (abfd, (file_ptr)(N_TRELOFF(*execp)), SEEK_SET) != 0) \
+ if (bfd_seek (abfd, (file_ptr) (N_TRELOFF(*execp)), SEEK_SET) != 0) \
return false; \
\
if (! riscix_squirt_out_relocs (abfd, obj_textsec (abfd))) \
return false; \
- if (bfd_seek (abfd, (file_ptr)(N_DRELOFF(*execp)), SEEK_SET) != 0) \
+ if (bfd_seek (abfd, (file_ptr) (N_DRELOFF(*execp)), SEEK_SET) != 0) \
return false; \
\
- if (!NAME(aout,squirt_out_relocs)(abfd, obj_datasec (abfd))) \
+ if (!NAME(aout,squirt_out_relocs) (abfd, obj_datasec (abfd))) \
return false; \
} \
}
#define RISCIX_TABLE_SIZE \
(sizeof (riscix_std_reloc_howto) / sizeof (reloc_howto_type))
-
static bfd_reloc_status_type
riscix_fix_pcrel_26_done (abfd, reloc_entry, symbol, data, input_section,
output_bfd, error_message)
bfd_size_type addr = reloc_entry->address;
long target = bfd_get_32 (abfd, (bfd_byte *) data + addr);
bfd_reloc_status_type flag = bfd_reloc_ok;
-
+
/* If this is an undefined symbol, return error */
if (symbol->section == &bfd_und_section
&& (symbol->flags & BSF_WEAK) == 0)
/* Now the ARM magic... Change the reloc type so that it is marked as done.
Strictly this is only necessary if we are doing a partial relocation. */
reloc_entry->howto = &riscix_std_reloc_howto[7];
-
+
return flag;
}
/* For RISC iX, in pc-relative relocs the r_pcrel bit means that the
relocation has been done already (Only for the 26-bit one I think)???!!!
*/
-
+
if (r_length == 3)
r_pcrel = r_pcrel ? 0 : 1;
-
#if 0
/* For a standard reloc, the addend is in the object file. */
arelent **generic;
unsigned char *native, *natptr;
size_t each_size;
-
+
unsigned int count = section->reloc_count;
size_t natsize;
return true;
}
-
/*
* This is just like the standard aoutx.h version but we need to do our
* own mapping of external reloc type values to howto entries.
*/
long
-MY(canonicalize_reloc)(abfd, section, relptr, symbols)
+MY(canonicalize_reloc) (abfd, section, relptr, symbols)
bfd *abfd;
sec_ptr section;
arelent **relptr;
unsigned int count, c;
extern reloc_howto_type NAME(aout,std_howto_table)[];
- /* If we have already read in the relocation table, return the values. */
+ /* If we have already read in the relocation table, return the values. */
if (section->flags & SEC_CONSTRUCTOR) {
arelent_chain *chain = section->constructor_chain;
return section->reloc_count;
}
- if (!NAME(aout,slurp_reloc_table)(abfd, section, symbols))
+ if (!NAME(aout,slurp_reloc_table) (abfd, section, symbols))
return -1;
tblptr = section->relocation;
return section->reloc_count;
}
-/* This is the same as NAME(aout,some_aout_object_p), but has different
+/* This is the same as NAME(aout,some_aout_object_p), but has different
expansions of the macro definitions. */
const bfd_target *
struct aout_data_struct *rawptr, *oldrawptr;
const bfd_target *result;
- rawptr = ((struct aout_data_struct *)
+ rawptr = ((struct aout_data_struct *)
bfd_zalloc (abfd, sizeof (struct aout_data_struct )));
if (rawptr == NULL)
if (N_DYNAMIC(*execp))
abfd->flags |= DYNAMIC;
-
- if ((execp->a_info & MF_SQUEEZED) != 0) /* Squeezed files aren't supported
+ if ((execp->a_info & MF_SQUEEZED) != 0) /* Squeezed files aren't supported
(yet)! */
{
bfd_set_error (bfd_error_wrong_format);
/* The default relocation entry size is that of traditional V7 Unix. */
obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
- /* The default symbol entry size is that of traditional Unix. */
+ /* The default symbol entry size is that of traditional Unix. */
obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE;
obj_aout_external_syms (abfd) = NULL;
: (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS));
obj_bsssec (abfd)->flags = SEC_ALLOC;
- result = (*callback_to_real_object_p)(abfd);
+ result = (*callback_to_real_object_p) (abfd);
#if defined(MACH) || defined(STAT_FOR_EXEC)
/* The original heuristic doesn't work in some important cases. The
return result;
}
-
static const bfd_target *
MY(object_p) (abfd)
bfd *abfd;
if (!(MACHTYPE_OK (N_MACHTYPE (exec)))) return 0;
#endif
- NAME(aout,swap_exec_header_in)(abfd, &exec_bytes, &exec);
+ NAME(aout,swap_exec_header_in) (abfd, &exec_bytes, &exec);
target = riscix_some_aout_object_p (abfd, &exec, MY(callback));
return target;
}
-
#include "aout-target.h"
#undef SCNHDR
-
/* ------------------------------------------------------------------------ */
/* Support for core file stuff.. */
/* ------------------------------------------------------------------------ */
AIX_CORE_DUMPX_CORE is defined (by configure) on AIX 4.3+, and
CORE_VERSION_1 is defined (by AIX core.h) as 2 on AIX 4.3+ and as 1 on AIX
4.1 and 4.2. AIX pre-4.1 (aka 3.x) either doesn't define CORE_VERSION_1
- or else defines it as 0. */
+ or else defines it as 0. */
#if defined(CORE_VERSION_1) && !CORE_VERSION_1
# undef CORE_VERSION_1
/* The following union and macros allow this module to compile on all AIX
versions and to handle both core_dumpx and core_dump on 4.3+. CNEW_*()
and COLD_*() macros respectively retrieve core_dumpx and core_dump
- values. */
+ values. */
-/* Union of 32-bit and 64-bit versions of ld_info. */
+/* Union of 32-bit and 64-bit versions of ld_info. */
typedef union {
#ifdef __ld_info32
#endif
} LdInfo;
-/* Union of old and new core dump structures. */
+/* Union of old and new core dump structures. */
typedef union {
#ifdef AIX_CORE_DUMPX_CORE
4.3+ with appropriate SMIT config */
} CoreHdr;
-/* Union of old and new vm_info structures. */
+/* Union of old and new vm_info structures. */
#ifdef CORE_VERSION_1
typedef union {
} VmInfo;
#endif
-/* Return whether CoreHdr C is in new or old format. */
+/* Return whether CoreHdr C is in new or old format. */
#ifdef AIX_CORE_DUMPX_CORE
# define CORE_NEW(c) (!(c).old.c_entries)
# define CORE_NEW(c) 0
#endif
-/* Return the c_stackorg field from struct core_dumpx C. */
+/* Return the c_stackorg field from struct core_dumpx C. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_STACKORG(c) (c).c_stackorg
# define CNEW_STACKORG(c) 0
#endif
-/* Return the offset to the loader region from struct core_dump C. */
+/* Return the offset to the loader region from struct core_dump C. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_LOADER(c) (c).c_loader
# define CNEW_LOADER(c) 0
#endif
-/* Return the offset to the loader region from struct core_dump C. */
+/* Return the offset to the loader region from struct core_dump C. */
#define COLD_LOADER(c) (c).c_tab
-/* Return the c_lsize field from struct core_dumpx C. */
+/* Return the c_lsize field from struct core_dumpx C. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_LSIZE(c) (c).c_lsize
# define CNEW_LSIZE(c) 0
#endif
-/* Return the c_dataorg field from struct core_dumpx C. */
+/* Return the c_dataorg field from struct core_dumpx C. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_DATAORG(c) (c).c_dataorg
# define CNEW_DATAORG(c) 0
#endif
-/* Return the c_datasize field from struct core_dumpx C. */
+/* Return the c_datasize field from struct core_dumpx C. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_DATASIZE(c) (c).c_datasize
# define CNEW_DATASIZE(c) 0
#endif
-/* Return the c_impl field from struct core_dumpx C. */
+/* Return the c_impl field from struct core_dumpx C. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_IMPL(c) (c).c_impl
# define CNEW_IMPL(c) 0
#endif
-/* Return the command string from struct core_dumpx C. */
+/* Return the command string from struct core_dumpx C. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_COMM(c) (c).c_u.U_proc.pi_comm
# define CNEW_COMM(c) 0
#endif
-/* Return the command string from struct core_dump C. */
+/* Return the command string from struct core_dump C. */
#ifdef CORE_VERSION_1
# define COLD_COMM(c) (c).c_u.U_comm
# define COLD_COMM(c) (c).c_u.u_comm
#endif
-/* Return the struct __context64 pointer from struct core_dumpx C. */
+/* Return the struct __context64 pointer from struct core_dumpx C. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_CONTEXT64(c) (c).c_flt.hctx.r64
# define CNEW_CONTEXT64(c) c
#endif
-/* Return the struct mstsave pointer from struct core_dumpx C. */
+/* Return the struct mstsave pointer from struct core_dumpx C. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_MSTSAVE(c) (c).c_flt.hctx.r32
# define CNEW_MSTSAVE(c) c
#endif
-/* Return the struct mstsave pointer from struct core_dump C. */
+/* Return the struct mstsave pointer from struct core_dump C. */
#ifdef CORE_VERSION_1
# define COLD_MSTSAVE(c) (c).c_mst
# define COLD_MSTSAVE(c) (c).c_u.u_save
#endif
-/* Return whether struct core_dumpx is from a 64-bit process. */
+/* Return whether struct core_dumpx is from a 64-bit process. */
#ifdef AIX_CORE_DUMPX_CORE
# define CNEW_PROC64(c) IS_PROC64(&(c).c_u.U_proc)
#endif
/* Magic end-of-stack addresses for old core dumps. This is _very_ fragile,
- but I don't see any easy way to get that info right now. */
+ but I don't see any easy way to get that info right now. */
#ifdef CORE_VERSION_1
# define COLD_STACKEND 0x2ff23000
#endif
/* Size of the leading portion that old and new core dump structures have in
- common. */
+ common. */
#define CORE_COMMONSZ ((int)&((struct core_dump *)0)->c_entries + \
sizeof (((struct core_dump *)0)->c_entries))
-/* Try to read into CORE the header from the core file associated with ABFD.
- Return success. */
+/* Try to read into CORE the header from the core file associated with ABFD.
+ Return success. */
static boolean
read_hdr (bfd *abfd, CoreHdr *core)
return false;
/* Read the leading portion that old and new core dump structures have in
- common. */
+ common. */
if (bfd_read (core, CORE_COMMONSZ, 1, abfd) != CORE_COMMONSZ)
return false;
- /* Read the trailing portion of the structure. */
+ /* Read the trailing portion of the structure. */
size = CORE_NEW (*core) ? sizeof (core->new) : sizeof (core->old)
- CORE_COMMONSZ;
return bfd_read ((char *)core + CORE_COMMONSZ, size, 1, abfd) == size;
}
/* Decide if a given bfd represents a `core' file or not. There really is no
- magic number or anything like, in rs6000coff. */
+ magic number or anything like, in rs6000coff. */
const bfd_target *
rs6000coff_core_p (abfd)
bfd_size_type size;
char *tmpptr;
- /* Values from new and old core structures. */
+ /* Values from new and old core structures. */
int c_flag;
file_ptr c_stack, c_regoff, c_loader;
bfd_size_type c_size, c_regsize, c_lsize;
return NULL;
}
- /* Copy fields from new or old core structure. */
+ /* Copy fields from new or old core structure. */
if (CORE_NEW (core))
{
c_flag = core.new.c_flag;
additional shared library sections in a full core. */
if (!(c_flag & (FULL_CORE | CORE_TRUNC)))
{
- /* If the size is wrong, it means we're misinterpreting something. */
+ /* If the size is wrong, it means we're misinterpreting something. */
if (c_stack + (file_ptr) c_size != statbuf.st_size)
{
bfd_set_error (bfd_error_wrong_format);
memcpy (tmpptr, &core, size);
set_tdata (abfd, tmpptr);
- /* Set architecture. */
+ /* Set architecture. */
if (CORE_NEW (core))
{
enum bfd_architecture arch;
bfd_default_set_arch_mach (abfd, arch, mach);
}
- /* .stack section. */
+ /* .stack section. */
if (!make_bfd_asection (abfd, ".stack",
SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
c_size, c_stackend - c_size, c_stack))
return NULL;
- /* .reg section for all registers. */
+ /* .reg section for all registers. */
if (!make_bfd_asection (abfd, ".reg",
SEC_HAS_CONTENTS,
c_regsize, (bfd_vma) 0, c_regoff))
uint ldi_next;
bfd_vma ldi_dataorg;
- /* Fields from new and old core structures. */
+ /* Fields from new and old core structures. */
bfd_size_type c_datasize, c_vmregions;
file_ptr c_data, c_vmm;
/* .data sections from loaded objects. */
if (proc64)
- size = (int)((LdInfo *)0)->l64.ldinfo_filename;
+ size = (int) ((LdInfo *)0)->l64.ldinfo_filename;
else
- size = (int)((LdInfo *)0)->l32.ldinfo_filename;
+ size = (int) ((LdInfo *)0)->l32.ldinfo_filename;
while (1)
{
{
ldi_core = ldinfo.l32.ldinfo_core;
ldi_datasize = ldinfo.l32.ldinfo_datasize;
- ldi_dataorg = (bfd_vma)(long) ldinfo.l32.ldinfo_dataorg;
+ ldi_dataorg = (bfd_vma) (long) ldinfo.l32.ldinfo_dataorg;
ldi_next = ldinfo.l32.ldinfo_next;
}
}
else
{
- vminfo_addr = (bfd_vma)(long) vminfo.old.vminfo_addr;
+ vminfo_addr = (bfd_vma) (long) vminfo.old.vminfo_addr;
vminfo_size = vminfo.old.vminfo_size;
vminfo_offset = vminfo.old.vminfo_offset;
}
}
#endif
- return abfd->xvec; /* this is garbage for now. */
+ return abfd->xvec; /* this is garbage for now. */
}
-
-
-/* return `true' if given core is from the given executable.. */
+/* return `true' if given core is from the given executable.. */
boolean
rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd)
bfd *core_bfd;
c_loader = (file_ptr) COLD_LOADER (core.old);
if (CORE_NEW (core) && CNEW_PROC64 (core.new))
- size = (int)((LdInfo *)0)->l64.ldinfo_filename;
+ size = (int) ((LdInfo *)0)->l64.ldinfo_filename;
else
- size = (int)((LdInfo *)0)->l32.ldinfo_filename;
+ size = (int) ((LdInfo *)0)->l32.ldinfo_filename;
if (bfd_seek (core_bfd, c_loader + size, SEEK_SET) != 0)
return false;
#include "coffcode.h"
-/* 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. */
const bfd_target TARGET_SYM =
{
BFD_JUMP_TABLE_DYNAMIC (_bfd_xcoff),
NULL,
-
+
COFF_SWAP_TABLE
};