1992-10-15 11:59:13 +01:00
|
|
|
/* BFD back-end for AMD 29000 COFF binaries.
|
1994-04-07 03:58:27 +02:00
|
|
|
Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
1991-07-31 18:58:05 +02:00
|
|
|
Contributed by David Wood at New York University 7/8/91.
|
1991-07-16 01:43:15 +02:00
|
|
|
|
1991-07-31 18:58:05 +02:00
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
1991-07-16 01:43:15 +02:00
|
|
|
|
1991-07-31 18:58:05 +02:00
|
|
|
This program is free software; you can redistribute it and/or modify
|
1991-07-16 01:43:15 +02:00
|
|
|
it under the terms of the GNU General Public License as published by
|
1991-07-31 18:58:05 +02:00
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
1991-07-16 01:43:15 +02:00
|
|
|
|
1991-07-31 18:58:05 +02:00
|
|
|
This program is distributed in the hope that it will be useful,
|
1991-07-16 01:43:15 +02:00
|
|
|
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
|
1991-07-31 18:58:05 +02:00
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
1991-07-16 01:43:15 +02:00
|
|
|
|
|
|
|
#define A29K 1
|
|
|
|
|
|
|
|
#include "bfd.h"
|
1991-10-11 11:11:37 +01:00
|
|
|
#include "sysdep.h"
|
1991-07-16 01:43:15 +02:00
|
|
|
#include "libbfd.h"
|
|
|
|
#include "obstack.h"
|
* aout-encap.c, aoutf1.h, aoutx.h, archive.c, bout.c, coff-a29k.c,
coff-h8300.c, coff-i386.c, coff-i960.c, coff-m68k.c, coff-m88k.c,
coff-mips.c, coff-rs6000.c, cpu-h300.c, elf.c, i386aout.c,
newos3.c, stab-syms.c, syms.c: All these files have had their
#includes altered to point to the new places.
1991-12-01 06:24:02 +01:00
|
|
|
#include "coff/a29k.h"
|
|
|
|
#include "coff/internal.h"
|
1991-07-16 01:43:15 +02:00
|
|
|
#include "libcoff.h"
|
|
|
|
|
Extensive changes to move the bulk of the linker into BFD so that
more efficient backend code can be written for specific object
files. Only existing efficient backend is a.out.
* seclet.c, seclet.h: Removed.
* hash.c, linker.c, genlink.h: New files.
* bfd-in.h: Removed bfd_error_vector. Declared hash table
structures and functions.
(JUMP_TABLE): Removed bfd_seclet_link, added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* All backends: Changed accordingly.
* bfd-in2.h: Rebuilt.
* bfd.c (struct _bfd): Added link_next and archive_pass fields.
Removed ld_symbols field.
(bfd_nonrepresentable_section, bfd_undefined_symbol,
bfd_reloc_value_truncated, bfd_reloc_is_dangerous,
bfd_error_vector): Removed.
(bfd_default_error_trap, bfd_error_trap,
bfd_error_nonrepresentabltrap): Removed.
(bfd_get_relocated_section_contents): Pass link_info. Pass
link_order instead of seclet. Pass symbols.
(bfd_relax_section): Pass link_info.
(bfd_seclet_link): Removed.
(bfd_link_hash_table_create, bfd_link_add_symbols,
bfd_final_link): New macros.
* libbfd-in.h: If __GNUC__ is defined and alloca is not, define
alloca as __builtin_alloca. Declare internal linking functions.
* libbfd.h: Rebuilt.
* libbfd.c (bfd_seek): Comment out fseek assertion. It's worked
for months.
* reloc.c (reloc_howto_type): Added error_message argument to
special_function field. Changed all callers and all definitions.
(bfd_get_reloc_size): Make argument a const pointer.
(bfd_perform_relocation): Add error_message argument to hold
string set if return value if bfd_reloc_dangerous. Changed all
callers.
(_bfd_final_link_relocate, _bfd_relocate_contents): New functions.
* section.c (asection): Renamed seclets_head and seclets_tail to
link_order_head and link_order_tail.
* targets.c (bfd_target): Replaced seclet argument with link_info
and link_order and symbols arguments in
bfd_get_relocated_section_contents. Added symbols argument to
bfd_relax_section. Removed bfd_seclet_link. Added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* libaout.h (struct aoutdata): Added external_syms,
external_sym_count, external_strings, sym_hashes fields.
(obj_aout_external_syms, obj_aout_external_sym_count,
obj_aout_external_strings, obj_aout_sym_hashes): New accessor
macros.
(WRITE_HEADERS): Only output symbols if outsymbols is not NULL.
* aoutx.h: Wrote new back end linker routines.
(translate_to_native_sym_flags): Return boolean value. Don't use
bfd_error_vector.
(NAME(aout,write_syms)): Return boolean value. Check return value
of translate_to_native_sym_flags and bfd_write.
* aout-target.h (final_link_callback): New function.
(MY_bfd_final_link): New function.
* aout-adobe.c (aout_adobe_write_object_contents): Check return
value of aout_32_write_syms.
* hp300hpux.c (MY(write_object_contents)): Likewise.
* i386lynx.c (WRITE_HEADERS): Likewise.
* libaout.h (WRITE_HEADERS): Likewise.
* bout.c: Changed functions to use link_info->callbacks rather
than bfd_error_vector, and link_orders rather than seclets.
* coff-alpha.c: Likewise.
* coff-h8300.c: Likewise.
* coff-h8500.c: Likewise.
* coff-sh.c: Likewise.
* coff-z8k.c: Likewise.
* elf32-hppa.c: Likewise.
* reloc16.c: Likewise.
* coff-alpha.c (alpha_ecoff_get_relocated_section_contents): Look
up _gp in the hash table rather than in outsymbols.
* coff-a29k.c (a29k_reloc): Pass errors back in new error_message
argument rather than printing them.
* coffcode.h (bfd_coff_reloc16_extra_cases): Take link_info and
link_order arguments rather than seclet. Changed all uses and
definitions.
(bfd_coff_reloc16_estimate): Pass link_info arguments. Changed
all uses and definitions.
* libcoff.h: Rebuilt.
* ecoff.c (ecoff_get_extr): If symbol is defined by linker, but
not by ECOFF, make it scAbs.
(ecoff_bfd_final_link): Renamed from ecoff_bfd_seclet_link and
rewritten.
* elf32-mips.c (mips_elf_final_link): Renamed from
mips_elf_seclet_link and rewritten.
* elf32-hppa.c (elf32_hppa_stub_description): Added link_info
field.
(new_stub, add_stub_by_name, hppa_elf_build_arg_reloc_stub,
hppa_elf_build_long_branch_stub, hppa_look_for_stubs_in_section):
Added link_info arguments. Changed all callers.
* elfcode.h (elf_slurp_symbol_table): Don't quit if outsymbols is
not NULL.
* oasys.c (oasys_write_sections): Return boolean value rather than
using bfd_error_vector.
(oasys_write_object_contents): Check return value of
oasys_write_sections.
* hosts/std-host.h: Don't declare qsort or strtol.
* Makefile.in: Rebuild dependencies.
(BFD_LIBS): Removed seclet.o. Added hash.o and linker.o.
(CFILES): Removed seclet.c. Added hash.c and linker.c.
(HFILES): Removed seclet.h. Added genlink.h.
1993-12-30 20:56:50 +01:00
|
|
|
static long get_symbol_value PARAMS ((asymbol *));
|
|
|
|
static bfd_reloc_status_type a29k_reloc
|
|
|
|
PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
|
|
|
|
|
1991-07-16 01:43:15 +02:00
|
|
|
#define INSERT_HWORD(WORD,HWORD) \
|
1991-11-13 18:09:33 +01:00
|
|
|
(((WORD) & 0xff00ff00) | (((HWORD) & 0xff00) << 8) | ((HWORD)& 0xff))
|
|
|
|
#define EXTRACT_HWORD(WORD) \
|
|
|
|
(((WORD) & 0x00ff0000) >> 8) | ((WORD)& 0xff)
|
|
|
|
#define SIGN_EXTEND_HWORD(HWORD) \
|
|
|
|
((HWORD) & 0x8000 ? (HWORD)|0xffff0000 : (HWORD))
|
1991-07-16 01:43:15 +02:00
|
|
|
|
|
|
|
/* Provided the symbol, returns the value reffed */
|
Extensive changes to move the bulk of the linker into BFD so that
more efficient backend code can be written for specific object
files. Only existing efficient backend is a.out.
* seclet.c, seclet.h: Removed.
* hash.c, linker.c, genlink.h: New files.
* bfd-in.h: Removed bfd_error_vector. Declared hash table
structures and functions.
(JUMP_TABLE): Removed bfd_seclet_link, added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* All backends: Changed accordingly.
* bfd-in2.h: Rebuilt.
* bfd.c (struct _bfd): Added link_next and archive_pass fields.
Removed ld_symbols field.
(bfd_nonrepresentable_section, bfd_undefined_symbol,
bfd_reloc_value_truncated, bfd_reloc_is_dangerous,
bfd_error_vector): Removed.
(bfd_default_error_trap, bfd_error_trap,
bfd_error_nonrepresentabltrap): Removed.
(bfd_get_relocated_section_contents): Pass link_info. Pass
link_order instead of seclet. Pass symbols.
(bfd_relax_section): Pass link_info.
(bfd_seclet_link): Removed.
(bfd_link_hash_table_create, bfd_link_add_symbols,
bfd_final_link): New macros.
* libbfd-in.h: If __GNUC__ is defined and alloca is not, define
alloca as __builtin_alloca. Declare internal linking functions.
* libbfd.h: Rebuilt.
* libbfd.c (bfd_seek): Comment out fseek assertion. It's worked
for months.
* reloc.c (reloc_howto_type): Added error_message argument to
special_function field. Changed all callers and all definitions.
(bfd_get_reloc_size): Make argument a const pointer.
(bfd_perform_relocation): Add error_message argument to hold
string set if return value if bfd_reloc_dangerous. Changed all
callers.
(_bfd_final_link_relocate, _bfd_relocate_contents): New functions.
* section.c (asection): Renamed seclets_head and seclets_tail to
link_order_head and link_order_tail.
* targets.c (bfd_target): Replaced seclet argument with link_info
and link_order and symbols arguments in
bfd_get_relocated_section_contents. Added symbols argument to
bfd_relax_section. Removed bfd_seclet_link. Added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* libaout.h (struct aoutdata): Added external_syms,
external_sym_count, external_strings, sym_hashes fields.
(obj_aout_external_syms, obj_aout_external_sym_count,
obj_aout_external_strings, obj_aout_sym_hashes): New accessor
macros.
(WRITE_HEADERS): Only output symbols if outsymbols is not NULL.
* aoutx.h: Wrote new back end linker routines.
(translate_to_native_sym_flags): Return boolean value. Don't use
bfd_error_vector.
(NAME(aout,write_syms)): Return boolean value. Check return value
of translate_to_native_sym_flags and bfd_write.
* aout-target.h (final_link_callback): New function.
(MY_bfd_final_link): New function.
* aout-adobe.c (aout_adobe_write_object_contents): Check return
value of aout_32_write_syms.
* hp300hpux.c (MY(write_object_contents)): Likewise.
* i386lynx.c (WRITE_HEADERS): Likewise.
* libaout.h (WRITE_HEADERS): Likewise.
* bout.c: Changed functions to use link_info->callbacks rather
than bfd_error_vector, and link_orders rather than seclets.
* coff-alpha.c: Likewise.
* coff-h8300.c: Likewise.
* coff-h8500.c: Likewise.
* coff-sh.c: Likewise.
* coff-z8k.c: Likewise.
* elf32-hppa.c: Likewise.
* reloc16.c: Likewise.
* coff-alpha.c (alpha_ecoff_get_relocated_section_contents): Look
up _gp in the hash table rather than in outsymbols.
* coff-a29k.c (a29k_reloc): Pass errors back in new error_message
argument rather than printing them.
* coffcode.h (bfd_coff_reloc16_extra_cases): Take link_info and
link_order arguments rather than seclet. Changed all uses and
definitions.
(bfd_coff_reloc16_estimate): Pass link_info arguments. Changed
all uses and definitions.
* libcoff.h: Rebuilt.
* ecoff.c (ecoff_get_extr): If symbol is defined by linker, but
not by ECOFF, make it scAbs.
(ecoff_bfd_final_link): Renamed from ecoff_bfd_seclet_link and
rewritten.
* elf32-mips.c (mips_elf_final_link): Renamed from
mips_elf_seclet_link and rewritten.
* elf32-hppa.c (elf32_hppa_stub_description): Added link_info
field.
(new_stub, add_stub_by_name, hppa_elf_build_arg_reloc_stub,
hppa_elf_build_long_branch_stub, hppa_look_for_stubs_in_section):
Added link_info arguments. Changed all callers.
* elfcode.h (elf_slurp_symbol_table): Don't quit if outsymbols is
not NULL.
* oasys.c (oasys_write_sections): Return boolean value rather than
using bfd_error_vector.
(oasys_write_object_contents): Check return value of
oasys_write_sections.
* hosts/std-host.h: Don't declare qsort or strtol.
* Makefile.in: Rebuild dependencies.
(BFD_LIBS): Removed seclet.o. Added hash.o and linker.o.
(CFILES): Removed seclet.c. Added hash.c and linker.c.
(HFILES): Removed seclet.h. Added genlink.h.
1993-12-30 20:56:50 +01:00
|
|
|
static long
|
|
|
|
get_symbol_value (symbol)
|
|
|
|
asymbol *symbol;
|
1991-07-16 01:43:15 +02:00
|
|
|
{
|
|
|
|
long relocation = 0;
|
|
|
|
|
Tue Jan 26 11:43:14 1993 Ian Lance Taylor (ian@cygnus.com)
* section.c (SEC_IS_COMMON): New section flag, needed for MIPS
ECOFF which has two common sections.
(bfd_com_section): Set SEC_IS_COMMON flag.
* bfd-in.h (bfd_is_com_section): New macro to test SEC_IS_COMMON.
* aoutx.h, archive.c, bout.c, coff-a29k.c, coff-m88k.c,
coff-mips.c, coffgen.c, ieee.c, oasys.c, reloc.c, syms.: Use
bfd_is_com_section macro rather than checking for equality to
bfd_com_section.
1993-01-26 20:54:07 +01:00
|
|
|
if (bfd_is_com_section (symbol->section))
|
1992-05-01 22:00:26 +02:00
|
|
|
{
|
|
|
|
relocation = 0;
|
1991-07-16 01:43:15 +02:00
|
|
|
}
|
1992-05-01 22:00:26 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
relocation = symbol->value +
|
|
|
|
symbol->section->output_section->vma +
|
|
|
|
symbol->section->output_offset;
|
|
|
|
}
|
|
|
|
|
1991-07-16 01:43:15 +02:00
|
|
|
return(relocation);
|
|
|
|
}
|
|
|
|
|
1991-11-13 18:09:33 +01:00
|
|
|
/* this function is in charge of performing all the 29k relocations */
|
|
|
|
|
* bfd.c: Remove strerror() to libiberty.
* elf.c: Remove elf_set_section_contents, use generic one. Lint.
* libbfd-in.h, libbfd.c: Add bfd_generic_set_section_contents.
* libbfd.c (bfd_generic_{get,set}_section_contents): Check that
last byte of transfer, not first byte, is within the section.
* host-aout.c: Remove `BSD' archive support. Lint.
* archures.c: Rename `struct bfd_arch_info_struct' to `struct
bfd_arch_info'. Rename `typedef bfd_arch_info_struct_type' to
`bfd_arch_info_type'. All uses changed.
* reloc.c: Rename `bfd_reloc_status_enum_type' to
`bfd_reloc_status_type'. Rename `bfd_reloc_code_enum_real_type'
to `bfd_reloc_code_real_type'. (This seems to be a misnomer,
it needs a better name.) All uses changed.
* targets.c: Rename `enum target_flavour_enum' to `enum
target_flavour', and remove the `_enum' from all of the enum
values themselves. All uses changed.
* configure.in, config/h-i386mach: i386 mach host.
* config/t-i386-aout: Use host-aout.c.
* trad-core.c: Give it its own xvec's to make it independent
of other file formats.
* ecoff.c, host-aout.c: Remove refs to trad-core.
* config/t-dec3100, t-hp300bsd, t-tahoe, t-vax: Define TRAD_CORE.
* targets.c: #ifdef TRAD_CORE, include it in the vector.
1991-10-05 06:18:08 +01:00
|
|
|
static bfd_reloc_status_type
|
Extensive changes to move the bulk of the linker into BFD so that
more efficient backend code can be written for specific object
files. Only existing efficient backend is a.out.
* seclet.c, seclet.h: Removed.
* hash.c, linker.c, genlink.h: New files.
* bfd-in.h: Removed bfd_error_vector. Declared hash table
structures and functions.
(JUMP_TABLE): Removed bfd_seclet_link, added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* All backends: Changed accordingly.
* bfd-in2.h: Rebuilt.
* bfd.c (struct _bfd): Added link_next and archive_pass fields.
Removed ld_symbols field.
(bfd_nonrepresentable_section, bfd_undefined_symbol,
bfd_reloc_value_truncated, bfd_reloc_is_dangerous,
bfd_error_vector): Removed.
(bfd_default_error_trap, bfd_error_trap,
bfd_error_nonrepresentabltrap): Removed.
(bfd_get_relocated_section_contents): Pass link_info. Pass
link_order instead of seclet. Pass symbols.
(bfd_relax_section): Pass link_info.
(bfd_seclet_link): Removed.
(bfd_link_hash_table_create, bfd_link_add_symbols,
bfd_final_link): New macros.
* libbfd-in.h: If __GNUC__ is defined and alloca is not, define
alloca as __builtin_alloca. Declare internal linking functions.
* libbfd.h: Rebuilt.
* libbfd.c (bfd_seek): Comment out fseek assertion. It's worked
for months.
* reloc.c (reloc_howto_type): Added error_message argument to
special_function field. Changed all callers and all definitions.
(bfd_get_reloc_size): Make argument a const pointer.
(bfd_perform_relocation): Add error_message argument to hold
string set if return value if bfd_reloc_dangerous. Changed all
callers.
(_bfd_final_link_relocate, _bfd_relocate_contents): New functions.
* section.c (asection): Renamed seclets_head and seclets_tail to
link_order_head and link_order_tail.
* targets.c (bfd_target): Replaced seclet argument with link_info
and link_order and symbols arguments in
bfd_get_relocated_section_contents. Added symbols argument to
bfd_relax_section. Removed bfd_seclet_link. Added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* libaout.h (struct aoutdata): Added external_syms,
external_sym_count, external_strings, sym_hashes fields.
(obj_aout_external_syms, obj_aout_external_sym_count,
obj_aout_external_strings, obj_aout_sym_hashes): New accessor
macros.
(WRITE_HEADERS): Only output symbols if outsymbols is not NULL.
* aoutx.h: Wrote new back end linker routines.
(translate_to_native_sym_flags): Return boolean value. Don't use
bfd_error_vector.
(NAME(aout,write_syms)): Return boolean value. Check return value
of translate_to_native_sym_flags and bfd_write.
* aout-target.h (final_link_callback): New function.
(MY_bfd_final_link): New function.
* aout-adobe.c (aout_adobe_write_object_contents): Check return
value of aout_32_write_syms.
* hp300hpux.c (MY(write_object_contents)): Likewise.
* i386lynx.c (WRITE_HEADERS): Likewise.
* libaout.h (WRITE_HEADERS): Likewise.
* bout.c: Changed functions to use link_info->callbacks rather
than bfd_error_vector, and link_orders rather than seclets.
* coff-alpha.c: Likewise.
* coff-h8300.c: Likewise.
* coff-h8500.c: Likewise.
* coff-sh.c: Likewise.
* coff-z8k.c: Likewise.
* elf32-hppa.c: Likewise.
* reloc16.c: Likewise.
* coff-alpha.c (alpha_ecoff_get_relocated_section_contents): Look
up _gp in the hash table rather than in outsymbols.
* coff-a29k.c (a29k_reloc): Pass errors back in new error_message
argument rather than printing them.
* coffcode.h (bfd_coff_reloc16_extra_cases): Take link_info and
link_order arguments rather than seclet. Changed all uses and
definitions.
(bfd_coff_reloc16_estimate): Pass link_info arguments. Changed
all uses and definitions.
* libcoff.h: Rebuilt.
* ecoff.c (ecoff_get_extr): If symbol is defined by linker, but
not by ECOFF, make it scAbs.
(ecoff_bfd_final_link): Renamed from ecoff_bfd_seclet_link and
rewritten.
* elf32-mips.c (mips_elf_final_link): Renamed from
mips_elf_seclet_link and rewritten.
* elf32-hppa.c (elf32_hppa_stub_description): Added link_info
field.
(new_stub, add_stub_by_name, hppa_elf_build_arg_reloc_stub,
hppa_elf_build_long_branch_stub, hppa_look_for_stubs_in_section):
Added link_info arguments. Changed all callers.
* elfcode.h (elf_slurp_symbol_table): Don't quit if outsymbols is
not NULL.
* oasys.c (oasys_write_sections): Return boolean value rather than
using bfd_error_vector.
(oasys_write_object_contents): Check return value of
oasys_write_sections.
* hosts/std-host.h: Don't declare qsort or strtol.
* Makefile.in: Rebuild dependencies.
(BFD_LIBS): Removed seclet.o. Added hash.o and linker.o.
(CFILES): Removed seclet.c. Added hash.c and linker.c.
(HFILES): Removed seclet.h. Added genlink.h.
1993-12-30 20:56:50 +01:00
|
|
|
a29k_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
|
|
|
|
error_message)
|
|
|
|
bfd *abfd;
|
|
|
|
arelent *reloc_entry;
|
|
|
|
asymbol *symbol_in;
|
|
|
|
PTR data;
|
|
|
|
asection *input_section;
|
|
|
|
bfd *output_bfd;
|
|
|
|
char **error_message;
|
1991-07-16 01:43:15 +02:00
|
|
|
{
|
1992-05-01 22:00:26 +02:00
|
|
|
/* the consth relocation comes in two parts, we have to remember
|
|
|
|
the state between calls, in these variables */
|
|
|
|
static boolean part1_consth_active = false;
|
|
|
|
static unsigned long part1_consth_value;
|
1991-11-13 18:09:33 +01:00
|
|
|
|
1992-05-01 22:00:26 +02:00
|
|
|
unsigned long insn;
|
|
|
|
unsigned long sym_value;
|
|
|
|
unsigned long unsigned_value;
|
|
|
|
unsigned short r_type;
|
|
|
|
long signed_value;
|
1991-11-13 18:09:33 +01:00
|
|
|
|
1992-05-05 01:42:03 +02:00
|
|
|
unsigned long addr = reloc_entry->address ; /*+ input_section->vma*/
|
1992-05-01 22:00:26 +02:00
|
|
|
bfd_byte *hit_data =addr + (bfd_byte *)(data);
|
1991-07-16 01:43:15 +02:00
|
|
|
|
1992-05-01 22:00:26 +02:00
|
|
|
r_type = reloc_entry->howto->type;
|
1991-10-21 17:42:54 +01:00
|
|
|
|
1992-05-05 01:42:03 +02:00
|
|
|
if (output_bfd) {
|
|
|
|
/* Partial linking - do nothing */
|
|
|
|
reloc_entry->address += input_section->output_offset;
|
|
|
|
return bfd_reloc_ok;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
1992-05-01 22:00:26 +02:00
|
|
|
if (symbol_in && (symbol_in->section == &bfd_und_section))
|
|
|
|
{
|
|
|
|
/* Keep the state machine happy in case we're called again */
|
|
|
|
if (r_type == R_IHIHALF)
|
1991-11-13 18:09:33 +01:00
|
|
|
{
|
1992-05-01 22:00:26 +02:00
|
|
|
part1_consth_active = true;
|
|
|
|
part1_consth_value = 0;
|
1991-10-21 17:42:54 +01:00
|
|
|
}
|
1992-05-01 22:00:26 +02:00
|
|
|
return(bfd_reloc_undefined);
|
|
|
|
}
|
1991-10-21 17:42:54 +01:00
|
|
|
|
1992-05-01 22:00:26 +02:00
|
|
|
if ((part1_consth_active) && (r_type != R_IHCONST))
|
|
|
|
{
|
|
|
|
part1_consth_active = false;
|
Extensive changes to move the bulk of the linker into BFD so that
more efficient backend code can be written for specific object
files. Only existing efficient backend is a.out.
* seclet.c, seclet.h: Removed.
* hash.c, linker.c, genlink.h: New files.
* bfd-in.h: Removed bfd_error_vector. Declared hash table
structures and functions.
(JUMP_TABLE): Removed bfd_seclet_link, added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* All backends: Changed accordingly.
* bfd-in2.h: Rebuilt.
* bfd.c (struct _bfd): Added link_next and archive_pass fields.
Removed ld_symbols field.
(bfd_nonrepresentable_section, bfd_undefined_symbol,
bfd_reloc_value_truncated, bfd_reloc_is_dangerous,
bfd_error_vector): Removed.
(bfd_default_error_trap, bfd_error_trap,
bfd_error_nonrepresentabltrap): Removed.
(bfd_get_relocated_section_contents): Pass link_info. Pass
link_order instead of seclet. Pass symbols.
(bfd_relax_section): Pass link_info.
(bfd_seclet_link): Removed.
(bfd_link_hash_table_create, bfd_link_add_symbols,
bfd_final_link): New macros.
* libbfd-in.h: If __GNUC__ is defined and alloca is not, define
alloca as __builtin_alloca. Declare internal linking functions.
* libbfd.h: Rebuilt.
* libbfd.c (bfd_seek): Comment out fseek assertion. It's worked
for months.
* reloc.c (reloc_howto_type): Added error_message argument to
special_function field. Changed all callers and all definitions.
(bfd_get_reloc_size): Make argument a const pointer.
(bfd_perform_relocation): Add error_message argument to hold
string set if return value if bfd_reloc_dangerous. Changed all
callers.
(_bfd_final_link_relocate, _bfd_relocate_contents): New functions.
* section.c (asection): Renamed seclets_head and seclets_tail to
link_order_head and link_order_tail.
* targets.c (bfd_target): Replaced seclet argument with link_info
and link_order and symbols arguments in
bfd_get_relocated_section_contents. Added symbols argument to
bfd_relax_section. Removed bfd_seclet_link. Added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* libaout.h (struct aoutdata): Added external_syms,
external_sym_count, external_strings, sym_hashes fields.
(obj_aout_external_syms, obj_aout_external_sym_count,
obj_aout_external_strings, obj_aout_sym_hashes): New accessor
macros.
(WRITE_HEADERS): Only output symbols if outsymbols is not NULL.
* aoutx.h: Wrote new back end linker routines.
(translate_to_native_sym_flags): Return boolean value. Don't use
bfd_error_vector.
(NAME(aout,write_syms)): Return boolean value. Check return value
of translate_to_native_sym_flags and bfd_write.
* aout-target.h (final_link_callback): New function.
(MY_bfd_final_link): New function.
* aout-adobe.c (aout_adobe_write_object_contents): Check return
value of aout_32_write_syms.
* hp300hpux.c (MY(write_object_contents)): Likewise.
* i386lynx.c (WRITE_HEADERS): Likewise.
* libaout.h (WRITE_HEADERS): Likewise.
* bout.c: Changed functions to use link_info->callbacks rather
than bfd_error_vector, and link_orders rather than seclets.
* coff-alpha.c: Likewise.
* coff-h8300.c: Likewise.
* coff-h8500.c: Likewise.
* coff-sh.c: Likewise.
* coff-z8k.c: Likewise.
* elf32-hppa.c: Likewise.
* reloc16.c: Likewise.
* coff-alpha.c (alpha_ecoff_get_relocated_section_contents): Look
up _gp in the hash table rather than in outsymbols.
* coff-a29k.c (a29k_reloc): Pass errors back in new error_message
argument rather than printing them.
* coffcode.h (bfd_coff_reloc16_extra_cases): Take link_info and
link_order arguments rather than seclet. Changed all uses and
definitions.
(bfd_coff_reloc16_estimate): Pass link_info arguments. Changed
all uses and definitions.
* libcoff.h: Rebuilt.
* ecoff.c (ecoff_get_extr): If symbol is defined by linker, but
not by ECOFF, make it scAbs.
(ecoff_bfd_final_link): Renamed from ecoff_bfd_seclet_link and
rewritten.
* elf32-mips.c (mips_elf_final_link): Renamed from
mips_elf_seclet_link and rewritten.
* elf32-hppa.c (elf32_hppa_stub_description): Added link_info
field.
(new_stub, add_stub_by_name, hppa_elf_build_arg_reloc_stub,
hppa_elf_build_long_branch_stub, hppa_look_for_stubs_in_section):
Added link_info arguments. Changed all callers.
* elfcode.h (elf_slurp_symbol_table): Don't quit if outsymbols is
not NULL.
* oasys.c (oasys_write_sections): Return boolean value rather than
using bfd_error_vector.
(oasys_write_object_contents): Check return value of
oasys_write_sections.
* hosts/std-host.h: Don't declare qsort or strtol.
* Makefile.in: Rebuild dependencies.
(BFD_LIBS): Removed seclet.o. Added hash.o and linker.o.
(CFILES): Removed seclet.c. Added hash.c and linker.c.
(HFILES): Removed seclet.h. Added genlink.h.
1993-12-30 20:56:50 +01:00
|
|
|
*error_message = (char *) "Missing IHCONST";
|
1992-05-01 22:00:26 +02:00
|
|
|
return(bfd_reloc_dangerous);
|
|
|
|
}
|
1991-10-21 17:42:54 +01:00
|
|
|
|
|
|
|
|
1992-05-01 22:00:26 +02:00
|
|
|
sym_value = get_symbol_value(symbol_in);
|
|
|
|
|
|
|
|
switch (r_type)
|
|
|
|
{
|
|
|
|
case R_IREL:
|
|
|
|
insn = bfd_get_32(abfd, hit_data);
|
|
|
|
/* Take the value in the field and sign extend it */
|
1993-11-19 20:51:52 +01:00
|
|
|
signed_value = EXTRACT_HWORD(insn);
|
1992-05-01 22:00:26 +02:00
|
|
|
signed_value = SIGN_EXTEND_HWORD(signed_value);
|
1993-11-19 20:51:52 +01:00
|
|
|
signed_value <<= 2;
|
1992-05-01 22:00:26 +02:00
|
|
|
signed_value += sym_value + reloc_entry->addend;
|
1994-04-01 19:44:29 +02:00
|
|
|
if (((signed_value + reloc_entry->address) & ~0x3ffff) == 0)
|
1992-05-01 22:00:26 +02:00
|
|
|
{ /* Absolute jmp/call */
|
|
|
|
insn |= (1<<24); /* Make it absolute */
|
1994-04-01 19:44:29 +02:00
|
|
|
signed_value += reloc_entry->address;
|
1992-05-01 22:00:26 +02:00
|
|
|
/* FIXME: Should we change r_type to R_IABS */
|
|
|
|
}
|
|
|
|
else
|
1991-11-13 18:09:33 +01:00
|
|
|
{
|
1992-05-01 22:00:26 +02:00
|
|
|
/* Relative jmp/call, so subtract from the value the
|
|
|
|
address of the place we're coming from */
|
1993-11-19 20:51:52 +01:00
|
|
|
signed_value -= (input_section->output_section->vma
|
|
|
|
+ input_section->output_offset);
|
1992-05-01 22:00:26 +02:00
|
|
|
if (signed_value>0x1ffff || signed_value<-0x20000)
|
Extensive changes to move the bulk of the linker into BFD so that
more efficient backend code can be written for specific object
files. Only existing efficient backend is a.out.
* seclet.c, seclet.h: Removed.
* hash.c, linker.c, genlink.h: New files.
* bfd-in.h: Removed bfd_error_vector. Declared hash table
structures and functions.
(JUMP_TABLE): Removed bfd_seclet_link, added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* All backends: Changed accordingly.
* bfd-in2.h: Rebuilt.
* bfd.c (struct _bfd): Added link_next and archive_pass fields.
Removed ld_symbols field.
(bfd_nonrepresentable_section, bfd_undefined_symbol,
bfd_reloc_value_truncated, bfd_reloc_is_dangerous,
bfd_error_vector): Removed.
(bfd_default_error_trap, bfd_error_trap,
bfd_error_nonrepresentabltrap): Removed.
(bfd_get_relocated_section_contents): Pass link_info. Pass
link_order instead of seclet. Pass symbols.
(bfd_relax_section): Pass link_info.
(bfd_seclet_link): Removed.
(bfd_link_hash_table_create, bfd_link_add_symbols,
bfd_final_link): New macros.
* libbfd-in.h: If __GNUC__ is defined and alloca is not, define
alloca as __builtin_alloca. Declare internal linking functions.
* libbfd.h: Rebuilt.
* libbfd.c (bfd_seek): Comment out fseek assertion. It's worked
for months.
* reloc.c (reloc_howto_type): Added error_message argument to
special_function field. Changed all callers and all definitions.
(bfd_get_reloc_size): Make argument a const pointer.
(bfd_perform_relocation): Add error_message argument to hold
string set if return value if bfd_reloc_dangerous. Changed all
callers.
(_bfd_final_link_relocate, _bfd_relocate_contents): New functions.
* section.c (asection): Renamed seclets_head and seclets_tail to
link_order_head and link_order_tail.
* targets.c (bfd_target): Replaced seclet argument with link_info
and link_order and symbols arguments in
bfd_get_relocated_section_contents. Added symbols argument to
bfd_relax_section. Removed bfd_seclet_link. Added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* libaout.h (struct aoutdata): Added external_syms,
external_sym_count, external_strings, sym_hashes fields.
(obj_aout_external_syms, obj_aout_external_sym_count,
obj_aout_external_strings, obj_aout_sym_hashes): New accessor
macros.
(WRITE_HEADERS): Only output symbols if outsymbols is not NULL.
* aoutx.h: Wrote new back end linker routines.
(translate_to_native_sym_flags): Return boolean value. Don't use
bfd_error_vector.
(NAME(aout,write_syms)): Return boolean value. Check return value
of translate_to_native_sym_flags and bfd_write.
* aout-target.h (final_link_callback): New function.
(MY_bfd_final_link): New function.
* aout-adobe.c (aout_adobe_write_object_contents): Check return
value of aout_32_write_syms.
* hp300hpux.c (MY(write_object_contents)): Likewise.
* i386lynx.c (WRITE_HEADERS): Likewise.
* libaout.h (WRITE_HEADERS): Likewise.
* bout.c: Changed functions to use link_info->callbacks rather
than bfd_error_vector, and link_orders rather than seclets.
* coff-alpha.c: Likewise.
* coff-h8300.c: Likewise.
* coff-h8500.c: Likewise.
* coff-sh.c: Likewise.
* coff-z8k.c: Likewise.
* elf32-hppa.c: Likewise.
* reloc16.c: Likewise.
* coff-alpha.c (alpha_ecoff_get_relocated_section_contents): Look
up _gp in the hash table rather than in outsymbols.
* coff-a29k.c (a29k_reloc): Pass errors back in new error_message
argument rather than printing them.
* coffcode.h (bfd_coff_reloc16_extra_cases): Take link_info and
link_order arguments rather than seclet. Changed all uses and
definitions.
(bfd_coff_reloc16_estimate): Pass link_info arguments. Changed
all uses and definitions.
* libcoff.h: Rebuilt.
* ecoff.c (ecoff_get_extr): If symbol is defined by linker, but
not by ECOFF, make it scAbs.
(ecoff_bfd_final_link): Renamed from ecoff_bfd_seclet_link and
rewritten.
* elf32-mips.c (mips_elf_final_link): Renamed from
mips_elf_seclet_link and rewritten.
* elf32-hppa.c (elf32_hppa_stub_description): Added link_info
field.
(new_stub, add_stub_by_name, hppa_elf_build_arg_reloc_stub,
hppa_elf_build_long_branch_stub, hppa_look_for_stubs_in_section):
Added link_info arguments. Changed all callers.
* elfcode.h (elf_slurp_symbol_table): Don't quit if outsymbols is
not NULL.
* oasys.c (oasys_write_sections): Return boolean value rather than
using bfd_error_vector.
(oasys_write_object_contents): Check return value of
oasys_write_sections.
* hosts/std-host.h: Don't declare qsort or strtol.
* Makefile.in: Rebuild dependencies.
(BFD_LIBS): Removed seclet.o. Added hash.o and linker.o.
(CFILES): Removed seclet.c. Added hash.c and linker.c.
(HFILES): Removed seclet.h. Added genlink.h.
1993-12-30 20:56:50 +01:00
|
|
|
return(bfd_reloc_overflow);
|
1992-05-01 22:00:26 +02:00
|
|
|
}
|
1992-05-12 23:42:36 +02:00
|
|
|
signed_value >>= 2;
|
1992-05-01 22:00:26 +02:00
|
|
|
insn = INSERT_HWORD(insn, signed_value);
|
|
|
|
bfd_put_32(abfd, insn ,hit_data);
|
|
|
|
break;
|
|
|
|
case R_ILOHALF:
|
|
|
|
insn = bfd_get_32(abfd, hit_data);
|
|
|
|
unsigned_value = EXTRACT_HWORD(insn);
|
|
|
|
unsigned_value += sym_value + reloc_entry->addend;
|
|
|
|
insn = INSERT_HWORD(insn, unsigned_value);
|
|
|
|
bfd_put_32(abfd, insn, hit_data);
|
|
|
|
break;
|
|
|
|
case R_IHIHALF:
|
|
|
|
insn = bfd_get_32(abfd, hit_data);
|
|
|
|
/* consth, part 1
|
|
|
|
Just get the symbol value that is referenced */
|
|
|
|
part1_consth_active = true;
|
|
|
|
part1_consth_value = sym_value + reloc_entry->addend;
|
|
|
|
/* Don't modify insn until R_IHCONST */
|
|
|
|
break;
|
|
|
|
case R_IHCONST:
|
|
|
|
insn = bfd_get_32(abfd, hit_data);
|
|
|
|
/* consth, part 2
|
|
|
|
Now relocate the reference */
|
|
|
|
if (part1_consth_active == false) {
|
Extensive changes to move the bulk of the linker into BFD so that
more efficient backend code can be written for specific object
files. Only existing efficient backend is a.out.
* seclet.c, seclet.h: Removed.
* hash.c, linker.c, genlink.h: New files.
* bfd-in.h: Removed bfd_error_vector. Declared hash table
structures and functions.
(JUMP_TABLE): Removed bfd_seclet_link, added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* All backends: Changed accordingly.
* bfd-in2.h: Rebuilt.
* bfd.c (struct _bfd): Added link_next and archive_pass fields.
Removed ld_symbols field.
(bfd_nonrepresentable_section, bfd_undefined_symbol,
bfd_reloc_value_truncated, bfd_reloc_is_dangerous,
bfd_error_vector): Removed.
(bfd_default_error_trap, bfd_error_trap,
bfd_error_nonrepresentabltrap): Removed.
(bfd_get_relocated_section_contents): Pass link_info. Pass
link_order instead of seclet. Pass symbols.
(bfd_relax_section): Pass link_info.
(bfd_seclet_link): Removed.
(bfd_link_hash_table_create, bfd_link_add_symbols,
bfd_final_link): New macros.
* libbfd-in.h: If __GNUC__ is defined and alloca is not, define
alloca as __builtin_alloca. Declare internal linking functions.
* libbfd.h: Rebuilt.
* libbfd.c (bfd_seek): Comment out fseek assertion. It's worked
for months.
* reloc.c (reloc_howto_type): Added error_message argument to
special_function field. Changed all callers and all definitions.
(bfd_get_reloc_size): Make argument a const pointer.
(bfd_perform_relocation): Add error_message argument to hold
string set if return value if bfd_reloc_dangerous. Changed all
callers.
(_bfd_final_link_relocate, _bfd_relocate_contents): New functions.
* section.c (asection): Renamed seclets_head and seclets_tail to
link_order_head and link_order_tail.
* targets.c (bfd_target): Replaced seclet argument with link_info
and link_order and symbols arguments in
bfd_get_relocated_section_contents. Added symbols argument to
bfd_relax_section. Removed bfd_seclet_link. Added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* libaout.h (struct aoutdata): Added external_syms,
external_sym_count, external_strings, sym_hashes fields.
(obj_aout_external_syms, obj_aout_external_sym_count,
obj_aout_external_strings, obj_aout_sym_hashes): New accessor
macros.
(WRITE_HEADERS): Only output symbols if outsymbols is not NULL.
* aoutx.h: Wrote new back end linker routines.
(translate_to_native_sym_flags): Return boolean value. Don't use
bfd_error_vector.
(NAME(aout,write_syms)): Return boolean value. Check return value
of translate_to_native_sym_flags and bfd_write.
* aout-target.h (final_link_callback): New function.
(MY_bfd_final_link): New function.
* aout-adobe.c (aout_adobe_write_object_contents): Check return
value of aout_32_write_syms.
* hp300hpux.c (MY(write_object_contents)): Likewise.
* i386lynx.c (WRITE_HEADERS): Likewise.
* libaout.h (WRITE_HEADERS): Likewise.
* bout.c: Changed functions to use link_info->callbacks rather
than bfd_error_vector, and link_orders rather than seclets.
* coff-alpha.c: Likewise.
* coff-h8300.c: Likewise.
* coff-h8500.c: Likewise.
* coff-sh.c: Likewise.
* coff-z8k.c: Likewise.
* elf32-hppa.c: Likewise.
* reloc16.c: Likewise.
* coff-alpha.c (alpha_ecoff_get_relocated_section_contents): Look
up _gp in the hash table rather than in outsymbols.
* coff-a29k.c (a29k_reloc): Pass errors back in new error_message
argument rather than printing them.
* coffcode.h (bfd_coff_reloc16_extra_cases): Take link_info and
link_order arguments rather than seclet. Changed all uses and
definitions.
(bfd_coff_reloc16_estimate): Pass link_info arguments. Changed
all uses and definitions.
* libcoff.h: Rebuilt.
* ecoff.c (ecoff_get_extr): If symbol is defined by linker, but
not by ECOFF, make it scAbs.
(ecoff_bfd_final_link): Renamed from ecoff_bfd_seclet_link and
rewritten.
* elf32-mips.c (mips_elf_final_link): Renamed from
mips_elf_seclet_link and rewritten.
* elf32-hppa.c (elf32_hppa_stub_description): Added link_info
field.
(new_stub, add_stub_by_name, hppa_elf_build_arg_reloc_stub,
hppa_elf_build_long_branch_stub, hppa_look_for_stubs_in_section):
Added link_info arguments. Changed all callers.
* elfcode.h (elf_slurp_symbol_table): Don't quit if outsymbols is
not NULL.
* oasys.c (oasys_write_sections): Return boolean value rather than
using bfd_error_vector.
(oasys_write_object_contents): Check return value of
oasys_write_sections.
* hosts/std-host.h: Don't declare qsort or strtol.
* Makefile.in: Rebuild dependencies.
(BFD_LIBS): Removed seclet.o. Added hash.o and linker.o.
(CFILES): Removed seclet.c. Added hash.c and linker.c.
(HFILES): Removed seclet.h. Added genlink.h.
1993-12-30 20:56:50 +01:00
|
|
|
*error_message = (char *) "Missing IHIHALF";
|
1992-05-01 22:00:26 +02:00
|
|
|
return(bfd_reloc_dangerous);
|
|
|
|
}
|
|
|
|
/* sym_ptr_ptr = r_symndx, in coff_slurp_reloc_table() */
|
|
|
|
unsigned_value = 0; /*EXTRACT_HWORD(insn) << 16;*/
|
|
|
|
unsigned_value += reloc_entry->addend; /* r_symndx */
|
|
|
|
unsigned_value += part1_consth_value;
|
|
|
|
unsigned_value = unsigned_value >> 16;
|
|
|
|
insn = INSERT_HWORD(insn, unsigned_value);
|
|
|
|
part1_consth_active = false;
|
|
|
|
bfd_put_32(abfd, insn, hit_data);
|
|
|
|
break;
|
|
|
|
case R_BYTE:
|
|
|
|
insn = bfd_get_8(abfd, hit_data);
|
|
|
|
unsigned_value = insn + sym_value + reloc_entry->addend;
|
|
|
|
if (unsigned_value & 0xffffff00) {
|
|
|
|
fprintf(stderr,"Relocation problem : ");
|
|
|
|
fprintf(stderr,"byte value too large in module %s\n",
|
|
|
|
abfd->filename);
|
|
|
|
return(bfd_reloc_overflow);
|
|
|
|
}
|
1992-05-27 01:53:00 +02:00
|
|
|
bfd_put_8(abfd, unsigned_value, hit_data);
|
1992-05-01 22:00:26 +02:00
|
|
|
break;
|
|
|
|
case R_HWORD:
|
|
|
|
insn = bfd_get_16(abfd, hit_data);
|
|
|
|
unsigned_value = insn + sym_value + reloc_entry->addend;
|
|
|
|
if (unsigned_value & 0xffff0000) {
|
|
|
|
fprintf(stderr,"Relocation problem : ");
|
|
|
|
fprintf(stderr,"hword value too large in module %s\n",
|
|
|
|
abfd->filename);
|
|
|
|
return(bfd_reloc_overflow);
|
1991-10-21 17:42:54 +01:00
|
|
|
}
|
|
|
|
|
1992-05-05 01:42:03 +02:00
|
|
|
bfd_put_16(abfd, insn, hit_data);
|
1992-05-01 22:00:26 +02:00
|
|
|
break;
|
|
|
|
case R_WORD:
|
|
|
|
insn = bfd_get_32(abfd, hit_data);
|
|
|
|
insn += sym_value + reloc_entry->addend;
|
|
|
|
bfd_put_32(abfd, insn, hit_data);
|
|
|
|
break;
|
|
|
|
default:
|
Extensive changes to move the bulk of the linker into BFD so that
more efficient backend code can be written for specific object
files. Only existing efficient backend is a.out.
* seclet.c, seclet.h: Removed.
* hash.c, linker.c, genlink.h: New files.
* bfd-in.h: Removed bfd_error_vector. Declared hash table
structures and functions.
(JUMP_TABLE): Removed bfd_seclet_link, added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* All backends: Changed accordingly.
* bfd-in2.h: Rebuilt.
* bfd.c (struct _bfd): Added link_next and archive_pass fields.
Removed ld_symbols field.
(bfd_nonrepresentable_section, bfd_undefined_symbol,
bfd_reloc_value_truncated, bfd_reloc_is_dangerous,
bfd_error_vector): Removed.
(bfd_default_error_trap, bfd_error_trap,
bfd_error_nonrepresentabltrap): Removed.
(bfd_get_relocated_section_contents): Pass link_info. Pass
link_order instead of seclet. Pass symbols.
(bfd_relax_section): Pass link_info.
(bfd_seclet_link): Removed.
(bfd_link_hash_table_create, bfd_link_add_symbols,
bfd_final_link): New macros.
* libbfd-in.h: If __GNUC__ is defined and alloca is not, define
alloca as __builtin_alloca. Declare internal linking functions.
* libbfd.h: Rebuilt.
* libbfd.c (bfd_seek): Comment out fseek assertion. It's worked
for months.
* reloc.c (reloc_howto_type): Added error_message argument to
special_function field. Changed all callers and all definitions.
(bfd_get_reloc_size): Make argument a const pointer.
(bfd_perform_relocation): Add error_message argument to hold
string set if return value if bfd_reloc_dangerous. Changed all
callers.
(_bfd_final_link_relocate, _bfd_relocate_contents): New functions.
* section.c (asection): Renamed seclets_head and seclets_tail to
link_order_head and link_order_tail.
* targets.c (bfd_target): Replaced seclet argument with link_info
and link_order and symbols arguments in
bfd_get_relocated_section_contents. Added symbols argument to
bfd_relax_section. Removed bfd_seclet_link. Added
bfd_link_hash_table_create, bfd_link_add_symbols and
bfd_final_link.
* libaout.h (struct aoutdata): Added external_syms,
external_sym_count, external_strings, sym_hashes fields.
(obj_aout_external_syms, obj_aout_external_sym_count,
obj_aout_external_strings, obj_aout_sym_hashes): New accessor
macros.
(WRITE_HEADERS): Only output symbols if outsymbols is not NULL.
* aoutx.h: Wrote new back end linker routines.
(translate_to_native_sym_flags): Return boolean value. Don't use
bfd_error_vector.
(NAME(aout,write_syms)): Return boolean value. Check return value
of translate_to_native_sym_flags and bfd_write.
* aout-target.h (final_link_callback): New function.
(MY_bfd_final_link): New function.
* aout-adobe.c (aout_adobe_write_object_contents): Check return
value of aout_32_write_syms.
* hp300hpux.c (MY(write_object_contents)): Likewise.
* i386lynx.c (WRITE_HEADERS): Likewise.
* libaout.h (WRITE_HEADERS): Likewise.
* bout.c: Changed functions to use link_info->callbacks rather
than bfd_error_vector, and link_orders rather than seclets.
* coff-alpha.c: Likewise.
* coff-h8300.c: Likewise.
* coff-h8500.c: Likewise.
* coff-sh.c: Likewise.
* coff-z8k.c: Likewise.
* elf32-hppa.c: Likewise.
* reloc16.c: Likewise.
* coff-alpha.c (alpha_ecoff_get_relocated_section_contents): Look
up _gp in the hash table rather than in outsymbols.
* coff-a29k.c (a29k_reloc): Pass errors back in new error_message
argument rather than printing them.
* coffcode.h (bfd_coff_reloc16_extra_cases): Take link_info and
link_order arguments rather than seclet. Changed all uses and
definitions.
(bfd_coff_reloc16_estimate): Pass link_info arguments. Changed
all uses and definitions.
* libcoff.h: Rebuilt.
* ecoff.c (ecoff_get_extr): If symbol is defined by linker, but
not by ECOFF, make it scAbs.
(ecoff_bfd_final_link): Renamed from ecoff_bfd_seclet_link and
rewritten.
* elf32-mips.c (mips_elf_final_link): Renamed from
mips_elf_seclet_link and rewritten.
* elf32-hppa.c (elf32_hppa_stub_description): Added link_info
field.
(new_stub, add_stub_by_name, hppa_elf_build_arg_reloc_stub,
hppa_elf_build_long_branch_stub, hppa_look_for_stubs_in_section):
Added link_info arguments. Changed all callers.
* elfcode.h (elf_slurp_symbol_table): Don't quit if outsymbols is
not NULL.
* oasys.c (oasys_write_sections): Return boolean value rather than
using bfd_error_vector.
(oasys_write_object_contents): Check return value of
oasys_write_sections.
* hosts/std-host.h: Don't declare qsort or strtol.
* Makefile.in: Rebuild dependencies.
(BFD_LIBS): Removed seclet.o. Added hash.o and linker.o.
(CFILES): Removed seclet.c. Added hash.c and linker.c.
(HFILES): Removed seclet.h. Added genlink.h.
1993-12-30 20:56:50 +01:00
|
|
|
*error_message = "Unrecognized reloc";
|
1992-05-01 22:00:26 +02:00
|
|
|
return (bfd_reloc_dangerous);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return(bfd_reloc_ok);
|
1991-07-16 01:43:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* type rightshift
|
|
|
|
size
|
|
|
|
bitsize
|
|
|
|
pc-relative
|
|
|
|
bitpos
|
|
|
|
absolute
|
|
|
|
complain_on_overflow
|
|
|
|
special_function
|
|
|
|
relocation name
|
|
|
|
partial_inplace
|
|
|
|
src_mask
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*FIXME: I'm not real sure about this table */
|
|
|
|
static reloc_howto_type howto_table[] =
|
|
|
|
{
|
1993-07-22 20:03:51 +02:00
|
|
|
{R_ABS, 0, 3, 32, false, 0, complain_overflow_bitfield,a29k_reloc,"ABS", true, 0xffffffff,0xffffffff, false},
|
1991-07-16 01:43:15 +02:00
|
|
|
{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10},
|
|
|
|
{11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20},
|
|
|
|
{21}, {22}, {23},
|
1993-07-22 20:03:51 +02:00
|
|
|
{R_IREL, 0, 3, 32, true, 0, complain_overflow_signed,a29k_reloc,"IREL", true, 0xffffffff,0xffffffff, false},
|
|
|
|
{R_IABS, 0, 3, 32, false, 0, complain_overflow_bitfield, a29k_reloc,"IABS", true, 0xffffffff,0xffffffff, false},
|
|
|
|
{R_ILOHALF, 0, 3, 16, true, 0, complain_overflow_signed, a29k_reloc,"ILOHALF", true, 0x0000ffff,0x0000ffff, false},
|
|
|
|
{R_IHIHALF, 0, 3, 16, true, 16, complain_overflow_signed, a29k_reloc,"IHIHALF", true, 0xffff0000,0xffff0000, false},
|
|
|
|
{R_IHCONST, 0, 3, 16, true, 0, complain_overflow_signed, a29k_reloc,"IHCONST", true, 0xffff0000,0xffff0000, false},
|
|
|
|
{R_BYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, a29k_reloc,"BYTE", true, 0x000000ff,0x000000ff, false},
|
|
|
|
{R_HWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, a29k_reloc,"HWORD", true, 0x0000ffff,0x0000ffff, false},
|
|
|
|
{R_WORD, 0, 2, 32, false, 0, complain_overflow_bitfield, a29k_reloc,"WORD", true, 0xffffffff,0xffffffff, false},
|
1991-07-16 01:43:15 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#define BADMAG(x) A29KBADMAG(x)
|
|
|
|
|
1991-12-01 08:37:33 +01:00
|
|
|
#define RELOC_PROCESSING(relent, reloc, symbols, abfd, section) \
|
|
|
|
reloc_processing(relent, reloc, symbols, abfd, section)
|
|
|
|
|
* Most files:
Replace DEFUN and DEFUN_VOID with K&R-style function definition.
Indent some of them to GNU standards.
* aout32.c, archures.c, core.c, cpu-h8300.c, cpu-i960.c,
cpu-m68k.c, cpu-m88k.c, cpu-mips.c, cpu-vax.c, ctor.c, demo64.c,
elf32-hppa.h, gen-aout.c, host-aout.c, init.c, libhppa.h,
libieee.h, liboasys.h, newsos3.c, som.h, stab-syms.c, sunos.c:
Update copyright years.
1994-03-15 16:13:13 +01:00
|
|
|
static void
|
|
|
|
reloc_processing (relent,reloc, symbols, abfd, section)
|
|
|
|
arelent *relent;
|
|
|
|
struct internal_reloc *reloc;
|
|
|
|
asymbol **symbols;
|
|
|
|
bfd *abfd;
|
|
|
|
asection *section;
|
1991-12-01 08:37:33 +01:00
|
|
|
{
|
1994-04-16 00:22:07 +02:00
|
|
|
static bfd_vma ihihalf_vaddr = (bfd_vma) -1;
|
|
|
|
|
1991-12-01 08:37:33 +01:00
|
|
|
relent->address = reloc->r_vaddr;
|
|
|
|
relent->howto = howto_table + reloc->r_type;
|
|
|
|
if (reloc->r_type == R_IHCONST)
|
|
|
|
{
|
1994-04-16 00:22:07 +02:00
|
|
|
/* The address of an R_IHCONST should always be the address of
|
|
|
|
the immediately preceding R_IHIHALF. relocs generated by gas
|
|
|
|
are correct, but relocs generated by High C are different (I
|
|
|
|
can't figure out what the address means for High C). We can
|
|
|
|
handle both gas and High C by ignoring the address here, and
|
|
|
|
simply reusing the address saved for R_IHIHALF. */
|
|
|
|
if (ihihalf_vaddr == (bfd_vma) -1)
|
|
|
|
abort ();
|
|
|
|
relent->address = ihihalf_vaddr;
|
|
|
|
ihihalf_vaddr = (bfd_vma) -1;
|
1991-12-01 08:37:33 +01:00
|
|
|
relent->addend = reloc->r_symndx;
|
1992-03-17 19:47:16 +01:00
|
|
|
relent->sym_ptr_ptr= bfd_abs_section.symbol_ptr_ptr;
|
1991-12-01 08:37:33 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
asymbol *ptr;
|
|
|
|
relent->sym_ptr_ptr = symbols + obj_convert(abfd)[reloc->r_symndx];
|
|
|
|
|
|
|
|
ptr = *(relent->sym_ptr_ptr);
|
|
|
|
|
|
|
|
if (ptr
|
1992-12-23 00:40:27 +01:00
|
|
|
&& bfd_asymbol_bfd(ptr) == abfd
|
1992-05-01 22:00:26 +02:00
|
|
|
|
1991-12-01 08:37:33 +01:00
|
|
|
&& ((ptr->flags & BSF_OLD_COMMON)== 0))
|
|
|
|
{
|
1992-05-01 22:00:26 +02:00
|
|
|
relent->addend = 0;
|
1991-12-01 08:37:33 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
relent->addend = 0;
|
|
|
|
}
|
|
|
|
relent->address-= section->vma;
|
1994-04-16 00:22:07 +02:00
|
|
|
if (reloc->r_type == R_IHIHALF)
|
|
|
|
ihihalf_vaddr = relent->address;
|
|
|
|
else if (ihihalf_vaddr != (bfd_vma) -1)
|
|
|
|
abort ();
|
1991-12-01 08:37:33 +01:00
|
|
|
}
|
|
|
|
}
|
1991-11-27 17:56:08 +01:00
|
|
|
|
1991-07-16 01:43:15 +02:00
|
|
|
#include "coffcode.h"
|
|
|
|
|
1994-06-20 23:55:45 +02:00
|
|
|
const bfd_target a29kcoff_big_vec =
|
1991-07-16 01:43:15 +02:00
|
|
|
{
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 17:02:09 +01:00
|
|
|
"coff-a29k-big", /* name */
|
|
|
|
bfd_target_coff_flavour,
|
|
|
|
true, /* data byte order is big */
|
|
|
|
true, /* header byte order is big */
|
|
|
|
|
|
|
|
(HAS_RELOC | EXEC_P | /* object flags */
|
|
|
|
HAS_LINENO | HAS_DEBUG |
|
* bfd-in.h: Added commands for object file flag values.
* bfd-in2.h: Rebuilt.
* elfcode.h (elf_object_p): If type is ET_DYN, set DYNAMIC flag,
not EXEC_P.
* bout.c, coff-h8300.c, coff-sh.c: Add BFD_IS_RELAXABLE to
object_flags field for target vector.
* aix386-core.c, aout-adobe.c, aout-target.h, bout.c, coff-a29k.c,
coff-alpha.c, coff-apollo.c, coff-h8300.c, coff-h8500.c,
coff-i386.c, coff-i960.c, coff-m68k.c, coff-m88k.c, coff-mips.c,
coff-rs6000.c, coff-sh.c, coff-we32k.c, coff-z8k.c, hpux-core.c,
ieee.c, mipsbsd.c, nlm-target.h, oasys.c, osf-core.c, som.c,
srec.c, tekhex.c, trad-core.c: Remove DYNAMIC from object_flags
field for target vector.
1993-10-29 19:04:58 +01:00
|
|
|
HAS_SYMS | HAS_LOCALS | WP_TEXT),
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 17:02:09 +01:00
|
|
|
|
|
|
|
(SEC_HAS_CONTENTS | SEC_ALLOC /* section flags */
|
|
|
|
| SEC_LOAD | SEC_RELOC
|
|
|
|
| SEC_READONLY ),
|
|
|
|
'_', /* leading underscore */
|
|
|
|
'/', /* ar_pad_char */
|
|
|
|
15, /* ar_max_namelen */
|
|
|
|
2, /* minimum section alignment */
|
|
|
|
/* data */
|
1993-09-07 20:32:33 +02:00
|
|
|
bfd_getb64, bfd_getb_signed_64, bfd_putb64,
|
|
|
|
bfd_getb32, bfd_getb_signed_32, bfd_putb32,
|
|
|
|
bfd_getb16, bfd_getb_signed_16, bfd_putb16,
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 17:02:09 +01:00
|
|
|
/* hdrs */
|
1993-09-07 20:32:33 +02:00
|
|
|
bfd_getb64, bfd_getb_signed_64, bfd_putb64,
|
|
|
|
bfd_getb32, bfd_getb_signed_32, bfd_putb32,
|
|
|
|
bfd_getb16, bfd_getb_signed_16, bfd_putb16,
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 17:02:09 +01:00
|
|
|
|
|
|
|
{
|
1991-11-13 18:09:33 +01:00
|
|
|
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 17:02:09 +01:00
|
|
|
_bfd_dummy_target,
|
|
|
|
coff_object_p,
|
|
|
|
bfd_generic_archive_p,
|
|
|
|
_bfd_dummy_target
|
|
|
|
},
|
|
|
|
{
|
|
|
|
bfd_false,
|
|
|
|
coff_mkobject,
|
|
|
|
_bfd_generic_mkarchive,
|
|
|
|
bfd_false
|
|
|
|
},
|
|
|
|
{
|
|
|
|
bfd_false,
|
|
|
|
coff_write_object_contents,
|
|
|
|
_bfd_write_archive_contents,
|
|
|
|
bfd_false
|
|
|
|
},
|
|
|
|
|
* targets.c (bfd_target): Rearranged fields in target vector.
Removed _bfd_debug_info_start, _bfd_debug_info_end and
_bfd_debug_info_accumulate, which were never used.
(BFD_JUMP_TABLE_GENERIC, BFD_JUMP_TABLE_COPY): Defined.
(BFD_JUMP_TABLE_CORE, BFD_JUMP_TABLE_ARCHIVE): Defined.
(BFD_JUMP_TABLE_SYMBOLS, BFD_JUMP_TABLE_RELOCS): Defined.
(BFD_JUMP_TABLE_WRITE, BFD_JUMP_TABLE_LINK): Defined.
* All backends: Changed to use the new BFD_JUMP_TABLE_* macros
rather than the single JUMP_TABLE macro. Removed many of the
weird macro definitions needed to support the monolithic
JUMP_TABLE.
* bfd-in.h (JUMP_TABLE): Removed.
* libbfd-in.h: Define a bunch of macros, and declare a few
functions, for use with the new BFD_JUMP_TABLE_* macros.
* libbfd.c (_bfd_dummy_new_section_hook): Removed.
(bfd_false): Set bfd_error_invalid_operation.
(bfd_nullvoidptr): Likewise.
(bfd_n1): New function.
(_bfd_nocore_core_file_matches_executable_p): Renamed from
_bfd_dummy_core_file_matches_executable_p.
(_bfd_nocore_core_file_failing_command): Similar rename. Set
bfd_error_invalid_operation.
(_bfd_nocore_core_file_failing_signal): Likewise.
(_bfd_generic_get_section_contents): Renamed from
bfd_generic_get_section_contents. Changed all callers.
(_bfd_generic_set_section_contents): Similar rename.
* ieee.c: #if 0 out ieee_bfd_debug_info_start,
ieee_bfd_debug_info_end, ieee_bfd_debug_info_accumulate. They
were never called.
* bfd-in2.h: Rebuilt.
* libbfd.h: Rebuilt.
1994-04-07 00:00:40 +02:00
|
|
|
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),
|
1994-04-07 03:58:27 +02:00
|
|
|
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
|
* targets.c (bfd_target): Rearranged fields in target vector.
Removed _bfd_debug_info_start, _bfd_debug_info_end and
_bfd_debug_info_accumulate, which were never used.
(BFD_JUMP_TABLE_GENERIC, BFD_JUMP_TABLE_COPY): Defined.
(BFD_JUMP_TABLE_CORE, BFD_JUMP_TABLE_ARCHIVE): Defined.
(BFD_JUMP_TABLE_SYMBOLS, BFD_JUMP_TABLE_RELOCS): Defined.
(BFD_JUMP_TABLE_WRITE, BFD_JUMP_TABLE_LINK): Defined.
* All backends: Changed to use the new BFD_JUMP_TABLE_* macros
rather than the single JUMP_TABLE macro. Removed many of the
weird macro definitions needed to support the monolithic
JUMP_TABLE.
* bfd-in.h (JUMP_TABLE): Removed.
* libbfd-in.h: Define a bunch of macros, and declare a few
functions, for use with the new BFD_JUMP_TABLE_* macros.
* libbfd.c (_bfd_dummy_new_section_hook): Removed.
(bfd_false): Set bfd_error_invalid_operation.
(bfd_nullvoidptr): Likewise.
(bfd_n1): New function.
(_bfd_nocore_core_file_matches_executable_p): Renamed from
_bfd_dummy_core_file_matches_executable_p.
(_bfd_nocore_core_file_failing_command): Similar rename. Set
bfd_error_invalid_operation.
(_bfd_nocore_core_file_failing_signal): Likewise.
(_bfd_generic_get_section_contents): Renamed from
bfd_generic_get_section_contents. Changed all callers.
(_bfd_generic_set_section_contents): Similar rename.
* ieee.c: #if 0 out ieee_bfd_debug_info_start,
ieee_bfd_debug_info_end, ieee_bfd_debug_info_accumulate. They
were never called.
* bfd-in2.h: Rebuilt.
* libbfd.h: Rebuilt.
1994-04-07 00:00:40 +02:00
|
|
|
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 17:02:09 +01:00
|
|
|
COFF_SWAP_TABLE
|
1991-11-13 18:09:33 +01:00
|
|
|
};
|