Uses the new small reloc type now.

Currently self hosts on sun4 and sun3
This commit is contained in:
Steve Chamberlain 1992-01-24 22:44:51 +00:00
parent 95a876f3fa
commit e98e6ec111
21 changed files with 2596 additions and 1428 deletions

View file

@ -88,6 +88,7 @@ newsos3.c
oasys.c oasys.c
opncls.c opncls.c
reloc.c reloc.c
seclet.c
section.c section.c
srec.c srec.c
stab-syms.c stab-syms.c
@ -120,7 +121,12 @@ echo Done in `pwd`.
# #
# #
# $Log$ # $Log$
# Revision 1.34 1991/12/18 23:01:48 bothner # Revision 1.35 1992/01/24 22:42:49 sac
# Uses the new small reloc type now.
#
# Currently self hosts on sun4 and sun3
#
# Revision 1.34 1991/12/18 23:01:48 bothner
# Use aout-target.h more extensively. # Use aout-target.h more extensively.
# Replace Berkeley functions (e.g. bcopy) with ANSI ones (e.g. memcpy). # Replace Berkeley functions (e.g. bcopy) with ANSI ones (e.g. memcpy).
# Other improvements (see ChangeLog). # Other improvements (see ChangeLog).

View file

@ -1,3 +1,15 @@
Fri Jan 24 14:40:17 1992 Steve Chamberlain (sac at rtl.cygnus.com)
* everything: now modified to use smaller reloc type. Self hosts
on sun3 & sun4.
Sat Jan 18 17:00:16 1992 Fred Fish (fnf at cygnus.com)
* config/mh-stratus, config/mt-i860-elf, hosts/h-stratus:
New files for stratus.
* configure.in: Add configuration fragments for stratus.
Wed Jan 15 10:02:43 1992 Fred Fish (fnf at cygnus.com) Wed Jan 15 10:02:43 1992 Fred Fish (fnf at cygnus.com)
* aoutx.h (NAME(aout,find_nearest_line)): Declare various filename * aoutx.h (NAME(aout,find_nearest_line)): Declare various filename

332
bfd/aout-target.h Normal file
View file

@ -0,0 +1,332 @@
/* Define a target vector for a variant of a.out.
Copyright (C) 1990-1991 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Set parameters about this a.out file that are machine-dependent.
This routine is called from some_aout_object_p just before it returns. */
static bfd_target *
DEFUN(MY(callback),(abfd),
bfd *abfd)
{
struct internal_exec *execp = exec_hdr (abfd);
/* Calculate the file positions of the parts of a newly read aout header */
obj_textsec (abfd)->_raw_size = N_TXTSIZE(*execp);
/* The virtual memory addresses of the sections */
obj_textsec (abfd)->vma = N_TXTADDR(*execp);
obj_datasec (abfd)->vma = N_DATADDR(*execp);
obj_bsssec (abfd)->vma = N_BSSADDR(*execp);
/* The file offsets of the sections */
obj_textsec (abfd)->filepos = N_TXTOFF (*execp);
obj_datasec (abfd)->filepos = N_DATOFF (*execp);
/* The file offsets of the relocation info */
obj_textsec (abfd)->rel_filepos = N_TRELOFF(*execp);
obj_datasec (abfd)->rel_filepos = N_DRELOFF(*execp);
/* The file offsets of the string table and symbol table. */
obj_sym_filepos (abfd) = N_SYMOFF (*execp);
obj_str_filepos (abfd) = N_STROFF (*execp);
/* Determine the architecture and machine type of the object file.
*/
#ifdef SET_ARCH_MACH
SET_ARCH_MACH(abfd, *execp);
#else
bfd_default_set_arch_mach(abfd, DEFAULT_ARCH, 0);
#endif
adata(abfd).page_size = PAGE_SIZE;
#ifdef SEGMENT_SIZE
adata(abfd).segment_size = SEGMENT_SIZE;
#else
adata(abfd).segment_size = PAGE_SIZE;
#endif
adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE;
return abfd->xvec;
}
#ifndef MY_object_p
/* Finish up the reading of an a.out file header */
static bfd_target *
DEFUN(MY(object_p),(abfd),
bfd *abfd)
{
struct external_exec exec_bytes; /* Raw exec header from file */
struct internal_exec exec; /* Cleaned-up exec header */
bfd_target *target;
if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd)
!= EXEC_BYTES_SIZE) {
bfd_error = wrong_format;
return 0;
}
exec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info);
if (N_BADMAG (exec)) return 0;
NAME(aout,swap_exec_header_in)(abfd, &exec_bytes, &exec);
target = NAME(aout,some_aout_object_p) (abfd, &exec, MY(callback));
#ifdef ENTRY_CAN_BE_ZERO
/* The NEWSOS3 entry-point is/was 0, which (amongst other lossage)
* means that it isn't obvious if EXEC_P should be set.
* All of the following must be true for an executable:
* There must be no relocations, the bfd can be neither an
* archive nor an archive element, and the file must be executable. */
if (exec.a_trsize + exec.a_drsize == 0
&& bfd_get_format(abfd) == bfd_object && abfd->my_archive == NULL)
{
struct stat buf;
#ifndef S_IXUSR
#define S_IXUSR 0100 /* Execute by owner. */
#endif
if (stat(abfd->filename, &buf) == 0 && (buf.st_mode & S_IXUSR))
abfd->flags |= EXEC_P;
}
#endif /* ENTRY_CAN_BE_ZERO */
return target;
}
#define MY_object_p MY(object_p)
#endif
#ifndef MY_mkobject
static boolean
DEFUN(MY(mkobject),(abfd),
bfd *abfd)
{
if (NAME(aout,mkobject)(abfd) == false)
return false;
adata(abfd).page_size = PAGE_SIZE;
#ifdef SEGMENT_SIZE
adata(abfd).segment_size = SEGMENT_SIZE;
#else
adata(abfd).segment_size = PAGE_SIZE;
#endif
adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE;
return true;
}
#define MY_mkobject MY(mkobject)
#endif
/* Write an object file.
Section contents have already been written. We write the
file header, symbols, and relocation. */
#ifndef MY_write_object_contents
static boolean
DEFUN(MY(write_object_contents),(abfd),
bfd *abfd)
{
bfd_size_type data_pad = 0;
struct external_exec exec_bytes;
struct internal_exec *execp = exec_hdr (abfd);
WRITE_HEADERS(abfd, execp);
return true;
}
#define MY_write_object_contents MY(write_object_contents)
#endif
/* We assume BFD generic archive files. */
#ifndef MY_openr_next_archived_file
#define MY_openr_next_archived_file bfd_generic_openr_next_archived_file
#endif
#ifndef MY_generic_stat_arch_elt
#define MY_generic_stat_arch_elt bfd_generic_stat_arch_elt
#endif
#ifndef MY_slurp_armap
#define MY_slurp_armap bfd_slurp_bsd_armap
#endif
#ifndef MY_slurp_extended_name_table
#define MY_slurp_extended_name_table bfd_true
#endif
#ifndef MY_write_armap
#define MY_write_armap bsd_write_armap
#endif
#ifndef MY_truncate_arname
#define MY_truncate_arname bfd_bsd_truncate_arname
#endif
/* No core file defined here -- configure in trad-core.c separately. */
#ifndef MY_core_file_failing_command
#define MY_core_file_failing_command _bfd_dummy_core_file_failing_command
#endif
#ifndef MY_core_file_failing_signal
#define MY_core_file_failing_signal _bfd_dummy_core_file_failing_signal
#endif
#ifndef MY_core_file_matches_executable_p
#define MY_core_file_matches_executable_p \
_bfd_dummy_core_file_matches_executable_p
#endif
#ifndef MY_core_file_p
#define MY_core_file_p _bfd_dummy_target
#endif
#ifndef MY_bfd_debug_info_start
#define MY_bfd_debug_info_start bfd_void
#endif
#ifndef MY_bfd_debug_info_end
#define MY_bfd_debug_info_end bfd_void
#endif
#ifndef MY_bfd_debug_info_accumulate
#define MY_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void
#endif
#ifndef MY_core_file_failing_command
#define MY_core_file_failing_command NAME(aout,core_file_failing_command)
#endif
#ifndef MY_core_file_failing_signal
#define MY_core_file_failing_signal NAME(aout,core_file_failing_signal)
#endif
#ifndef MY_core_file_matches_executable_p
#define MY_core_file_matches_executable_p NAME(aout,core_file_matches_executable_p)
#endif
#ifndef MY_slurp_armap
#define MY_slurp_armap NAME(aout,slurp_armap)
#endif
#ifndef MY_slurp_extended_name_table
#define MY_slurp_extended_name_table NAME(aout,slurp_extended_name_table)
#endif
#ifndef MY_truncate_arname
#define MY_truncate_arname NAME(aout,truncate_arname)
#endif
#ifndef MY_write_armap
#define MY_write_armap NAME(aout,write_armap)
#endif
#ifndef MY_close_and_cleanup
#define MY_close_and_cleanup NAME(aout,close_and_cleanup)
#endif
#ifndef MY_set_section_contents
#define MY_set_section_contents NAME(aout,set_section_contents)
#endif
#ifndef MY_get_section_contents
#define MY_get_section_contents NAME(aout,get_section_contents)
#endif
#ifndef MY_new_section_hook
#define MY_new_section_hook NAME(aout,new_section_hook)
#endif
#ifndef MY_get_symtab_upper_bound
#define MY_get_symtab_upper_bound NAME(aout,get_symtab_upper_bound)
#endif
#ifndef MY_get_symtab
#define MY_get_symtab NAME(aout,get_symtab)
#endif
#ifndef MY_get_reloc_upper_bound
#define MY_get_reloc_upper_bound NAME(aout,get_reloc_upper_bound)
#endif
#ifndef MY_canonicalize_reloc
#define MY_canonicalize_reloc NAME(aout,canonicalize_reloc)
#endif
#ifndef MY_make_empty_symbol
#define MY_make_empty_symbol NAME(aout,make_empty_symbol)
#endif
#ifndef MY_print_symbol
#define MY_print_symbol NAME(aout,print_symbol)
#endif
#ifndef MY_get_lineno
#define MY_get_lineno NAME(aout,get_lineno)
#endif
#ifndef MY_set_arch_mach
#define MY_set_arch_mach NAME(aout,set_arch_mach)
#endif
#ifndef MY_openr_next_archived_file
#define MY_openr_next_archived_file NAME(aout,openr_next_archived_file)
#endif
#ifndef MY_find_nearest_line
#define MY_find_nearest_line NAME(aout,find_nearest_line)
#endif
#ifndef MY_generic_stat_arch_elt
#define MY_generic_stat_arch_elt NAME(aout,generic_stat_arch_elt)
#endif
#ifndef MY_sizeof_headers
#define MY_sizeof_headers NAME(aout,sizeof_headers)
#endif
#ifndef MY_bfd_debug_info_start
#define MY_bfd_debug_info_start NAME(aout,bfd_debug_info_start)
#endif
#ifndef MY_bfd_debug_info_end
#define MY_bfd_debug_info_end NAME(aout,bfd_debug_info_end)
#endif
#ifndef MY_bfd_debug_info_accumulat
#define MY_bfd_debug_info_accumulat NAME(aout,bfd_debug_info_accumulat)
#endif
bfd_target MY(vec) =
{
TARGETNAME, /* name */
bfd_target_aout_flavour,
true, /* target byte order */
true, /* target headers byte order */
(HAS_RELOC | EXEC_P | /* object flags */
HAS_LINENO | HAS_DEBUG |
HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
' ', /* ar_pad_char */
16, /* ar_max_namelen */
1, /* minimum alignment */
#ifdef TARGET_IS_BIG_ENDIAN_P
_do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* data */
_do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* hdrs */
#else
_do_getl64, _do_putl64, _do_getl32, _do_putl32, _do_getl16, _do_putl16, /* data */
_do_getl64, _do_putl64, _do_getl32, _do_putl32, _do_getl16, _do_putl16, /* hdrs */
#endif
{_bfd_dummy_target, MY_object_p, /* bfd_check_format */
bfd_generic_archive_p, MY_core_file_p},
{bfd_false, MY_mkobject, /* bfd_set_format */
_bfd_generic_mkarchive, bfd_false},
{bfd_false, MY_write_object_contents, /* bfd_write_contents */
_bfd_write_archive_contents, bfd_false},
MY_core_file_failing_command,
MY_core_file_failing_signal,
MY_core_file_matches_executable_p,
MY_slurp_armap,
MY_slurp_extended_name_table,
MY_truncate_arname,
MY_write_armap,
MY_close_and_cleanup,
MY_set_section_contents,
MY_get_section_contents,
MY_new_section_hook,
MY_get_symtab_upper_bound,
MY_get_symtab,
MY_get_reloc_upper_bound,
MY_canonicalize_reloc,
MY_make_empty_symbol,
MY_print_symbol,
MY_get_lineno,
MY_set_arch_mach,
MY_openr_next_archived_file,
MY_find_nearest_line,
MY_generic_stat_arch_elt,
MY_sizeof_headers,
MY_bfd_debug_info_start,
MY_bfd_debug_info_end,
MY_bfd_debug_info_accumulate,
bfd_generic_get_relocated_section_contents
};

View file

@ -80,8 +80,6 @@ typedef HOST_64_BIT symvalue;
typedef HOST_64_BIT bfd_64_type; typedef HOST_64_BIT bfd_64_type;
#define fprintf_vma(s,x) \ #define fprintf_vma(s,x) \
fprintf(s,"%08x%08x", uint64_typeHIGH(x), uint64_typeLOW(x)) fprintf(s,"%08x%08x", uint64_typeHIGH(x), uint64_typeLOW(x))
#define printf_vma(x) \
printf( "%08x%08x", uint64_typeHIGH(x), uint64_typeLOW(x))
#else #else
typedef struct {int a,b;} bfd_64_type; typedef struct {int a,b;} bfd_64_type;
typedef unsigned long rawdata_offset; typedef unsigned long rawdata_offset;
@ -91,9 +89,9 @@ typedef unsigned long bfd_word;
typedef unsigned long bfd_size; typedef unsigned long bfd_size;
typedef unsigned long symvalue; typedef unsigned long symvalue;
typedef unsigned long bfd_size_type; typedef unsigned long bfd_size_type;
#define printf_vma(x) printf( "%08lx", x)
#define fprintf_vma(s,x) fprintf(s, "%08lx", x) #define fprintf_vma(s,x) fprintf(s, "%08lx", x)
#endif #endif
#define printf_vma(x) fprintf_vma(stdout,x)
typedef unsigned int flagword; /* 32 bits of flags */ typedef unsigned int flagword; /* 32 bits of flags */
@ -183,7 +181,7 @@ typedef struct lineno_cache_entry {
typedef struct sec *sec_ptr; typedef struct sec *sec_ptr;
#define bfd_section_name(bfd, ptr) ((ptr)->name) #define bfd_section_name(bfd, ptr) ((ptr)->name)
#define bfd_section_size(bfd, ptr) ((ptr)->size) #define bfd_section_size(bfd, ptr) (bfd_get_section_size_before_reloc(ptr))
#define bfd_section_vma(bfd, ptr) ((ptr)->vma) #define bfd_section_vma(bfd, ptr) ((ptr)->vma)
#define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power) #define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power)
#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags) #define bfd_get_section_flags(bfd, ptr) ((ptr)->flags)
@ -209,10 +207,23 @@ typedef enum bfd_error {
invalid_error_code} bfd_ec; invalid_error_code} bfd_ec;
extern bfd_ec bfd_error; extern bfd_ec bfd_error;
struct reloc_cache_entry;
struct bfd_seclet_struct ;
typedef struct bfd_error_vector { typedef struct bfd_error_vector {
PROTO(void,(* nonrepresentable_section ),(CONST bfd *CONST abfd, PROTO(void,(* nonrepresentable_section ),(CONST bfd *CONST abfd,
CONST char *CONST name)); CONST char *CONST name));
PROTO(void,(* undefined_symbol),(CONST struct reloc_cache_entry *rel,
CONST struct bfd_seclet_struct *sec
));
PROTO(void, (* reloc_value_truncated),(CONST struct
reloc_cache_entry *rel,
struct bfd_seclet_struct *sec));
PROTO(void, (* reloc_dangerous),(CONST struct reloc_cache_entry *rel,
CONST struct bfd_seclet_struct *sec));
} bfd_error_vector_type; } bfd_error_vector_type;
PROTO (char *, bfd_errmsg, ()); PROTO (char *, bfd_errmsg, ());
@ -223,7 +234,8 @@ typedef enum bfd_print_symbol
{ {
bfd_print_symbol_name, bfd_print_symbol_name,
bfd_print_symbol_more, bfd_print_symbol_more,
bfd_print_symbol_all bfd_print_symbol_all,
bfd_print_symbol_nm, /* Pretty format suitable for nm program. */
} bfd_print_symbol_type; } bfd_print_symbol_type;
@ -268,7 +280,8 @@ CAT(NAME,_generic_stat_arch_elt),\
CAT(NAME,_sizeof_headers),\ CAT(NAME,_sizeof_headers),\
CAT(NAME,_bfd_debug_info_start),\ CAT(NAME,_bfd_debug_info_start),\
CAT(NAME,_bfd_debug_info_end),\ CAT(NAME,_bfd_debug_info_end),\
CAT(NAME,_bfd_debug_info_accumulate) CAT(NAME,_bfd_debug_info_accumulate),\
CAT(NAME,_bfd_get_relocated_section_contents)
#define COFF_SWAP_TABLE \ #define COFF_SWAP_TABLE \
coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, \ coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, \
@ -294,7 +307,7 @@ extern CONST short _bfd_host_big_endian;
#define bfd_get_file_flags(abfd) ((abfd)->flags) #define bfd_get_file_flags(abfd) ((abfd)->flags)
#define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags) #define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags)
#define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags) #define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags)
#define bfd_my_archive(abfd) ((abfd)->my_archive); #define bfd_my_archive(abfd) ((abfd)->my_archive)
#define bfd_has_map(abfd) ((abfd)->has_armap) #define bfd_has_map(abfd) ((abfd)->has_armap)
#define bfd_header_twiddle_required(abfd) \ #define bfd_header_twiddle_required(abfd) \
((((abfd)->xvec->header_byteorder_big_p) \ ((((abfd)->xvec->header_byteorder_big_p) \
@ -318,38 +331,13 @@ extern CONST short _bfd_host_big_endian;
/*THE FOLLOWING IS EXTRACTED FROM THE SOURCE */ /* ANd more from the source */
/*:init.c*/
/*:opncls.c*/
/*:libbfd.c*/
/*:section.c*/
/*:archures.c*/
/*:reloc.c*/
/*:syms.c*/
/*:bfd.c*/
/*:archive.c*/
/*:core.c*/
/*:targets.c*/
/*:format.c*/
#endif

406
bfd/bfd.c
View file

@ -24,7 +24,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
SECTION SECTION
<<typedef bfd>> <<typedef bfd>>
DESCRIPTION
A BFD is has type <<bfd>>; objects of this type are the A BFD is has type <<bfd>>; objects of this type are the
cornerstone of any application using <<libbfd>>. References cornerstone of any application using <<libbfd>>. References
though the BFD and to data in the BFD give the entire BFD though the BFD and to data in the BFD give the entire BFD
@ -34,131 +33,142 @@ DESCRIPTION
contains he major data about the file, and contains pointers contains he major data about the file, and contains pointers
to the rest of the data. to the rest of the data.
CODE_FRAGMENT
.
.struct _bfd .struct _bfd
.{ .{
The filename the application opened the BFD with. . {* The filename the application opened the BFD with. *}
. CONST char *filename;
. CONST char *filename; .
. {* A pointer to the target jump table. *}
A pointer to the target jump table. . struct bfd_target *xvec;
.
. struct bfd_target *xvec; . {* To avoid dragging too many header files into every file that
. includes @file{bfd.h}, IOSTREAM has been declared as a "char
To avoid dragging too many header files into every file that . *", and MTIME as a "long". Their correct types, to which they
includes @file{bfd.h}, IOSTREAM has been declared as a "char . are cast when used, are "FILE *" and "time_t". The iostream
*", and MTIME as a "long". Their correct types, to which they . is the result of an fopen on the filename. *}
are cast when used, are "FILE *" and "time_t". The iostream . char *iostream;
is the result of an fopen on the filename. .
. {* Is the file being cached *}
. char *iostream; .
. boolean cacheable;
Is the file being cached @xref{File Caching}. .
. {* Marks whether there was a default target specified when the
. boolean cacheable; . BFD was opened. This is used to select what matching algorithm
. to use to chose the back end. *}
Marks whether there was a default target specified when the .
BFD was opened. This is used to select what matching algorithm . boolean target_defaulted;
to use to chose the back end. .
. {* The caching routines use these to maintain a
. boolean target_defaulted; . least-recently-used list of BFDs *}
.
The caching routines use these to maintain a . struct _bfd *lru_prev, *lru_next;
least-recently-used list of BFDs (@pxref{File Caching}). .
. {* When a file is closed by the caching routines, BFD retains
. struct _bfd *lru_prev, *lru_next; . state information on the file here:
. *}
When a file is closed by the caching routines, BFD retains .
state information on the file here: . file_ptr where;
.
. file_ptr where; . {* and here:*}
.
and here: . boolean opened_once;
.
. boolean opened_once; . {* Set if we have a locally maintained mtime value, rather than
. getting it from the file each time: *}
. boolean mtime_set; .
. boolean mtime_set;
File modified time .
. {* File modified time, if mtime_set is true: *}
. long mtime; .
. long mtime;
Reserved for an unimplemented file locking extension. .
. {* Reserved for an unimplemented file locking extension.*}
. int ifd; .
. int ifd;
The format which belongs to the BFD. .
. {* The format which belongs to the BFD.*}
. bfd_format format; .
. bfd_format format;
The direction the BFD was opened with .
. {* The direction the BFD was opened with*}
. enum bfd_direction {no_direction = 0, .
. read_direction = 1, . enum bfd_direction {no_direction = 0,
. write_direction = 2, . read_direction = 1,
. both_direction = 3} direction; . write_direction = 2,
. both_direction = 3} direction;
Format_specific flags .
. {* Format_specific flags*}
. flagword flags; .
. flagword flags;
Currently my_archive is tested before adding origin to .
anything. I believe that this can become always an add of . {* Currently my_archive is tested before adding origin to
origin, with origin set to 0 for non archive files. . anything. I believe that this can become always an add of
. origin, with origin set to 0 for non archive files. *}
. file_ptr origin; .
. file_ptr origin;
Remember when output has begun, to stop strange things happening. .
. {* Remember when output has begun, to stop strange things
. boolean output_has_begun; . happening. *}
. boolean output_has_begun;
Pointer to linked list of sections .
. {* Pointer to linked list of sections*}
. struct sec *sections; . struct sec *sections;
.
The number of sections . {* The number of sections *}
. unsigned int section_count;
. unsigned int section_count; .
. {* Stuff only useful for object files:
Stuff only useful for object files: . The start address. *}
The start address. . bfd_vma start_address;
.
. bfd_vma start_address; . {* Used for input and output*}
. unsigned int symcount;
Used for input and output .
. {* Symbol table for output BFD*}
. unsigned int symcount; . struct symbol_cache_entry **outsymbols;
.
Symbol table for output BFD . {* Pointer to structure which contains architecture information*}
. struct bfd_arch_info *arch_info;
. struct symbol_cache_entry **outsymbols; .
. {* Stuff only useful for archives:*}
Pointer to structure which contains architecture information . PTR arelt_data;
. struct _bfd *my_archive;
. struct bfd_arch_info *arch_info; . struct _bfd *next;
. struct _bfd *archive_head;
Stuff only useful for archives: . boolean has_armap;
.
. PTR arelt_data; . {* Used by the back end to hold private data. *}
. struct _bfd *my_archive; .
. struct _bfd *next; . union
. struct _bfd *archive_head; . {
. boolean has_armap; . struct aout_data_struct *aout_data;
. struct artdata *aout_ar_data;
Used by the back end to hold private data. . struct _oasys_data *oasys_obj_data;
. struct _oasys_ar_data *oasys_ar_data;
. PTR tdata; . struct coff_tdata *coff_obj_data;
. struct ieee_data_struct *ieee_data;
Used by the application to hold private data . struct ieee_ar_data_struct *ieee_ar_data;
. struct srec_data_struct *srec_data;
. PTR usrdata; . struct elf_obj_tdata_struct *elf_obj_data;
. struct elf_core_tdata_struct *elf_core_data;
Where all the allocated stuff under this BFD goes . struct bout_data_struct *bout_data;
(@pxref{Memory Usage}). . struct sun_core_struct *sun_core_data;
. PTR any;
. struct obstack memory; . } tdata;
.
. {* Used by the application to hold private data*}
. PTR usrdata;
.
. {* Where all the allocated stuff under this BFD goes *}
. struct obstack memory;
.
. asymbol **ld_symbols;
.}; .};
.
*/ */
#include "bfd.h" #include "bfd.h"
#include "sysdep.h" #include "sysdep.h"
#include "libbfd.h" #include "libbfd.h"
@ -215,11 +225,47 @@ DEFUN(bfd_nonrepresentable_section,(abfd, name),
exit(1); exit(1);
} }
static
void
DEFUN(bfd_undefined_symbol,(relent, seclet),
CONST arelent *relent AND
CONST struct bfd_seclet_struct *seclet)
{
asymbol *symbol = *(relent->sym_ptr_ptr);
printf("bfd error relocating, symbol %s is undefined\n",
symbol->name);
exit(1);
}
static
void
DEFUN(bfd_reloc_value_truncated,(relent, seclet),
CONST arelent *relent AND
struct bfd_seclet_struct *seclet)
{
asymbol *symbol = *(relent->sym_ptr_ptr);
printf("bfd error relocating, value truncated\n");
exit(1);
}
static
void
DEFUN(bfd_reloc_is_dangerous,(relent, seclet),
CONST arelent *relent AND
CONST struct bfd_seclet_struct *seclet)
{
asymbol *symbol = *(relent->sym_ptr_ptr);
printf("bfd error relocating, dangerous\n");
exit(1);
}
bfd_error_vector_type bfd_error_vector = bfd_error_vector_type bfd_error_vector =
{ {
bfd_nonrepresentable_section bfd_nonrepresentable_section ,
bfd_undefined_symbol,
bfd_reloc_value_truncated,
bfd_reloc_is_dangerous,
}; };
char * char *
bfd_errmsg (error_tag) bfd_errmsg (error_tag)
bfd_ec error_tag; bfd_ec error_tag;
@ -264,12 +310,26 @@ DEFUN(bfd_perror,(message),
/** Symbols */ /** Symbols */
/* returns the number of octets of storage required */
/*
FUNCTION
bfd_get_reloc_upper_bound
SYNOPSIS
unsigned int bfd_get_reloc_upper_bound(bfd *abfd, asection *sect);
DESCRIPTION
This function return the number of bytes required to store the
relocation information associated with section <<sect>>
attached to bfd <<abfd>>
*/
unsigned int unsigned int
get_reloc_upper_bound (abfd, asect) DEFUN(bfd_get_reloc_upper_bound,(abfd, asect),
bfd *abfd; bfd *abfd AND
sec_ptr asect; sec_ptr asect)
{ {
if (abfd->format != bfd_object) { if (abfd->format != bfd_object) {
bfd_error = invalid_operation; bfd_error = invalid_operation;
@ -279,6 +339,30 @@ get_reloc_upper_bound (abfd, asect)
return BFD_SEND (abfd, _get_reloc_upper_bound, (abfd, asect)); return BFD_SEND (abfd, _get_reloc_upper_bound, (abfd, asect));
} }
/*
FUNCTION
bfd_canonicalize_reloc
SYNOPSIS
unsigned int bfd_canonicalize_reloc
(bfd *abfd,
asection *sec,
arelent **loc,
asymbol **syms);
DESCRIPTION
This function calls the back end associated with the open
<<abfd>> and translates the external form of the relocation
information attached to <<sec>> into the internal canonical
form. The table is placed into memory at <<loc>>, which has
been preallocated, usually by a call to
<<bfd_get_reloc_upper_bound>>.
The <<syms>> table is also needed for horrible internal magic
reasons.
*/
unsigned int unsigned int
DEFUN(bfd_canonicalize_reloc,(abfd, asect, location, symbols), DEFUN(bfd_canonicalize_reloc,(abfd, asect, location, symbols),
bfd *abfd AND bfd *abfd AND
@ -287,13 +371,35 @@ DEFUN(bfd_canonicalize_reloc,(abfd, asect, location, symbols),
asymbol **symbols) asymbol **symbols)
{ {
if (abfd->format != bfd_object) { if (abfd->format != bfd_object) {
bfd_error = invalid_operation; bfd_error = invalid_operation;
return 0; return 0;
} }
return BFD_SEND (abfd, _bfd_canonicalize_reloc, (abfd, asect, location, symbols)); return BFD_SEND (abfd, _bfd_canonicalize_reloc,
(abfd, asect, location, symbols));
} }
/*
FUNCTION
bfd_set_file_flags
SYNOPSIS
boolean bfd_set_file_flags(bfd *abfd, flagword flags);
DESCRIPTION
This function attempts to set the flag word in the referenced
BFD structure to the value supplied.
Possible errors are:
o wrong_format - The target bfd was not of object format.
o invalid_operation - The target bfd was open for reading.
o invalid_operation -
The flag word contained a bit which was not applicable to the
type of file. eg, an attempt was made to set the D_PAGED bit
on a bfd format which does not support demand paging
*/
boolean boolean
bfd_set_file_flags (abfd, flags) bfd_set_file_flags (abfd, flags)
bfd *abfd; bfd *abfd;
@ -318,6 +424,19 @@ bfd_set_file_flags (abfd, flags)
return true; return true;
} }
/*
FUNCTION
bfd_set_reloc
SYNOPSIS
void bfd_set_reloc
(bfd *abfd, asection *sec, arelent **rel, unsigned int count)
DESCRIPTION
This function sets the relocation pointer and count within a
section to the supplied values.
*/
void void
bfd_set_reloc (ignore_abfd, asect, location, count) bfd_set_reloc (ignore_abfd, asect, location, count)
@ -344,7 +463,6 @@ FUNCTION
bfd_set_start_address bfd_set_start_address
DESCRIPTION DESCRIPTION
Marks the entry point of an output BFD. Marks the entry point of an output BFD.
RETURNS RETURNS
@ -366,16 +484,15 @@ bfd_vma vma;
/* /*
FUNCTION FUNCTION
bfd_get_mtime The bfd_get_mtime function
DESCRIPTION
Return cached file modification time (e.g. as read from
archive header for archive members, or from file system if we
have been called before); else determine modify time, cache
it, and return it.
SYNOPSIS SYNOPSIS
long bfd_get_mtime(bfd *); long bfd_get_mtime(bfd *);
DESCRIPTION
Return file modification time (as read from file system, or
from archive header for archive members).
*/ */
long long
@ -392,9 +509,8 @@ bfd_get_mtime (abfd)
if (0 != fstat (fileno (fp), &buf)) if (0 != fstat (fileno (fp), &buf))
return 0; return 0;
abfd->mtime_set = true; abfd->mtime = buf.st_mtime; /* Save value in case anyone wants it */
abfd->mtime = buf.st_mtime; return buf.st_mtime;
return abfd->mtime;
} }
/* /*
@ -407,8 +523,8 @@ DESCRIPTION
.#define bfd_sizeof_headers(abfd, reloc) \ .#define bfd_sizeof_headers(abfd, reloc) \
. BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc)) . BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc))
. .
.#define bfd_find_nearest_line(abfd, section, symbols, offset, filename_ptr, func, line_ptr) \ .#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \
. BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, section, symbols, offset, filename_ptr, func, line_ptr)) . BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, sec, syms, off, file, func, line))
. .
.#define bfd_debug_info_start(abfd) \ .#define bfd_debug_info_start(abfd) \
. BFD_SEND (abfd, _bfd_debug_info_start, (abfd)) . BFD_SEND (abfd, _bfd_debug_info_start, (abfd))
@ -455,6 +571,8 @@ DESCRIPTION
.#define bfd_coff_swap_aouthdr_out(abfd, i,o) \ .#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
. BFD_SEND (abfd, _bfd_coff_swap_aouthdr_out, (abfd, i, o)) . BFD_SEND (abfd, _bfd_coff_swap_aouthdr_out, (abfd, i, o))
. .
.#define bfd_get_relocated_section_contents(abfd, seclet) \
. BFD_SEND (abfd, _bfd_get_relocated_section_contents, (abfd, seclet))
*/ */

View file

@ -153,6 +153,10 @@ b_out_callback (abfd)
/* The starting addresses of the sections. */ /* The starting addresses of the sections. */
obj_textsec (abfd)->vma = execp->a_tload; obj_textsec (abfd)->vma = execp->a_tload;
obj_datasec (abfd)->vma = execp->a_dload; obj_datasec (abfd)->vma = execp->a_dload;
/* And reload the sizes, since the aout module zaps them */
obj_textsec (abfd)->_raw_size = execp->a_text;
bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section */ bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section */
obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign); obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign);
@ -164,14 +168,14 @@ b_out_callback (abfd)
obj_textsec (abfd)->rel_filepos = N_TROFF(*execp); obj_textsec (abfd)->rel_filepos = N_TROFF(*execp);
obj_datasec (abfd)->rel_filepos = N_DROFF(*execp); obj_datasec (abfd)->rel_filepos = N_DROFF(*execp);
adata(abfd)->page_size = 1; /* Not applicable. */ adata(abfd).page_size = 1; /* Not applicable. */
adata(abfd)->segment_size = 1; /* Not applicable. */ adata(abfd).segment_size = 1; /* Not applicable. */
adata(abfd)->exec_bytes_size = EXEC_BYTES_SIZE; adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE;
return abfd->xvec; return abfd->xvec;
} }
struct container { struct bout_data_struct {
struct aoutdata a; struct aoutdata a;
struct internal_exec e; struct internal_exec e;
}; };
@ -180,15 +184,15 @@ static boolean
b_out_mkobject (abfd) b_out_mkobject (abfd)
bfd *abfd; bfd *abfd;
{ {
struct container *rawptr; struct bout_data_struct *rawptr;
rawptr = (struct container *) bfd_zalloc (abfd, sizeof (struct container)); rawptr = (struct bout_data_struct *) bfd_zalloc (abfd, sizeof (struct bout_data_struct));
if (rawptr == NULL) { if (rawptr == NULL) {
bfd_error = no_memory; bfd_error = no_memory;
return false; return false;
} }
set_tdata (abfd, &rawptr->a); abfd->tdata.bout_data = rawptr;
exec_hdr (abfd) = &rawptr->e; exec_hdr (abfd) = &rawptr->e;
/* For simplicity's sake we just make all the sections right here. */ /* For simplicity's sake we just make all the sections right here. */
@ -211,9 +215,9 @@ b_out_write_object_contents (abfd)
exec_hdr (abfd)->a_info = BMAGIC; exec_hdr (abfd)->a_info = BMAGIC;
exec_hdr (abfd)->a_text = obj_textsec (abfd)->size; exec_hdr (abfd)->a_text = obj_textsec (abfd)->_cooked_size;
exec_hdr (abfd)->a_data = obj_datasec (abfd)->size; exec_hdr (abfd)->a_data = obj_datasec (abfd)->_cooked_size;
exec_hdr (abfd)->a_bss = obj_bsssec (abfd)->size; exec_hdr (abfd)->a_bss = obj_bsssec (abfd)->_cooked_size;
exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) * sizeof (struct nlist); exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) * sizeof (struct nlist);
exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd);
exec_hdr (abfd)->a_trsize = ((obj_textsec (abfd)->reloc_count) * exec_hdr (abfd)->a_trsize = ((obj_textsec (abfd)->reloc_count) *
@ -318,6 +322,9 @@ b_out_slurp_reloc_table (abfd, asect, symbols)
sec_ptr asect; sec_ptr asect;
asymbol **symbols; asymbol **symbols;
{ {
abort();
#if 0
unsigned int count; unsigned int count;
size_t reloc_size; size_t reloc_size;
struct relocation_info *relocs; struct relocation_info *relocs;
@ -399,7 +406,7 @@ b_out_slurp_reloc_table (abfd, asect, symbols)
*/ */
cache_ptr->sym_ptr_ptr = symbols + symnum; cache_ptr->sym_ptr_ptr = symbols + symnum;
cache_ptr->addend = 0; cache_ptr->addend = 0;
cache_ptr->section = (asection*)NULL; /*!! cache_ptr->section = (asection*)NULL;*/
} else { } else {
/* In a.out symbols are relative to the beginning of the /* In a.out symbols are relative to the beginning of the
* file rather than sections ? * file rather than sections ?
@ -449,6 +456,8 @@ b_out_slurp_reloc_table (abfd, asect, symbols)
free (relocs); free (relocs);
asect->relocation = reloc_cache; asect->relocation = reloc_cache;
asect->reloc_count = count; asect->reloc_count = count;
#endif
return true; return true;
} }
@ -458,6 +467,9 @@ b_out_squirt_out_relocs (abfd, section)
bfd *abfd; bfd *abfd;
asection *section; asection *section;
{ {
abort();
#if 0
arelent **generic; arelent **generic;
unsigned int count = section->reloc_count; unsigned int count = section->reloc_count;
@ -556,7 +568,7 @@ b_out_squirt_out_relocs (abfd, section)
return false; return false;
} }
free ((PTR)native); free ((PTR)native);
#endif
return true; return true;
} }
@ -617,14 +629,14 @@ b_out_set_section_contents (abfd, section, location, offset, count)
{ {
if (abfd->output_has_begun == false) { /* set by bfd.c handler */ if (abfd->output_has_begun == false) { /* set by bfd.c handler */
if ((obj_textsec (abfd) == NULL) || (obj_datasec (abfd) == NULL) /*|| if ((obj_textsec (abfd) == NULL) || (obj_datasec (abfd) == NULL) /*||
(obj_textsec (abfd)->size == 0) || (obj_datasec (abfd)->size == 0)*/) { (obj_textsec (abfd)->_cooked_size == 0) || (obj_datasec (abfd)->_cooked_size == 0)*/) {
bfd_error = invalid_operation; bfd_error = invalid_operation;
return false; return false;
} }
obj_textsec (abfd)->filepos = sizeof(struct internal_exec); obj_textsec (abfd)->filepos = sizeof(struct internal_exec);
obj_datasec(abfd)->filepos = obj_textsec(abfd)->filepos obj_datasec(abfd)->filepos = obj_textsec(abfd)->filepos
+ obj_textsec (abfd)->size; + obj_textsec (abfd)->_cooked_size;
} }
/* regardless, once we know what we're doing, we might as well get going */ /* regardless, once we know what we're doing, we might as well get going */
@ -701,7 +713,7 @@ DEFUN(b_out_sizeof_headers,(ignore_abfd, ignore),
#define aout_32_bfd_debug_info_end bfd_void #define aout_32_bfd_debug_info_end bfd_void
#define aout_32_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void #define aout_32_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void
#define aout_32_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
bfd_target b_out_vec_big_host = bfd_target b_out_vec_big_host =
{ {
"b.out.big", /* name */ "b.out.big", /* name */

View file

@ -45,7 +45,9 @@ asymbol *symbol;
long relocation = 0; long relocation = 0;
if (symbol != (asymbol *)NULL) { if (symbol != (asymbol *)NULL) {
if (symbol->flags & BSF_FORT_COMM) { if (symbol->section == &bfd_com_section)
{
relocation = 0; relocation = 0;
} else { } else {
relocation = symbol->value; relocation = symbol->value;
@ -83,7 +85,7 @@ DEFUN(a29k_reloc,(abfd, reloc_entry, symbol_in, data, input_section),
r_type = reloc_entry->howto->type; r_type = reloc_entry->howto->type;
/* FIXME: Do we need to check for partial linking here */ /* FIXME: Do we need to check for partial linking here */
if (symbol_in && (symbol_in->flags & BSF_UNDEFINED)) if (symbol_in && (symbol_in->section == &bfd_und_section))
{ {
/* Keep the state machine happy in case we're called again */ /* Keep the state machine happy in case we're called again */
if (r_type == R_IHIHALF) if (r_type == R_IHIHALF)
@ -233,7 +235,7 @@ static reloc_howto_type howto_table[] =
#define RELOC_PROCESSING(relent, reloc, symbols, abfd, section) \ #define RELOC_PROCESSING(relent, reloc, symbols, abfd, section) \
reloc_processing(relent, reloc, symbols, abfd, section) reloc_processing(relent, reloc, symbols, abfd, section)
void DEFUN(reloc_processing,(relent,reloc, symbols, abfd, section) , static void DEFUN(reloc_processing,(relent,reloc, symbols, abfd, section) ,
arelent *relent AND arelent *relent AND
struct internal_reloc *reloc AND struct internal_reloc *reloc AND
asymbol **symbols AND asymbol **symbols AND
@ -266,7 +268,7 @@ void DEFUN(reloc_processing,(relent,reloc, symbols, abfd, section) ,
relent->addend = 0; relent->addend = 0;
} }
relent->address-= section->vma; relent->address-= section->vma;
relent->section = 0; /* relent->section = 0;*/
} }
} }

View file

@ -1,6 +1,7 @@
/* Motorola 68000 COFF back-end for BFD. /* Hitachi H8/300 COFF back-end for BFD.
Copyright (C) 1990-1991 Free Software Foundation, Inc. Copyright (C) 1990-1991 Free Software Foundation, Inc.
Written by Cygnus Support. Written by Steve Chamberlain
sac@cygnus.com
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
@ -23,8 +24,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "sysdep.h" #include "sysdep.h"
#include "libbfd.h" #include "libbfd.h"
#include "obstack.h" #include "obstack.h"
#include "coff-h8300.h" #include "coff/h8300.h"
#include "internalcoff.h" #include "coff/internal.h"
#include "libcoff.h" #include "libcoff.h"
static reloc_howto_type howto_table[] = static reloc_howto_type howto_table[] =
@ -35,12 +36,21 @@ static reloc_howto_type howto_table[] =
HOWTO(R_PCRBYTE, 0, 0, 8, true, 0, false, true,0,"DISP8", true, 0x000000ff,0x000000ff, true), HOWTO(R_PCRBYTE, 0, 0, 8, true, 0, false, true,0,"DISP8", true, 0x000000ff,0x000000ff, true),
HOWTO(R_PCRWORD, 0, 1, 16, true, 0, false, true,0,"DISP16", true, 0x0000ffff,0x0000ffff, true), HOWTO(R_PCRWORD, 0, 1, 16, true, 0, false, true,0,"DISP16", true, 0x0000ffff,0x0000ffff, true),
HOWTO(R_PCRLONG, 0, 2, 32, true, 0, false, true,0,"DISP32", true, 0xffffffff,0xffffffff, true), HOWTO(R_PCRLONG, 0, 2, 32, true, 0, false, true,0,"DISP32", true, 0xffffffff,0xffffffff, true),
HOWTO(R_MOVB1, 0, 1, 16, false, 0, true,
true,0,"16/8", true, 0x0000ffff,0x0000ffff, false),
HOWTO(R_MOVB2, 0, 1, 16, false, 0, true,
true,0,"8/16", true, 0x0000ffff,0x0000ffff, false),
HOWTO(R_JMP1, 0, 1, 16, false, 0, true, true,0,"16/pcrel", true, 0x0000ffff,0x0000ffff, false),
HOWTO(R_JMP2, 0, 0, 8, false, 0, true, true,0,"pcrecl/16", true, 0x000000ff,0x000000ff, false),
}; };
/* Turn a howto into a reloc number */ /* Turn a howto into a reloc number */
#define SELECT_RELOC(x,howto) { x = howto_table[howto->size +(int)howto->pc_relative*3].type; } #define SELECT_RELOC(x,howto) \
{ x = howto_table[howto->size +(int)howto->pc_relative*3].type; }
#define BADMAG(x) H8300BADMAG(x) #define BADMAG(x) H8300BADMAG(x)
#define H8300 1 /* Customize coffcode.h */ #define H8300 1 /* Customize coffcode.h */
#define __A_MAGIC_SET__ #define __A_MAGIC_SET__
@ -48,8 +58,8 @@ static reloc_howto_type howto_table[] =
/* Code to swap in the reloc */ /* Code to swap in the reloc */
#define SWAP_IN_RELOC_OFFSET bfd_h_get_16 #define SWAP_IN_RELOC_OFFSET bfd_h_get_32
#define SWAP_OUT_RELOC_OFFSET bfd_h_put_16 #define SWAP_OUT_RELOC_OFFSET bfd_h_put_32
#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \ #define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \
dst->r_stuff[0] = 'S'; \ dst->r_stuff[0] = 'S'; \
dst->r_stuff[1] = 'C'; dst->r_stuff[1] = 'C';
@ -57,8 +67,45 @@ static reloc_howto_type howto_table[] =
/* Code to turn a r_type into a howto ptr, uses the above howto table /* Code to turn a r_type into a howto ptr, uses the above howto table
*/ */
#define RTYPE2HOWTO(internal, relocentry) \ static void
(internal)->howto = ( howto_table + (relocentry).r_type - R_RELBYTE); DEFUN(rtype2howto,(internal, dst),
arelent *internal AND
struct internal_reloc *dst)
{
switch (dst->r_type) {
case R_RELBYTE:
internal->howto = howto_table+ 0;
break;
case R_RELWORD:
internal->howto = howto_table+ 1;
break;
case R_PCRBYTE:
internal->howto = howto_table+3;
break;
case R_PCRWORD:
internal->howto = howto_table+ 4;
break;
case R_MOVB1:
internal->howto = howto_table + 6;
break;
case R_MOVB2:
internal->howto = howto_table + 7;
break;
case R_JMP1:
internal->howto = howto_table +8;
break;
case R_JMP2:
internal->howto = howto_table +9;
break;
default:
abort();
break;
}
}
#define RTYPE2HOWTO(internal, relocentry) rtype2howto(internal,relocentry)
/* Perform any necessaru magic to the addend in a reloc entry */ /* Perform any necessaru magic to the addend in a reloc entry */
@ -68,6 +115,40 @@ static reloc_howto_type howto_table[] =
cache_ptr->addend = ext_reloc.r_offset; cache_ptr->addend = ext_reloc.r_offset;
#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \
reloc_processing(relent, reloc, symbols, abfd, section)
static void DEFUN(reloc_processing,(relent,reloc, symbols, abfd, section) ,
arelent *relent AND
struct internal_reloc *reloc AND
asymbol **symbols AND
bfd *abfd AND
asection *section)
{
asymbol *ptr;
relent->address = reloc->r_vaddr;
rtype2howto(relent,reloc);
if (reloc->r_symndx > 0)
{
relent->sym_ptr_ptr = symbols + obj_convert(abfd)[reloc->r_symndx];
}
else
{
relent->sym_ptr_ptr = &(bfd_abs_symbol);
}
relent->addend = reloc->r_offset;
relent->address-= section->vma;
/* relent->section = 0;*/
}
#include "coffcode.h" #include "coffcode.h"
@ -84,7 +165,7 @@ bfd_target h8300coff_vec =
HAS_LINENO | HAS_DEBUG | HAS_LINENO | HAS_DEBUG |
HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT), HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT),
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ ( SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
'/', /* ar_pad_char */ '/', /* ar_pad_char */
15, /* ar_max_namelen */ 15, /* ar_max_namelen */
1, /* minimum section alignment */ 1, /* minimum section alignment */

File diff suppressed because it is too large Load diff

View file

@ -132,18 +132,18 @@ void DEFUN(bfd_constructor_entry,(abfd, symbol_ptr_ptr, type),
arelent_chain *reloc = (arelent_chain *)bfd_alloc(abfd, arelent_chain *reloc = (arelent_chain *)bfd_alloc(abfd,
sizeof(arelent_chain)); sizeof(arelent_chain));
reloc->relent.section = (asection *)NULL; /* reloc->relent.section = (asection *)NULL;*/
reloc->relent.addend = 0; reloc->relent.addend = 0;
reloc->relent.sym_ptr_ptr = symbol_ptr_ptr; reloc->relent.sym_ptr_ptr = symbol_ptr_ptr;
reloc->next = rel_section->constructor_chain; reloc->next = rel_section->constructor_chain;
rel_section->constructor_chain = reloc; rel_section->constructor_chain = reloc;
reloc->relent.address = rel_section->size; reloc->relent.address = rel_section->_cooked_size;
/* ask the cpu which howto to use */ /* ask the cpu which howto to use */
reloc->relent.howto = reloc->relent.howto =
bfd_reloc_type_lookup(abfd->arch_info, bfd_reloc_type_lookup(abfd->arch_info,
BFD_RELOC_CTOR); BFD_RELOC_CTOR);
rel_section->size += sizeof(int *); rel_section->_cooked_size += sizeof(int *);
rel_section->reloc_count++; rel_section->reloc_count++;
} }

View file

@ -100,16 +100,17 @@ typedef struct
in the bfd structure. This information is different for ELF core files in the bfd structure. This information is different for ELF core files
and other ELF files. */ and other ELF files. */
typedef struct typedef struct elf_core_tdata_struct
{ {
void *prstatus; /* The raw /proc prstatus structure */ void *prstatus; /* The raw /proc prstatus structure */
void *prpsinfo; /* The raw /proc prpsinfo structure */ void *prpsinfo; /* The raw /proc prpsinfo structure */
} elf_core_tdata; } elf_core_tdata;
#define core_prpsinfo(bfd) (((elf_core_tdata *)((bfd)->tdata))->prpsinfo) #define core_prpsinfo(bfd) (((bfd)->tdata.elf_core_data))->prpsinfo)
#define core_prstatus(bfd) (((elf_core_tdata *)((bfd)->tdata))->prstatus) #define core_prpstatus(bfd) (((bfd)->tdata.elf_core_data))->prpstatus)
typedef struct
typedef struct elf_obj_tdata_struct
{ {
file_ptr symtab_filepos; /* Offset to start of ELF symtab section */ file_ptr symtab_filepos; /* Offset to start of ELF symtab section */
long symtab_filesz; /* Size of ELF symtab section */ long symtab_filesz; /* Size of ELF symtab section */
@ -117,7 +118,7 @@ typedef struct
long strtab_filesz; /* Size of ELF string tbl section */ long strtab_filesz; /* Size of ELF string tbl section */
} elf_obj_tdata; } elf_obj_tdata;
#define elf_tdata(bfd) ((elf_obj_tdata *) ((bfd) -> tdata)) #define elf_tdata(bfd) ((bfd) -> tdata.elf_obj_data)
#define elf_symtab_filepos(bfd) (elf_tdata(bfd) -> symtab_filepos) #define elf_symtab_filepos(bfd) (elf_tdata(bfd) -> symtab_filepos)
#define elf_symtab_filesz(bfd) (elf_tdata(bfd) -> symtab_filesz) #define elf_symtab_filesz(bfd) (elf_tdata(bfd) -> symtab_filesz)
#define elf_strtab_filepos(bfd) (elf_tdata(bfd) -> strtab_filepos) #define elf_strtab_filepos(bfd) (elf_tdata(bfd) -> strtab_filepos)
@ -150,7 +151,7 @@ DEFUN(elf_swap_ehdr_in,(abfd, src, dst),
Elf_External_Ehdr *src AND Elf_External_Ehdr *src AND
Elf_Internal_Ehdr *dst) Elf_Internal_Ehdr *dst)
{ {
bcopy (src -> e_ident, dst -> e_ident, EI_NIDENT); memcpy (dst -> e_ident, src -> e_ident, EI_NIDENT);
dst -> e_type = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_type); dst -> e_type = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_type);
dst -> e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_machine); dst -> e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_machine);
dst -> e_version = bfd_h_get_32 (abfd, (bfd_byte *) src -> e_version); dst -> e_version = bfd_h_get_32 (abfd, (bfd_byte *) src -> e_version);
@ -223,7 +224,7 @@ DEFUN(bfd_section_from_shdr, (abfd, hdr, shstrtab),
name = hdr -> sh_name ? shstrtab + hdr -> sh_name : "unnamed"; name = hdr -> sh_name ? shstrtab + hdr -> sh_name : "unnamed";
newsect = bfd_make_section (abfd, name); newsect = bfd_make_section (abfd, name);
newsect -> vma = hdr -> sh_addr; newsect -> vma = hdr -> sh_addr;
newsect -> size = hdr -> sh_size; newsect -> _raw_size = hdr -> sh_size;
if (!(hdr -> sh_type == SHT_NOBITS)) if (!(hdr -> sh_type == SHT_NOBITS))
{ {
newsect -> filepos = hdr -> sh_offset; newsect -> filepos = hdr -> sh_offset;
@ -298,7 +299,7 @@ DEFUN(bfd_section_from_phdr, (abfd, hdr, index),
(void) strcpy (name, namebuf); (void) strcpy (name, namebuf);
newsect = bfd_make_section (abfd, name); newsect = bfd_make_section (abfd, name);
newsect -> vma = hdr -> p_vaddr; newsect -> vma = hdr -> p_vaddr;
newsect -> size = hdr -> p_filesz; newsect -> _raw_size = hdr -> p_filesz;
newsect -> filepos = hdr -> p_offset; newsect -> filepos = hdr -> p_offset;
newsect -> flags |= SEC_HAS_CONTENTS; newsect -> flags |= SEC_HAS_CONTENTS;
if (hdr -> p_type == PT_LOAD) if (hdr -> p_type == PT_LOAD)
@ -324,7 +325,7 @@ DEFUN(bfd_section_from_phdr, (abfd, hdr, index),
(void) strcpy (name, namebuf); (void) strcpy (name, namebuf);
newsect = bfd_make_section (abfd, name); newsect = bfd_make_section (abfd, name);
newsect -> vma = hdr -> p_vaddr + hdr -> p_filesz; newsect -> vma = hdr -> p_vaddr + hdr -> p_filesz;
newsect -> size = hdr -> p_memsz - hdr -> p_filesz; newsect -> _raw_size = hdr -> p_memsz - hdr -> p_filesz;
if (hdr -> p_type == PT_LOAD) if (hdr -> p_type == PT_LOAD)
{ {
newsect -> flags |= SEC_ALLOC; newsect -> flags |= SEC_ALLOC;
@ -362,7 +363,7 @@ DEFUN(bfd_prstatus,(abfd, descdata, descsz, filepos),
newsect -> alignment_power = 2; newsect -> alignment_power = 2;
if ((core_prstatus (abfd) = bfd_alloc (abfd, descsz)) != NULL) if ((core_prstatus (abfd) = bfd_alloc (abfd, descsz)) != NULL)
{ {
bcopy (descdata, core_prstatus (abfd), descsz); memcpy (core_prstatus (abfd), descdata, descsz);
} }
} }
} }
@ -418,7 +419,7 @@ char *
DEFUN(elf_core_file_failing_command, (abfd), DEFUN(elf_core_file_failing_command, (abfd),
bfd *abfd) bfd *abfd)
{ {
#if HAVE_PROCFS #ifdef HAVE_PROCFS
if (core_prpsinfo (abfd)) if (core_prpsinfo (abfd))
{ {
prpsinfo_t *p = core_prpsinfo (abfd); prpsinfo_t *p = core_prpsinfo (abfd);
@ -444,7 +445,7 @@ static int
DEFUN(elf_core_file_failing_signal, (abfd), DEFUN(elf_core_file_failing_signal, (abfd),
bfd *abfd) bfd *abfd)
{ {
#if HAVE_PROCFS #ifdef HAVE_PROCFS
if (core_prstatus (abfd)) if (core_prstatus (abfd))
{ {
return (((prstatus_t *)(core_prstatus (abfd))) -> pr_cursig); return (((prstatus_t *)(core_prstatus (abfd))) -> pr_cursig);
@ -464,7 +465,7 @@ DEFUN(elf_core_file_matches_executable_p, (core_bfd, exec_bfd),
bfd *core_bfd AND bfd *core_bfd AND
bfd *exec_bfd) bfd *exec_bfd)
{ {
#if HAVE_PROCFS #ifdef HAVE_PROCFS
char *corename; char *corename;
char *execname; char *execname;
#endif #endif
@ -477,7 +478,7 @@ DEFUN(elf_core_file_matches_executable_p, (core_bfd, exec_bfd),
return (false); return (false);
} }
#if HAVE_PROCFS #ifdef HAVE_PROCFS
/* If no prpsinfo, just return true. Otherwise, grab the last component /* If no prpsinfo, just return true. Otherwise, grab the last component
of the exec'd pathname from the prpsinfo. */ of the exec'd pathname from the prpsinfo. */
@ -587,7 +588,7 @@ DEFUN(elf_corefile_note, (abfd, hdr),
if (sectname != NULL) if (sectname != NULL)
{ {
newsect = bfd_make_section (abfd, sectname); newsect = bfd_make_section (abfd, sectname);
newsect -> size = i_note.descsz; newsect -> _raw_size = i_note.descsz;
newsect -> filepos = filepos; newsect -> filepos = filepos;
newsect -> flags = SEC_ALLOC | SEC_HAS_CONTENTS; newsect -> flags = SEC_ALLOC | SEC_HAS_CONTENTS;
newsect -> alignment_power = 2; newsect -> alignment_power = 2;
@ -707,7 +708,9 @@ wrong:
/* Allocate an instance of the elf_obj_tdata structure and hook it up to /* Allocate an instance of the elf_obj_tdata structure and hook it up to
the tdata pointer in the bfd. */ the tdata pointer in the bfd. */
if ((abfd -> tdata = bfd_zalloc (abfd, sizeof (elf_obj_tdata))) == NULL) if ((abfd -> tdata.elf_obj_data =
(elf_obj_tdata*) bfd_zalloc (abfd, sizeof (elf_obj_tdata)))
== NULL)
{ {
bfd_error = no_memory; bfd_error = no_memory;
return (NULL); return (NULL);
@ -882,7 +885,9 @@ wrong:
/* Allocate an instance of the elf_core_tdata structure and hook it up to /* Allocate an instance of the elf_core_tdata structure and hook it up to
the tdata pointer in the bfd. */ the tdata pointer in the bfd. */
if ((abfd -> tdata = bfd_zalloc (abfd, sizeof (elf_core_tdata))) == NULL) if ((abfd -> tdata.elf_core_data =
(elf_core_tdata *) bfd_zalloc (abfd, sizeof (elf_core_tdata)))
== NULL)
{ {
bfd_error = no_memory; bfd_error = no_memory;
return (NULL); return (NULL);
@ -1049,11 +1054,11 @@ DEFUN (elf_slurp_symbol_table, (abfd), bfd *abfd)
} }
else if (i_sym.st_shndx == SHN_ABS) else if (i_sym.st_shndx == SHN_ABS)
{ {
sym -> flags |= BSF_ABSOLUTE; /* sym -> flags |= BSF_ABSOLUTE; OBSOLETE */
} }
else if (i_sym.st_shndx == SHN_COMMON) else if (i_sym.st_shndx == SHN_COMMON)
{ {
sym -> flags |= BSF_FORT_COMM; sym -> section = &bfd_com_section;
} }
switch (ELF_ST_BIND (i_sym.st_info)) switch (ELF_ST_BIND (i_sym.st_info))
{ {
@ -1256,6 +1261,8 @@ DEFUN (elf_sizeof_headers, (abfd, reloc),
#define elf_bfd_debug_info_start bfd_void #define elf_bfd_debug_info_start bfd_void
#define elf_bfd_debug_info_end bfd_void #define elf_bfd_debug_info_end bfd_void
#define elf_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void #define elf_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void
#define elf_bfd_get_relocated_section_contents \
bfd_generic_get_relocated_section_contents
bfd_target elf_big_vec = bfd_target elf_big_vec =
{ {

View file

@ -185,19 +185,21 @@ DEFUN(read_id,(ieee),
} }
static void static void
DEFUN(ieee_write_expression,(abfd, value, section, symbol, pcrel, index), DEFUN(ieee_write_expression,(abfd, value,/* section,*/ symbol, pcrel, index),
bfd*abfd AND bfd*abfd AND
bfd_vma value AND bfd_vma value AND
asection *section AND /* asection *section AND*/
asymbol *symbol AND asymbol *symbol AND
boolean pcrel AND boolean pcrel AND
unsigned int index) unsigned int index)
{ {
asection *section;
unsigned int plus_count = 0; unsigned int plus_count = 0;
if (value != 0) if (value != 0)
ieee_write_int(abfd, value); ieee_write_int(abfd, value);
if (section != (asection *)NULL) { if (section != &bfd_abs_section) {
plus_count++; plus_count++;
ieee_write_byte(abfd, ieee_variable_R_enum); ieee_write_byte(abfd, ieee_variable_R_enum);
ieee_write_byte(abfd, section->index +IEEE_SECTION_NUMBER_BASE); ieee_write_byte(abfd, section->index +IEEE_SECTION_NUMBER_BASE);
@ -207,8 +209,8 @@ DEFUN(ieee_write_expression,(abfd, value, section, symbol, pcrel, index),
if (symbol != (asymbol *)NULL) { if (symbol != (asymbol *)NULL) {
plus_count++; plus_count++;
if ((symbol->flags & BSF_UNDEFINED ) || if ((symbol->section == &bfd_und_section) ||
(symbol->flags & BSF_FORT_COMM)) { (symbol->section == &bfd_com_section)) {
ieee_write_byte(abfd, ieee_variable_X_enum); ieee_write_byte(abfd, ieee_variable_X_enum);
ieee_write_int(abfd, symbol->value); ieee_write_int(abfd, symbol->value);
} }
@ -219,8 +221,8 @@ DEFUN(ieee_write_expression,(abfd, value, section, symbol, pcrel, index),
else if (symbol->flags & BSF_LOCAL) { else if (symbol->flags & BSF_LOCAL) {
/* This is a reference to a defined local symbol, /* This is a reference to a defined local symbol,
We can easily do a local as a section+offset */ We can easily do a local as a section+offset */
if (symbol->section != (asection *)NULL) { if (bfd_symbol_is_absolute(symbol) == false) {
/* If this symbol is not absolute, add the base of it */ /* If this symbol is not absolute, add the base of it */
ieee_write_byte(abfd, ieee_variable_R_enum); /* or L */ ieee_write_byte(abfd, ieee_variable_R_enum); /* or L */
ieee_write_byte(abfd, symbol->section->index + ieee_write_byte(abfd, symbol->section->index +
IEEE_SECTION_NUMBER_BASE); IEEE_SECTION_NUMBER_BASE);
@ -369,10 +371,10 @@ static ieee_symbol_index_type NOSYMBOL = { 0, 0};
static void static void
DEFUN(parse_expression,(ieee, value, section, symbol, pcrel, extra), DEFUN(parse_expression,(ieee, value,/* section,*/ symbol, pcrel, extra),
ieee_data_type *ieee AND ieee_data_type *ieee AND
bfd_vma *value AND bfd_vma *value AND
asection **section AND /* asection **section AND*/
ieee_symbol_index_type *symbol AND ieee_symbol_index_type *symbol AND
boolean *pcrel AND boolean *pcrel AND
unsigned int *extra) unsigned int *extra)
@ -383,7 +385,8 @@ DEFUN(parse_expression,(ieee, value, section, symbol, pcrel, extra),
#define NOS sp[-1] #define NOS sp[-1]
#define INC sp++; #define INC sp++;
#define DEC sp--; #define DEC sp--;
asection **section;
boolean loop = true; boolean loop = true;
ieee_value_type stack[10]; ieee_value_type stack[10];
@ -423,7 +426,7 @@ DEFUN(parse_expression,(ieee, value, section, symbol, pcrel, extra),
next_byte(&(ieee->h)); next_byte(&(ieee->h));
PUSH(NOSYMBOL, PUSH(NOSYMBOL,
0, 0,
ieee->section_table[must_parse_int(&(ieee->h))]->size); ieee->section_table[must_parse_int(&(ieee->h))]->_cooked_size);
break; break;
case ieee_variable_I_enum: case ieee_variable_I_enum:
case ieee_variable_X_enum: case ieee_variable_X_enum:
@ -501,9 +504,9 @@ DEFUN(parse_expression,(ieee, value, section, symbol, pcrel, extra),
#define ieee_seek(abfd, offset) \ #define ieee_seek(abfd, offset) \
ieee_data(abfd)->h.input_p = ieee_data(abfd)->h.first_byte + offset IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset
#define ieee_pos(abfd) ieee_data(abfd)->h.input_p -ieee_data(abfd)->h.first_byte #define ieee_pos(abfd) IEEE_DATA(abfd)->h.input_p -IEEE_DATA(abfd)->h.first_byte
static unsigned int last_index; static unsigned int last_index;
@ -545,7 +548,7 @@ static void
DEFUN(ieee_slurp_external_symbols,(abfd), DEFUN(ieee_slurp_external_symbols,(abfd),
bfd *abfd) bfd *abfd)
{ {
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
file_ptr offset = ieee->w.r.external_part; file_ptr offset = ieee->w.r.external_part;
@ -628,16 +631,13 @@ DEFUN(ieee_slurp_external_symbols,(abfd),
symbol_name_index = must_parse_int(&(ieee->h)); symbol_name_index = must_parse_int(&(ieee->h));
parse_expression(ieee, parse_expression(ieee,
&symbol->symbol.value, &symbol->symbol.value,
&symbol->symbol.section, /* &symbol->symbol.section,*/
&symbol_ignore, &symbol_ignore,
&pcrel_ignore, &pcrel_ignore,
&extra); &extra);
if (symbol->symbol.section != (asection *)NULL) {
symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT; symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
}
else {
symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT | BSF_ABSOLUTE;
}
} }
break; break;
case ieee_weak_external_reference_enum: case ieee_weak_external_reference_enum:
@ -653,7 +653,7 @@ DEFUN(ieee_slurp_external_symbols,(abfd),
value = 0; value = 0;
} }
/* This turns into a common */ /* This turns into a common */
symbol->symbol.flags = BSF_FORT_COMM; symbol->symbol.section = &bfd_com_section;
symbol->symbol.value = size; symbol->symbol.value = size;
} }
break; break;
@ -669,9 +669,9 @@ DEFUN(ieee_slurp_external_symbols,(abfd),
symbol->symbol.the_bfd = abfd; symbol->symbol.the_bfd = abfd;
symbol->symbol.name = read_id(&(ieee->h)); symbol->symbol.name = read_id(&(ieee->h));
symbol->symbol.udata = (PTR)NULL; symbol->symbol.udata = (PTR)NULL;
symbol->symbol.section = (asection *)NULL; symbol->symbol.section = &bfd_und_section;
symbol->symbol.value = (bfd_vma)0; symbol->symbol.value = (bfd_vma)0;
symbol->symbol.flags = BSF_UNDEFINED; symbol->symbol.flags = 0;
BFD_ASSERT (symbol->index >= ieee->external_reference_min_index); BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
break; break;
@ -717,9 +717,9 @@ static void
DEFUN(ieee_slurp_symbol_table,(abfd), DEFUN(ieee_slurp_symbol_table,(abfd),
bfd *abfd) bfd *abfd)
{ {
if (ieee_data(abfd)->read_symbols == false) { if (IEEE_DATA(abfd)->read_symbols == false) {
ieee_slurp_external_symbols(abfd); ieee_slurp_external_symbols(abfd);
ieee_data(abfd)->read_symbols= true; IEEE_DATA(abfd)->read_symbols= true;
} }
} }
@ -747,14 +747,14 @@ DEFUN(ieee_get_symtab,(abfd, location),
ieee_symbol_type *symp; ieee_symbol_type *symp;
static bfd dummy_bfd; static bfd dummy_bfd;
static asymbol empty_symbol = static asymbol empty_symbol =
{ &dummy_bfd," ieee empty",(symvalue)0,BSF_DEBUGGING | BSF_ABSOLUTE}; { &dummy_bfd," ieee empty",(symvalue)0,BSF_DEBUGGING };
if (abfd->symcount) { if (abfd->symcount) {
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
dummy_bfd.xvec= &ieee_vec; dummy_bfd.xvec= &ieee_vec;
ieee_slurp_symbol_table(abfd); ieee_slurp_symbol_table(abfd);
@ -769,7 +769,7 @@ if (abfd->symcount) {
ieee->external_symbol_base_offset= - ieee->external_symbol_min_index; ieee->external_symbol_base_offset= - ieee->external_symbol_min_index;
for (symp = ieee_data(abfd)->external_symbols; for (symp = IEEE_DATA(abfd)->external_symbols;
symp != (ieee_symbol_type *)NULL; symp != (ieee_symbol_type *)NULL;
symp = symp->next) { symp = symp->next) {
/* Place into table at correct index locations */ /* Place into table at correct index locations */
@ -781,7 +781,7 @@ if (abfd->symcount) {
ieee->external_reference_base_offset = ieee->external_reference_base_offset =
- ieee->external_reference_min_index +ieee->external_symbol_count ; - ieee->external_reference_min_index +ieee->external_symbol_count ;
for (symp = ieee_data(abfd)->external_reference; for (symp = IEEE_DATA(abfd)->external_reference;
symp != (ieee_symbol_type *)NULL; symp != (ieee_symbol_type *)NULL;
symp = symp->next) { symp = symp->next) {
location[symp->index + ieee->external_reference_base_offset] = location[symp->index + ieee->external_reference_base_offset] =
@ -815,7 +815,7 @@ static void
DEFUN(ieee_slurp_sections,(abfd), DEFUN(ieee_slurp_sections,(abfd),
bfd *abfd) bfd *abfd)
{ {
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
file_ptr offset = ieee->w.r.section_part; file_ptr offset = ieee->w.r.section_part;
asection *section = (asection *)NULL; asection *section = (asection *)NULL;
@ -923,11 +923,11 @@ DEFUN(ieee_slurp_sections,(abfd),
switch (t) { switch (t) {
case ieee_section_size_enum: case ieee_section_size_enum:
section = ieee->section_table[must_parse_int(&(ieee->h))]; section = ieee->section_table[must_parse_int(&(ieee->h))];
section->size = must_parse_int(&(ieee->h)); section->_raw_size = must_parse_int(&(ieee->h));
break; break;
case ieee_physical_region_size_enum: case ieee_physical_region_size_enum:
section = ieee->section_table[must_parse_int(&(ieee->h))]; section = ieee->section_table[must_parse_int(&(ieee->h))];
section->size = must_parse_int(&(ieee->h)); section->_raw_size = must_parse_int(&(ieee->h));
break; break;
case ieee_region_base_address_enum: case ieee_region_base_address_enum:
section = ieee->section_table[must_parse_int(&(ieee->h))]; section = ieee->section_table[must_parse_int(&(ieee->h))];
@ -975,10 +975,10 @@ DEFUN(ieee_archive_p,(abfd),
uint8e_type buffer[512]; uint8e_type buffer[512];
int buffer_offset = 0; int buffer_offset = 0;
ieee_ar_data_type *save = ieee_ar_data(abfd); ieee_ar_data_type *save = IEEE_AR_DATA(abfd);
ieee_ar_data_type *ieee ; ieee_ar_data_type *ieee ;
set_tdata(abfd, bfd_alloc(abfd, sizeof(ieee_ar_data_type))); abfd->tdata.ieee_ar_data = (ieee_ar_data_type *)bfd_alloc(abfd, sizeof(ieee_ar_data_type));
ieee= ieee_ar_data(abfd); ieee= IEEE_AR_DATA(abfd);
bfd_read((PTR)buffer, 1, sizeof(buffer), abfd); bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
@ -994,7 +994,7 @@ uint8e_type buffer[512];
library= read_id(&(ieee->h)); library= read_id(&(ieee->h));
if (strcmp(library , "LIBRARY") != 0) { if (strcmp(library , "LIBRARY") != 0) {
bfd_release(abfd, ieee); bfd_release(abfd, ieee);
set_tdata (abfd, save); abfd->tdata.ieee_ar_data = save;
return (bfd_target *)NULL; return (bfd_target *)NULL;
} }
/* Throw away the filename */ /* Throw away the filename */
@ -1066,7 +1066,7 @@ static boolean
DEFUN(ieee_mkobject,(abfd), DEFUN(ieee_mkobject,(abfd),
bfd *abfd) bfd *abfd)
{ {
set_tdata (abfd, bfd_zalloc(abfd,sizeof(ieee_data_type))); abfd->tdata.ieee_data = (ieee_data_type *)bfd_zalloc(abfd,sizeof(ieee_data_type));
return true; return true;
@ -1080,10 +1080,10 @@ DEFUN(ieee_object_p,(abfd),
unsigned int part; unsigned int part;
ieee_data_type *ieee; ieee_data_type *ieee;
uint8e_type buffer[300]; uint8e_type buffer[300];
ieee_data_type *save = ieee_data(abfd); ieee_data_type *save = IEEE_DATA(abfd);
set_tdata (abfd, 0); abfd->tdata.ieee_data = 0;
ieee_mkobject(abfd); ieee_mkobject(abfd);
ieee = ieee_data(abfd); ieee = IEEE_DATA(abfd);
/* Read the first few bytes in to see if it makes sense */ /* Read the first few bytes in to see if it makes sense */
bfd_read((PTR)buffer, 1, sizeof(buffer), abfd); bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
@ -1155,16 +1155,16 @@ DEFUN(ieee_object_p,(abfd),
quickly. We can work out how big the file is from the trailer quickly. We can work out how big the file is from the trailer
record */ record */
ieee_data(abfd)->h.first_byte = (uint8e_type *) bfd_alloc(ieee->h.abfd, ieee->w.r.me_record IEEE_DATA(abfd)->h.first_byte = (uint8e_type *) bfd_alloc(ieee->h.abfd, ieee->w.r.me_record
+ 50); + 50);
bfd_seek(abfd, 0, 0); bfd_seek(abfd, 0, 0);
bfd_read((PTR)(ieee_data(abfd)->h.first_byte), 1, ieee->w.r.me_record+50, abfd); bfd_read((PTR)(IEEE_DATA(abfd)->h.first_byte), 1, ieee->w.r.me_record+50, abfd);
ieee_slurp_sections(abfd); ieee_slurp_sections(abfd);
return abfd->xvec; return abfd->xvec;
fail: fail:
(void) bfd_release(abfd, ieee); (void) bfd_release(abfd, ieee);
set_tdata (abfd, save); abfd->tdata.ieee_data = save;
return (bfd_target *)NULL; return (bfd_target *)NULL;
} }
@ -1262,9 +1262,11 @@ DEFUN(do_one,(ieee, current_map, location_ptr,s),
current_map->reloc_tail_ptr= &r->next; current_map->reloc_tail_ptr= &r->next;
r->next = (ieee_reloc_type *)NULL; r->next = (ieee_reloc_type *)NULL;
next_byte(&(ieee->h)); next_byte(&(ieee->h));
abort();
parse_expression(ieee, parse_expression(ieee,
&r->relent.addend, &r->relent.addend,
&r->relent.section, /* &r->relent.section,*/
&r->symbol, &r->symbol,
&pcrel, &extra); &pcrel, &extra);
r->relent.address = current_map->pc; r->relent.address = current_map->pc;
@ -1394,7 +1396,7 @@ DEFUN(ieee_slurp_section_data,(abfd),
bfd *abfd) bfd *abfd)
{ {
bfd_byte *location_ptr = (bfd_byte *)NULL; bfd_byte *location_ptr = (bfd_byte *)NULL;
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
unsigned int section_number ; unsigned int section_number ;
ieee_per_section_type *current_map = (ieee_per_section_type *)NULL; ieee_per_section_type *current_map = (ieee_per_section_type *)NULL;
@ -1409,7 +1411,7 @@ DEFUN(ieee_slurp_section_data,(abfd),
for (s = abfd->sections; s != (asection *)NULL; s = s->next) { for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd; ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd;
per->data = (bfd_byte *) bfd_alloc(ieee->h.abfd, s->size); per->data = (bfd_byte *) bfd_alloc(ieee->h.abfd, s->_raw_size);
/*SUPPRESS 68*/ /*SUPPRESS 68*/
per->reloc_tail_ptr = per->reloc_tail_ptr =
(ieee_reloc_type **)&(s->relocation); (ieee_reloc_type **)&(s->relocation);
@ -1450,10 +1452,12 @@ DEFUN(ieee_slurp_section_data,(abfd),
boolean pcrel; boolean pcrel;
next_byte(&(ieee->h)); next_byte(&(ieee->h));
must_parse_int(&(ieee->h)); /* Thow away section #*/ must_parse_int(&(ieee->h)); /* Thow away section #*/
parse_expression(ieee, &value, &dsection, &symbol, parse_expression(ieee, &value,
/* &dsection, */
&symbol,
&pcrel, &extra); &pcrel, &extra);
current_map->pc = value; current_map->pc = value;
BFD_ASSERT((unsigned)(value - s->vma) <= s->size); BFD_ASSERT((unsigned)(value - s->vma) <= s->_raw_size);
} }
break; break;
@ -1556,7 +1560,7 @@ DEFUN(ieee_canonicalize_reloc,(abfd, section, relptr, symbols),
{ {
/* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/ /* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
ieee_reloc_type *src = (ieee_reloc_type *)(section->relocation); ieee_reloc_type *src = (ieee_reloc_type *)(section->relocation);
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
while (src != (ieee_reloc_type *)NULL) { while (src != (ieee_reloc_type *)NULL) {
/* Work out which symbol to attach it this reloc to */ /* Work out which symbol to attach it this reloc to */
@ -1599,25 +1603,28 @@ static void
DEFUN(ieee_write_section_part,(abfd), DEFUN(ieee_write_section_part,(abfd),
bfd *abfd) bfd *abfd)
{ {
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
asection *s; asection *s;
ieee->w.r.section_part = bfd_tell(abfd); ieee->w.r.section_part = bfd_tell(abfd);
for (s = abfd->sections; s != (asection *)NULL; s=s->next) { for (s = abfd->sections; s != (asection *)NULL; s=s->next) {
ieee_write_byte(abfd, ieee_section_type_enum); if (s != &bfd_abs_section)
ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE); {
ieee_write_byte(abfd, ieee_section_type_enum);
ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
if (abfd->flags & EXEC_P) if (abfd->flags & EXEC_P)
{ {
/* This image is executable, so output absolute sections */ /* This image is executable, so output absolute sections */
ieee_write_byte(abfd, ieee_variable_A_enum); ieee_write_byte(abfd, ieee_variable_A_enum);
ieee_write_byte(abfd, ieee_variable_S_enum); ieee_write_byte(abfd, ieee_variable_S_enum);
} }
else else
{ {
ieee_write_byte(abfd, ieee_variable_C_enum); ieee_write_byte(abfd, ieee_variable_C_enum);
} }
switch (s->flags &(SEC_CODE | SEC_DATA | SEC_ROM)) switch (s->flags &(SEC_CODE | SEC_DATA | SEC_ROM))
{ {
case SEC_CODE | SEC_LOAD: case SEC_CODE | SEC_LOAD:
case SEC_CODE: case SEC_CODE:
@ -1636,30 +1643,31 @@ DEFUN(ieee_write_section_part,(abfd),
} }
ieee_write_id(abfd, s->name); ieee_write_id(abfd, s->name);
#if 0 #if 0
ieee_write_int(abfd, 0); /* Parent */ ieee_write_int(abfd, 0); /* Parent */
ieee_write_int(abfd, 0); /* Brother */ ieee_write_int(abfd, 0); /* Brother */
ieee_write_int(abfd, 0); /* Context */ ieee_write_int(abfd, 0); /* Context */
#endif #endif
/* Alignment */ /* Alignment */
ieee_write_byte(abfd, ieee_section_alignment_enum); ieee_write_byte(abfd, ieee_section_alignment_enum);
ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE); ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
ieee_write_int(abfd, 1 << s->alignment_power); ieee_write_int(abfd, 1 << s->alignment_power);
/* Size */ /* Size */
ieee_write_2bytes(abfd, ieee_section_size_enum); ieee_write_2bytes(abfd, ieee_section_size_enum);
ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE); ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
ieee_write_int(abfd, s->size); ieee_write_int(abfd, s->_cooked_size);
if (abfd->flags & EXEC_P) { if (abfd->flags & EXEC_P) {
/* Relocateable sections don't have asl records */ /* Relocateable sections don't have asl records */
/* Vma */ /* Vma */
ieee_write_2bytes(abfd, ieee_section_base_address_enum); ieee_write_2bytes(abfd, ieee_section_base_address_enum);
ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE); ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
ieee_write_int(abfd, s->vma); ieee_write_int(abfd, s->vma);
}
}
} }
}
} }
@ -1688,19 +1696,19 @@ DEFUN(do_with_relocs,(abfd, s),
ieee_write_twobyte(abfd, ieee_set_current_pc_enum); ieee_write_twobyte(abfd, ieee_set_current_pc_enum);
ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE); ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
ieee_write_expression(abfd, 0, s, 0, 0, 0); ieee_write_expression(abfd, 0,/* s,!!!!*/ 0, 0, 0);
if (relocs_to_go == 0) if (relocs_to_go == 0)
{ {
/* If there arn't any relocations then output the load constant byte /* If there arn't any relocations then output the load constant byte
opcode rather than the load with relocation opcode */ opcode rather than the load with relocation opcode */
while (current_byte_index < s->size) { while (current_byte_index < s->_cooked_size) {
bfd_size_type run; bfd_size_type run;
unsigned int MAXRUN = 32; unsigned int MAXRUN = 32;
run = MAXRUN; run = MAXRUN;
if (run > s->size - current_byte_index) { if (run > s->_cooked_size - current_byte_index) {
run = s->size - current_byte_index; run = s->_cooked_size - current_byte_index;
} }
if (run != 0) { if (run != 0) {
@ -1726,10 +1734,10 @@ DEFUN(do_with_relocs,(abfd, s),
if ((PTR)stream == (PTR)NULL) { if ((PTR)stream == (PTR)NULL) {
/* Outputting a section without data, fill it up */ /* Outputting a section without data, fill it up */
stream = (uint8e_type *)(bfd_alloc(abfd, s->size)); stream = (uint8e_type *)(bfd_alloc(abfd, s->_cooked_size));
memset((PTR)stream, 0, s->size); memset((PTR)stream, 0, s->_cooked_size);
} }
while (current_byte_index < s->size) { while (current_byte_index < s->_cooked_size) {
bfd_size_type run; bfd_size_type run;
unsigned int MAXRUN = 32; unsigned int MAXRUN = 32;
if (relocs_to_go) { if (relocs_to_go) {
@ -1738,8 +1746,8 @@ DEFUN(do_with_relocs,(abfd, s),
else { else {
run = MAXRUN; run = MAXRUN;
} }
if (run > s->size - current_byte_index) { if (run > s->_cooked_size - current_byte_index) {
run = s->size - current_byte_index; run = s->_cooked_size - current_byte_index;
} }
if (run != 0) { if (run != 0) {
@ -1786,16 +1794,17 @@ DEFUN(do_with_relocs,(abfd, s),
BFD_FAIL(); BFD_FAIL();
} }
ieee_write_byte(abfd, ieee_function_either_open_b_enum); ieee_write_byte(abfd, ieee_function_either_open_b_enum);
abort();
if (r->sym_ptr_ptr != (asymbol **)NULL) { if (r->sym_ptr_ptr != (asymbol **)NULL) {
ieee_write_expression(abfd, r->addend + ov, ieee_write_expression(abfd, r->addend + ov,
r->section, /* !!! r->section,*/
*(r->sym_ptr_ptr), *(r->sym_ptr_ptr),
r->howto->pc_relative, s->index); r->howto->pc_relative, s->index);
} }
else { else {
ieee_write_expression(abfd, r->addend + ov, ieee_write_expression(abfd, r->addend + ov,
r->section, /*!!! r->section,*/
(asymbol *)NULL, (asymbol *)NULL,
r->howto->pc_relative, s->index); r->howto->pc_relative, s->index);
} }
@ -1833,7 +1842,7 @@ DEFUN(do_as_repeat, (abfd, s),
ieee_write_int(abfd, s->vma ); ieee_write_int(abfd, s->vma );
ieee_write_byte(abfd,ieee_repeat_data_enum); ieee_write_byte(abfd,ieee_repeat_data_enum);
ieee_write_int(abfd, s->size); ieee_write_int(abfd, s->_cooked_size);
ieee_write_byte(abfd, ieee_load_constant_bytes_enum); ieee_write_byte(abfd, ieee_load_constant_bytes_enum);
ieee_write_byte(abfd, 1); ieee_write_byte(abfd, 1);
ieee_write_byte(abfd, 0); ieee_write_byte(abfd, 0);
@ -1853,7 +1862,7 @@ DEFUN(do_without_relocs, (abfd, s),
else else
{ {
unsigned int i; unsigned int i;
for (i = 0; i < s->size; i++) { for (i = 0; i < s->_cooked_size; i++) {
if (stream[i] != 0) { if (stream[i] != 0) {
do_with_relocs(abfd, s); do_with_relocs(abfd, s);
return; return;
@ -2004,7 +2013,7 @@ NEXT();
section_number = THIS(); section_number = THIS();
NEXT(); NEXT();
ieee= ieee_data(input_bfd); ieee= IEEE_DATA(input_bfd);
s = ieee->section_table[section_number]; s = ieee->section_table[section_number];
if (s->output_section) { if (s->output_section) {
value = s->output_section->vma ; value = s->output_section->vma ;
@ -2387,7 +2396,7 @@ static void
DEFUN(ieee_write_debug_part, (abfd), DEFUN(ieee_write_debug_part, (abfd),
bfd *abfd) bfd *abfd)
{ {
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
bfd_chain_type *chain = ieee->chain_root; bfd_chain_type *chain = ieee->chain_root;
unsigned char output_buffer[OBS]; unsigned char output_buffer[OBS];
boolean some_debug = false; boolean some_debug = false;
@ -2400,58 +2409,64 @@ DEFUN(ieee_write_debug_part, (abfd),
if (chain == (bfd_chain_type *)NULL) { if (chain == (bfd_chain_type *)NULL) {
#if 0 #if 0
/* There is no debug info, so we'll fake some up */ /* There is no debug info, so we'll fake some up */
CONST static char fake[] = { CONST static char fake[] = {
0xf8, 0xa, 0, 5, 't', 't', 't', 't', 't', 0, 2, 3, 0xf8, 0xa, 0, 5, 't', 't', 't', 't', 't', 0, 2, 3,
'1','.','1',0x82, 1991>>8, 1991 & 0xff, 9, 20, 11, 07,50 }; '1','.','1',0x82, 1991>>8, 1991 & 0xff, 9, 20, 11, 07,50 };
ieee->w.r.debug_information_part = 0;
here;
/* bfd_write(fake, 1, sizeof(fake), abfd);*/
/* Now write a header for each section */
{
int i = 0;
asection *s = abfd->sections;
while (s) {
ieee_write_byte(abfd, 0xf8);
ieee_write_byte(abfd, 0x0b);
ieee_write_byte(abfd, 0);
ieee_write_byte(abfd, 0);
ieee_write_byte(abfd, 1);
ieee_write_byte(abfd, i + IEEE_SECTION_NUMBER_BASE);
ieee_write_expression(abfd, 0, s, 0, 0, 0);
ieee_write_byte(abfd,0);
ieee_write_byte(abfd, 0xf9);
ieee_write_expression(abfd, s->size, 0, 0, 0, 0);
s = s->next;
i++;
}
/* Close the scope */
ieee_write_byte(abfd, 0xf9);
}
#endif
}
else{
while (chain != (bfd_chain_type *)NULL) {
bfd *entry = chain->this;
ieee_data_type *entry_ieee = ieee_data(entry);
if (entry_ieee->w.r.debug_information_part) {
bfd_seek(entry, entry_ieee->w.r.debug_information_part, SEEK_SET);
relocate_debug(abfd, entry);
}
chain = chain->next;
}
if (some_debug) {
ieee->w.r.debug_information_part = here;
}
else {
ieee->w.r.debug_information_part = 0; ieee->w.r.debug_information_part = 0;
here;
/* bfd_write(fake, 1, sizeof(fake), abfd);*/
/* Now write a header for each section */
{
int i = 0;
asection *s = abfd->sections;
while (s) {
if (s != abfd->abs_section)
{
ieee_write_byte(abfd, 0xf8);
ieee_write_byte(abfd, 0x0b);
ieee_write_byte(abfd, 0);
ieee_write_byte(abfd, 0);
ieee_write_byte(abfd, 1);
ieee_write_byte(abfd, i + IEEE_SECTION_NUMBER_BASE);
ieee_write_expression(abfd, 0, s, 0, 0, 0);
ieee_write_byte(abfd,0);
ieee_write_byte(abfd, 0xf9);
ieee_write_expression(abfd, s->size, 0, 0, 0, 0);
i++;
}
s = s->next;
}
/* Close the scope */
ieee_write_byte(abfd, 0xf9);
}
#endif
}
else{
while (chain != (bfd_chain_type *)NULL) {
bfd *entry = chain->this;
ieee_data_type *entry_ieee = IEEE_DATA(entry);
if (entry_ieee->w.r.debug_information_part) {
bfd_seek(entry, entry_ieee->w.r.debug_information_part, SEEK_SET);
relocate_debug(abfd, entry);
}
chain = chain->next;
}
if (some_debug) {
ieee->w.r.debug_information_part = here;
}
else {
ieee->w.r.debug_information_part = 0;
}
} }
}
flush(); flush();
} }
@ -2461,7 +2476,7 @@ DEFUN(ieee_write_data_part,(abfd),
bfd *abfd) bfd *abfd)
{ {
asection *s; asection *s;
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
ieee->w.r.data_part = bfd_tell(abfd); ieee->w.r.data_part = bfd_tell(abfd);
for (s = abfd->sections; s != (asection *)NULL; s = s->next) for (s = abfd->sections; s != (asection *)NULL; s = s->next)
{ {
@ -2486,8 +2501,8 @@ DEFUN(init_for_output,(abfd),
{ {
asection *s; asection *s;
for (s = abfd->sections; s != (asection *)NULL; s = s->next) { for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
if (s->size != 0) { if (s->_cooked_size != 0) {
ieee_per_section(s)->data = (bfd_byte *)(bfd_alloc(abfd, s->size)); ieee_per_section(s)->data = (bfd_byte *)(bfd_alloc(abfd, s->_cooked_size));
} }
} }
} }
@ -2525,7 +2540,7 @@ DEFUN(ieee_write_external_part,(abfd),
bfd *abfd) bfd *abfd)
{ {
asymbol **q; asymbol **q;
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
unsigned int reference_index = IEEE_REFERENCE_BASE; unsigned int reference_index = IEEE_REFERENCE_BASE;
unsigned int public_index = IEEE_PUBLIC_BASE+2; unsigned int public_index = IEEE_PUBLIC_BASE+2;
@ -2536,7 +2551,7 @@ DEFUN(ieee_write_external_part,(abfd),
for (q = abfd->outsymbols; *q != (asymbol *)NULL; q++) { for (q = abfd->outsymbols; *q != (asymbol *)NULL; q++) {
asymbol *p = *q; asymbol *p = *q;
hadone = true; hadone = true;
if (p->flags & BSF_UNDEFINED) { if (p->section == &bfd_und_section) {
/* This must be a symbol reference .. */ /* This must be a symbol reference .. */
ieee_write_byte(abfd, ieee_external_reference_enum); ieee_write_byte(abfd, ieee_external_reference_enum);
ieee_write_int(abfd, reference_index); ieee_write_int(abfd, reference_index);
@ -2544,7 +2559,7 @@ DEFUN(ieee_write_external_part,(abfd),
p->value = reference_index; p->value = reference_index;
reference_index++; reference_index++;
} }
else if(p->flags & BSF_FORT_COMM) { else if(p->section == &bfd_com_section) {
/* This is a weak reference */ /* This is a weak reference */
ieee_write_byte(abfd, ieee_external_reference_enum); ieee_write_byte(abfd, ieee_external_reference_enum);
ieee_write_int(abfd, reference_index); ieee_write_int(abfd, reference_index);
@ -2574,28 +2589,28 @@ DEFUN(ieee_write_external_part,(abfd),
/* Write out the value */ /* Write out the value */
ieee_write_2bytes(abfd, ieee_value_record_enum); ieee_write_2bytes(abfd, ieee_value_record_enum);
ieee_write_int(abfd, public_index); ieee_write_int(abfd, public_index);
if (p->section != (asection *)NULL) if (p->section != &bfd_abs_section)
{ {
if (abfd->flags & EXEC_P) if (abfd->flags & EXEC_P)
{ {
/* If fully linked, then output all symbols /* If fully linked, then output all symbols
relocated */ relocated */
ieee_write_int(abfd, ieee_write_int(abfd,
p->value + p->section->output_offset+ p->section->output_section->vma); p->value + p->section->output_offset+ p->section->output_section->vma);
}
else {
ieee_write_expression(abfd,
p->value + p->section->output_offset,
p->section->output_section,
(asymbol *)NULL, false, 0);
} }
else {
ieee_write_expression(abfd,
p->value + p->section->output_offset,
/*!!! p->section->output_section,*/
(asymbol *)NULL, false, 0);
}
} }
else else
{ {
ieee_write_expression(abfd, ieee_write_expression(abfd,
p->value, p->value,
(asection *)NULL, /*!!! (asection *)NULL,*/
(asymbol *)NULL, false, 0); (asymbol *)NULL, false, 0);
} }
p->value = public_index; p->value = public_index;
@ -2639,7 +2654,7 @@ void
DEFUN(ieee_write_me_part,(abfd), DEFUN(ieee_write_me_part,(abfd),
bfd *abfd) bfd *abfd)
{ {
ieee_data_type *ieee= ieee_data(abfd); ieee_data_type *ieee= IEEE_DATA(abfd);
ieee->w.r.trailer_part = bfd_tell(abfd); ieee->w.r.trailer_part = bfd_tell(abfd);
if (abfd->start_address) { if (abfd->start_address) {
ieee->w.r.me_record = bfd_tell(abfd); ieee->w.r.me_record = bfd_tell(abfd);
@ -2658,7 +2673,7 @@ boolean
DEFUN(ieee_write_object_contents,(abfd), DEFUN(ieee_write_object_contents,(abfd),
bfd *abfd) bfd *abfd)
{ {
ieee_data_type *ieee = ieee_data(abfd); ieee_data_type *ieee = IEEE_DATA(abfd);
unsigned int i; unsigned int i;
file_ptr old; file_ptr old;
/* Fast forward over the header area */ /* Fast forward over the header area */
@ -2695,7 +2710,7 @@ DEFUN(ieee_write_object_contents,(abfd),
else else
ieee_write_byte(abfd, 0x2); /* Relocateable */ ieee_write_byte(abfd, 0x2); /* Relocateable */
ieee->w.r.envimental_record = bfd_tell(abfd); ieee->w.r.environmental_record = bfd_tell(abfd);
bfd_write(envi, 1, sizeof(envi), abfd); bfd_write(envi, 1, sizeof(envi), abfd);
output_bfd = abfd; output_bfd = abfd;
flush(); flush();
@ -2768,7 +2783,7 @@ DEFUN(ieee_openr_next_archived_file,(arch, prev),
bfd *arch AND bfd *arch AND
bfd *prev) bfd *prev)
{ {
ieee_ar_data_type *ar = ieee_ar_data(arch); ieee_ar_data_type *ar = IEEE_AR_DATA(arch);
/* take the next one from the arch state, or reset */ /* take the next one from the arch state, or reset */
if (prev == (bfd *)NULL) { if (prev == (bfd *)NULL) {
/* Reset the index - the first two entries are bogus*/ /* Reset the index - the first two entries are bogus*/
@ -2819,7 +2834,7 @@ ieee_generic_stat_arch_elt(abfd, buf)
bfd *abfd; bfd *abfd;
struct stat *buf; struct stat *buf;
{ {
ieee_ar_data_type *ar = ieee_ar_data(abfd); ieee_ar_data_type *ar = IEEE_AR_DATA(abfd);
if (ar == (ieee_ar_data_type *)NULL) { if (ar == (ieee_ar_data_type *)NULL) {
bfd_error = invalid_operation; bfd_error = invalid_operation;
return -1; return -1;
@ -2863,8 +2878,8 @@ DEFUN(ieee_bfd_debug_info_accumulate,(abfd, section),
bfd *abfd AND bfd *abfd AND
asection *section) asection *section)
{ {
ieee_data_type *ieee = ieee_data(section->owner); ieee_data_type *ieee = IEEE_DATA(section->owner);
ieee_data_type *output_ieee = ieee_data(abfd); ieee_data_type *output_ieee = IEEE_DATA(abfd);
/* can only accumulate data from other ieee bfds */ /* can only accumulate data from other ieee bfds */
if (section->owner->xvec != abfd->xvec) if (section->owner->xvec != abfd->xvec)
return; return;
@ -2911,6 +2926,7 @@ DEFUN(ieee_bfd_debug_info_accumulate,(abfd, section),
#define ieee_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr #define ieee_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
#define ieee_close_and_cleanup bfd_generic_close_and_cleanup #define ieee_close_and_cleanup bfd_generic_close_and_cleanup
#define ieee_set_arch_mach bfd_default_set_arch_mach #define ieee_set_arch_mach bfd_default_set_arch_mach
#define ieee_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
/*SUPPRESS 460 */ /*SUPPRESS 460 */
bfd_target ieee_vec = bfd_target ieee_vec =
@ -2922,7 +2938,7 @@ bfd_target ieee_vec =
(HAS_RELOC | EXEC_P | /* object flags */ (HAS_RELOC | EXEC_P | /* object flags */
HAS_LINENO | HAS_DEBUG | HAS_LINENO | HAS_DEBUG |
HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
(SEC_CODE|SEC_DATA|SEC_ROM|SEC_HAS_CONTENTS ( SEC_CODE|SEC_DATA|SEC_ROM|SEC_HAS_CONTENTS
|SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ |SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
' ', /* ar_pad_char */ ' ', /* ar_pad_char */
16, /* ar_max_namelen */ 16, /* ar_max_namelen */

View file

@ -46,7 +46,7 @@ struct artdata {
char *extended_names; /* clever intel extension */ char *extended_names; /* clever intel extension */
}; };
#define bfd_ardata(bfd) ((struct artdata *) ((bfd)->tdata)) #define bfd_ardata(bfd) ((bfd)->tdata.aout_ar_data)
/* Goes in bfd's arelt_data slot */ /* Goes in bfd's arelt_data slot */
struct areltdata { struct areltdata {
@ -189,11 +189,16 @@ extern bfd *bfd_last_cache;
/* And more follows */ /* And more follows */
void EXFUN(bfd_check_init, (void)); void EXFUN(bfd_check_init, (void));
PTR EXFUN(bfd_xmalloc, ( bfd_size_type size));
void EXFUN(bfd_write_bigendian_4byte_int, (bfd *abfd, int i));
bfd_vma EXFUN(bfd_log2, (bfd_vma x)); bfd_vma EXFUN(bfd_log2, (bfd_vma x));
void EXFUN(bfd_check_init, (void)); void EXFUN(bfd_check_init, (void));
PTR EXFUN(bfd_xmalloc, ( bfd_size_type size));
void EXFUN(bfd_write_bigendian_4byte_int, (bfd *abfd, int i));
bfd_vma EXFUN(bfd_log2, (bfd_vma x)); bfd_vma EXFUN(bfd_log2, (bfd_vma x));
#define BFD_CACHE_MAX_OPEN 10 #define BFD_CACHE_MAX_OPEN 10
extern bfd *bfd_last_cache; extern bfd *bfd_last_cache;
#define bfd_cache_lookup(x) \ #define bfd_cache_lookup(x) \
((x)==bfd_last_cache? \ ((x)==bfd_last_cache? \
(FILE*)(bfd_last_cache->iostream): \ (FILE*)(bfd_last_cache->iostream): \
@ -203,17 +208,23 @@ void EXFUN(bfd_cache_close , (bfd *));
FILE* EXFUN(bfd_open_file, (bfd *)); FILE* EXFUN(bfd_open_file, (bfd *));
FILE *EXFUN(bfd_cache_lookup_worker, (bfd *)); FILE *EXFUN(bfd_cache_lookup_worker, (bfd *));
void EXFUN(bfd_constructor_entry, (bfd *abfd, void EXFUN(bfd_constructor_entry, (bfd *abfd,
asymbol **symbol_ptr_ptr, asymbol **symbol_ptr_ptr,
CONST char*type)); CONST char*type));
CONST struct reloc_howto_struct *EXFUN(bfd_default_reloc_type_lookup CONST struct reloc_howto_struct *EXFUN(bfd_default_reloc_type_lookup
, (CONST struct bfd_arch_info *, , (CONST struct bfd_arch_info *,
bfd_reloc_code_type code)); bfd_reloc_code_type code));
bfd_byte *
EXFUN(bfd_generic_get_relocated_section_contents, (bfd *abfd,
struct bfd_seclet_struct *seclet)
);
extern bfd_arch_info_type bfd_default_arch_struct;
boolean EXFUN(bfd_default_set_arch_mach, (bfd *abfd, boolean EXFUN(bfd_default_set_arch_mach, (bfd *abfd,
enum bfd_architecture arch, enum bfd_architecture arch,
unsigned long mach)); unsigned long mach));
void EXFUN(bfd_arch_init, (void)); void EXFUN(bfd_arch_init, (void));
void EXFUN(bfd_arch_linkin, (bfd_arch_info_type *)); void EXFUN(bfd_arch_linkin, (bfd_arch_info_type *));
CONST bfd_arch_info_type *EXFUN(bfd_default_compatible CONST bfd_arch_info_type *EXFUN(bfd_default_compatible
, (CONST bfd_arch_info_type *a, , (CONST bfd_arch_info_type *a,
CONST bfd_arch_info_type *b)); CONST bfd_arch_info_type *b));
boolean EXFUN(bfd_default_scan, (CONST struct bfd_arch_info *, CONST char *)); boolean EXFUN(bfd_default_scan, (CONST struct bfd_arch_info *, CONST char *));

View file

@ -21,10 +21,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* $Id$ */ /* $Id$ */
#define UNDERSCORE_HACK 1 #define UNDERSCORE_HACK 1
#include <ansidecl.h>
#include <sysdep.h>
#include "bfd.h" #include "bfd.h"
#include "sysdep.h"
#include "libbfd.h" #include "libbfd.h"
#include "oasys.h" #include "oasys.h"
#include "liboasys.h" #include "liboasys.h"
@ -83,7 +81,7 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
bfd * CONST abfd) bfd * CONST abfd)
{ {
oasys_record_union_type record; oasys_record_union_type record;
oasys_data_type *data = oasys_data(abfd); oasys_data_type *data = OASYS_DATA(abfd);
boolean loop = true; boolean loop = true;
asymbol *dest_defined; asymbol *dest_defined;
asymbol *dest; asymbol *dest;
@ -118,7 +116,7 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
case oasys_record_is_local_enum: case oasys_record_is_local_enum:
case oasys_record_is_symbol_enum: case oasys_record_is_symbol_enum:
{ {
int flag = record.header.type == oasys_record_is_local_enum ? int flag = record.header.type == (int)oasys_record_is_local_enum ?
(BSF_LOCAL) : (BSF_GLOBAL | BSF_EXPORT); (BSF_LOCAL) : (BSF_GLOBAL | BSF_EXPORT);
@ -126,15 +124,16 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
switch (record.symbol.relb & RELOCATION_TYPE_BITS) { switch (record.symbol.relb & RELOCATION_TYPE_BITS) {
case RELOCATION_TYPE_ABS: case RELOCATION_TYPE_ABS:
dest = dest_defined--; dest = dest_defined--;
dest->section = 0; dest->section = &bfd_abs_section;
dest->flags = BSF_ABSOLUTE | flag; dest->flags = 0;
break; break;
case RELOCATION_TYPE_REL: case RELOCATION_TYPE_REL:
dest = dest_defined--; dest = dest_defined--;
dest->section = dest->section =
oasys_data(abfd)->sections[record.symbol.relb & OASYS_DATA(abfd)->sections[record.symbol.relb &
RELOCATION_SECT_BITS]; RELOCATION_SECT_BITS];
if (record.header.type == oasys_record_is_local_enum) if (record.header.type == (int)oasys_record_is_local_enum)
{ {
dest->flags = BSF_LOCAL; dest->flags = BSF_LOCAL;
if (dest->section ==(asection *)(~0)) { if (dest->section ==(asection *)(~0)) {
@ -151,16 +150,15 @@ DEFUN(oasys_slurp_symbol_table,(abfd),
break; break;
case RELOCATION_TYPE_UND: case RELOCATION_TYPE_UND:
dest = data->symbols + bfd_h_get_16(abfd, (bfd_byte *)&record.symbol.refno[0]); dest = data->symbols + bfd_h_get_16(abfd, (bfd_byte *)&record.symbol.refno[0]);
dest->section = (asection *)NULL; dest->section = &bfd_und_section;
dest->flags = BSF_UNDEFINED;
break; break;
case RELOCATION_TYPE_COM: case RELOCATION_TYPE_COM:
dest = dest_defined--; dest = dest_defined--;
dest->name = string_ptr; dest->name = string_ptr;
dest->the_bfd = abfd; dest->the_bfd = abfd;
dest->section = (asection *)NULL; dest->section = &bfd_com_section;
dest->flags = BSF_FORT_COMM;
break; break;
default: default:
dest = dest_defined--; dest = dest_defined--;
@ -216,7 +214,7 @@ DEFUN(oasys_get_symtab,(abfd, location),
if (oasys_slurp_symbol_table(abfd) == false) { if (oasys_slurp_symbol_table(abfd) == false) {
return 0; return 0;
} }
symbase = oasys_data(abfd)->symbols; symbase = OASYS_DATA(abfd)->symbols;
for (counter = 0; counter < abfd->symcount; counter++) { for (counter = 0; counter < abfd->symcount; counter++) {
*(location++) = symbase++; *(location++) = symbase++;
} }
@ -279,7 +277,7 @@ DEFUN(oasys_archive_p,(abfd),
oasys_module_table_type record; oasys_module_table_type record;
set_tdata(abfd, ar); abfd->tdata.oasys_ar_data = ar;
ar->module = module; ar->module = module;
ar->module_count = header.mod_count; ar->module_count = header.mod_count;
@ -350,8 +348,7 @@ DEFUN(oasys_mkobject,(abfd),
bfd *abfd) bfd *abfd)
{ {
set_tdata (abfd, abfd->tdata.oasys_obj_data = (oasys_data_type*)bfd_alloc(abfd, sizeof(oasys_data_type));
(oasys_data_type*)bfd_alloc(abfd, sizeof(oasys_data_type)));
return true; return true;
} }
@ -361,13 +358,13 @@ DEFUN(oasys_object_p,(abfd),
bfd *abfd) bfd *abfd)
{ {
oasys_data_type *oasys; oasys_data_type *oasys;
oasys_data_type *save = oasys_data(abfd); oasys_data_type *save = OASYS_DATA(abfd);
boolean loop = true; boolean loop = true;
boolean had_usefull = false; boolean had_usefull = false;
set_tdata (abfd, 0); abfd->tdata.oasys_obj_data = 0;
oasys_mkobject(abfd); oasys_mkobject(abfd);
oasys = oasys_data(abfd); oasys = OASYS_DATA(abfd);
memset((PTR)oasys->sections, 0xff, sizeof(oasys->sections)); memset((PTR)oasys->sections, 0xff, sizeof(oasys->sections));
/* Point to the start of the file */ /* Point to the start of the file */
@ -418,7 +415,7 @@ DEFUN(oasys_object_p,(abfd),
BFD_FAIL(); BFD_FAIL();
} }
s->size = bfd_h_get_32(abfd, (bfd_byte *) & record.section.value[0]) ; s->_raw_size = bfd_h_get_32(abfd, (bfd_byte *) & record.section.value[0]) ;
s->vma = bfd_h_get_32(abfd, (bfd_byte *)&record.section.vma[0]); s->vma = bfd_h_get_32(abfd, (bfd_byte *)&record.section.vma[0]);
s->flags= 0; s->flags= 0;
had_usefull = true; had_usefull = true;
@ -442,8 +439,7 @@ DEFUN(oasys_object_p,(abfd),
Oasys support several architectures, but I can't see a simple way Oasys support several architectures, but I can't see a simple way
to discover which one is in a particular file - we'll guess to discover which one is in a particular file - we'll guess
*/ */
abfd->obj_arch = bfd_arch_m68k; bfd_default_set_arch_mach(abfd, bfd_arch_m68k, 0);
abfd->obj_machine =0;
if (abfd->symcount != 0) { if (abfd->symcount != 0) {
abfd->flags |= HAS_SYMS; abfd->flags |= HAS_SYMS;
} }
@ -459,7 +455,7 @@ DEFUN(oasys_object_p,(abfd),
fail: fail:
(void) bfd_release(abfd, oasys); (void) bfd_release(abfd, oasys);
set_tdata (abfd, save); abfd->tdata.oasys_obj_data = save;
return (bfd_target *)NULL; return (bfd_target *)NULL;
} }
@ -469,19 +465,20 @@ DEFUN(oasys_print_symbol,(ignore_abfd, afile, symbol, how),
bfd *ignore_abfd AND bfd *ignore_abfd AND
PTR afile AND PTR afile AND
asymbol *symbol AND asymbol *symbol AND
bfd_print_symbol_enum_type how) bfd_print_symbol_type how)
{ {
FILE *file = (FILE *)afile; FILE *file = (FILE *)afile;
switch (how) { switch (how) {
case bfd_print_symbol_name_enum: case bfd_print_symbol_name:
case bfd_print_symbol_type_enum: case bfd_print_symbol_more:
fprintf(file,"%s", symbol->name); fprintf(file,"%s", symbol->name);
break; break;
case bfd_print_symbol_all_enum: case bfd_print_symbol_all:
case bfd_print_symbol_nm:
{ {
CONST char *section_name = symbol->section == (asection *)NULL ? CONST char *section_name = symbol->section == (asection *)NULL ?
"*abs" : symbol->section->name; (CONST char *) "*abs" : symbol->section->name;
bfd_print_symbol_vandf((PTR)file,symbol); bfd_print_symbol_vandf((PTR)file,symbol);
@ -511,7 +508,7 @@ DEFUN(oasys_slurp_section_data,(abfd),
bfd *CONST abfd) bfd *CONST abfd)
{ {
oasys_record_union_type record; oasys_record_union_type record;
oasys_data_type *data = oasys_data(abfd); oasys_data_type *data = OASYS_DATA(abfd);
boolean loop = true; boolean loop = true;
oasys_per_section_type *per ; oasys_per_section_type *per ;
@ -552,7 +549,7 @@ DEFUN(oasys_slurp_section_data,(abfd),
if (per->initialized == false) if (per->initialized == false)
{ {
per->data = (bfd_byte *) bfd_zalloc(abfd, section->size); per->data = (bfd_byte *) bfd_zalloc(abfd, section->_raw_size);
per->reloc_tail_ptr = (oasys_reloc_type **)&(section->relocation); per->reloc_tail_ptr = (oasys_reloc_type **)&(section->relocation);
per->had_vma = false; per->had_vma = false;
per->initialized = true; per->initialized = true;
@ -623,9 +620,15 @@ DEFUN(oasys_slurp_section_data,(abfd),
/* There is no symbol */ /* There is no symbol */
r->symbol = 0; r->symbol = 0;
/* Work out the howto */ /* Work out the howto */
abort();
#if 0
r->relent.section = r->relent.section =
data->sections[reloc & RELOCATION_SECT_BITS]; data->sections[reloc &
r->relent.addend = - r->relent.section->vma; RELOCATION_SECT_BITS];
r->relent.addend = -
r->relent.section->vma;
#endif
r->relent.address = dst_ptr - dst_base_ptr; r->relent.address = dst_ptr - dst_base_ptr;
r->relent.howto = &howto_table[reloc>>6]; r->relent.howto = &howto_table[reloc>>6];
r->relent.sym_ptr_ptr = (asymbol **)NULL; r->relent.sym_ptr_ptr = (asymbol **)NULL;
@ -658,7 +661,12 @@ DEFUN(oasys_slurp_section_data,(abfd),
/* Get symbol number */ /* Get symbol number */
r->symbol = (src[0]<<8) | src[1]; r->symbol = (src[0]<<8) | src[1];
/* Work out the howto */ /* Work out the howto */
r->relent.section = (asection *)NULL; abort();
#if 0
r->relent.section = (asection
*)NULL;
#endif
r->relent.addend = 0; r->relent.addend = 0;
r->relent.address = dst_ptr - dst_base_ptr; r->relent.address = dst_ptr - dst_base_ptr;
r->relent.howto = &howto_table[reloc>>6]; r->relent.howto = &howto_table[reloc>>6];
@ -766,10 +774,15 @@ DEFUN(oasys_canonicalize_reloc,(ignore_abfd, section, relptr, symbols),
unsigned int reloc_count = 0; unsigned int reloc_count = 0;
oasys_reloc_type *src = (oasys_reloc_type *)(section->relocation); oasys_reloc_type *src = (oasys_reloc_type *)(section->relocation);
while (src != (oasys_reloc_type *)NULL) { while (src != (oasys_reloc_type *)NULL) {
abort();
#if 0
if (src->relent.section == (asection *)NULL) if (src->relent.section == (asection *)NULL)
{ {
src->relent.sym_ptr_ptr = symbols + src->symbol; src->relent.sym_ptr_ptr = symbols + src->symbol;
} }
#endif
*relptr ++ = &src->relent; *relptr ++ = &src->relent;
src = src->next; src = src->next;
reloc_count++; reloc_count++;
@ -779,17 +792,6 @@ DEFUN(oasys_canonicalize_reloc,(ignore_abfd, section, relptr, symbols),
} }
boolean
DEFUN(oasys_set_arch_mach, (abfd, arch, machine),
bfd *abfd AND
enum bfd_architecture arch AND
unsigned long machine)
{
abfd->obj_arch = arch;
abfd->obj_machine = machine;
return true;
}
/* Writing */ /* Writing */
@ -807,7 +809,7 @@ DEFUN(oasys_write_record,(abfd, type, record, size),
size_t i; size_t i;
uint8e_type *ptr; uint8e_type *ptr;
record->header.length = size; record->header.length = size;
record->header.type = type; record->header.type = (int)type;
record->header.check_sum = 0; record->header.check_sum = 0;
record->header.fill = 0; record->header.fill = 0;
ptr = &record->pad[0]; ptr = &record->pad[0];
@ -837,17 +839,17 @@ DEFUN(oasys_write_syms, (abfd),
char *dst = symbol.name; char *dst = symbol.name;
unsigned int l = 0; unsigned int l = 0;
if (g->flags & BSF_FORT_COMM) { if (g->section == & bfd_com_section) {
symbol.relb = RELOCATION_TYPE_COM; symbol.relb = RELOCATION_TYPE_COM;
bfd_h_put_16(abfd, index, (uint8e_type *)(&symbol.refno[0])); bfd_h_put_16(abfd, index, (uint8e_type *)(&symbol.refno[0]));
index++; index++;
} }
else if (g->flags & BSF_ABSOLUTE) { else if (g->section == & bfd_abs_section) {
symbol.relb = RELOCATION_TYPE_ABS; symbol.relb = RELOCATION_TYPE_ABS;
bfd_h_put_16(abfd, 0, (uint8e_type *)(&symbol.refno[0])); bfd_h_put_16(abfd, 0, (uint8e_type *)(&symbol.refno[0]));
} }
else if (g->flags & BSF_UNDEFINED) { else if (g->section == &bfd_und_section) {
symbol.relb = RELOCATION_TYPE_UND ; symbol.relb = RELOCATION_TYPE_UND ;
bfd_h_put_16(abfd, index, (uint8e_type *)(&symbol.refno[0])); bfd_h_put_16(abfd, index, (uint8e_type *)(&symbol.refno[0]));
/* Overload the value field with the output index number */ /* Overload the value field with the output index number */
@ -909,7 +911,7 @@ DEFUN(oasys_write_sections, (abfd),
s->name); s->name);
} }
out.relb = RELOCATION_TYPE_REL | s->target_index; out.relb = RELOCATION_TYPE_REL | s->target_index;
bfd_h_put_32(abfd, s->size, (bfd_byte *) out.value); bfd_h_put_32(abfd, s->_cooked_size, (bfd_byte *) out.value);
bfd_h_put_32(abfd, s->vma, (bfd_byte *) out.vma); bfd_h_put_32(abfd, s->vma, (bfd_byte *) out.vma);
oasys_write_record(abfd, oasys_write_record(abfd,
@ -1003,7 +1005,7 @@ DEFUN(oasys_write_data, (abfd),
current_byte_index = 0; current_byte_index = 0;
processed_data.relb = s->target_index | RELOCATION_TYPE_REL; processed_data.relb = s->target_index | RELOCATION_TYPE_REL;
while (current_byte_index < s->size) while (current_byte_index < s->_cooked_size)
{ {
/* Scan forwards by eight bytes or however much is left and see if /* Scan forwards by eight bytes or however much is left and see if
there are any relocations going on */ there are any relocations going on */
@ -1015,8 +1017,8 @@ DEFUN(oasys_write_data, (abfd),
bfd_h_put_32(abfd, s->vma + current_byte_index, processed_data.addr); bfd_h_put_32(abfd, s->vma + current_byte_index, processed_data.addr);
if ((size_t)(long_length + current_byte_index) > (size_t)(s->size)) { if ((size_t)(long_length + current_byte_index) > (size_t)(s->_cooked_size)) {
long_length = s->size - current_byte_index; long_length = s->_cooked_size - current_byte_index;
} }
while (long_length > 0 && (dst - (uint8e_type*)&processed_data < 128)) { while (long_length > 0 && (dst - (uint8e_type*)&processed_data < 128)) {
@ -1062,6 +1064,9 @@ DEFUN(oasys_write_data, (abfd),
/* Is this a section relative relocation, or a symbol /* Is this a section relative relocation, or a symbol
relative relocation ? */ relative relocation ? */
abort();
#if 0
if (r->section != (asection*)NULL) if (r->section != (asection*)NULL)
{ {
/* The relent has a section attached, so it must be section /* The relent has a section attached, so it must be section
@ -1071,6 +1076,7 @@ DEFUN(oasys_write_data, (abfd),
*dst++ = rel_byte; *dst++ = rel_byte;
} }
else else
#endif
{ {
asymbol *p = *(r->sym_ptr_ptr); asymbol *p = *(r->sym_ptr_ptr);
@ -1155,7 +1161,7 @@ DEFUN(oasys_set_section_contents,(abfd, section, location, offset, count),
if (oasys_per_section(section)->data == (bfd_byte *)NULL ) if (oasys_per_section(section)->data == (bfd_byte *)NULL )
{ {
oasys_per_section(section)->data = oasys_per_section(section)->data =
(bfd_byte *)(bfd_alloc(abfd,section->size)); (bfd_byte *)(bfd_alloc(abfd,section->_cooked_size));
} }
(void) memcpy((PTR)(oasys_per_section(section)->data + offset), (void) memcpy((PTR)(oasys_per_section(section)->data + offset),
location, location,
@ -1195,7 +1201,7 @@ oasys_openr_next_archived_file(arch, prev)
bfd *arch; bfd *arch;
bfd *prev; bfd *prev;
{ {
oasys_ar_data_type *ar = oasys_ar_data(arch); oasys_ar_data_type *ar = OASYS_AR_DATA(arch);
oasys_module_info_type *p; oasys_module_info_type *p;
/* take the next one from the arch state, or reset */ /* take the next one from the arch state, or reset */
if (prev == (bfd *)NULL) { if (prev == (bfd *)NULL) {
@ -1277,17 +1283,17 @@ return 0;
#define oasys_write_armap 0 #define oasys_write_armap 0
#define oasys_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr #define oasys_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
#define oasys_close_and_cleanup bfd_generic_close_and_cleanup #define oasys_close_and_cleanup bfd_generic_close_and_cleanup
#define oasys_set_arch_mach bfd_default_set_arch_mach
#define oasys_bfd_debug_info_start bfd_void #define oasys_bfd_debug_info_start bfd_void
#define oasys_bfd_debug_info_end bfd_void #define oasys_bfd_debug_info_end bfd_void
#define oasys_bfd_debug_info_accumulate (FOO(void, (*), (bfd *, asection *)))bfd_void #define oasys_bfd_debug_info_accumulate (FOO(void, (*), (bfd *, asection *)))bfd_void
#define oasys_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
/*SUPPRESS 460 */ /*SUPPRESS 460 */
bfd_target oasys_vec = bfd_target oasys_vec =
{ {
"oasys", /* name */ "oasys", /* name */
bfd_target_oasys_flavour_enum, bfd_target_oasys_flavour,
true, /* target byte order */ true, /* target byte order */
true, /* target headers byte order */ true, /* target headers byte order */
(HAS_RELOC | EXEC_P | /* object flags */ (HAS_RELOC | EXEC_P | /* object flags */

File diff suppressed because it is too large Load diff

370
bfd/seclet.c Normal file
View file

@ -0,0 +1,370 @@
/* This module is part of BFD */
/* The intention is that one day, all the code which uses sections
will change and use seclets instead - maybe seglet would have been
a better name..
Anyway, a seclet contains enough info to be able to describe an
area of output memory in one go.
The only description so far catered for is that of the
<<bfd_indirect_seclet>>, which is a select which points to a
<<section>> and the <<asymbols>> associated with the section, so
that relocation can be done when needed.
One day there will be more types - they will at least migrate from
the linker's data structures - also there could be extra stuff,
like a bss seclet, which descibes a lump of memory as containing
zeros compactly, without the horrible SEC_* flag cruft.
*/
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
#include "seclet.h"
#include "coff/internal.h"
bfd_seclet_type *
DEFUN(bfd_new_seclet,(abfd, section),
bfd *abfd AND
asection *section)
{
bfd_seclet_type *n = (bfd_seclet_type *)bfd_alloc(abfd, sizeof(bfd_seclet_type));
if (section->seclets_tail != (bfd_seclet_type *)NULL) {
section->seclets_tail->next = n;
}
else
{
section->seclets_head = n;
}
section->seclets_tail = n;
return n;
}
#define MAX_ERRORS_IN_A_ROW 10
extern bfd_error_vector_type bfd_error_vector;
bfd_vma
DEFUN(get_value,(reloc, seclet),
arelent *reloc AND
bfd_seclet_type *seclet)
{
bfd_vma value;
if (reloc->sym_ptr_ptr)
{
asymbol *symbol = *(reloc->sym_ptr_ptr);
/* A symbol holds a pointer to a section, and an offset from the
base of the section. To relocate, we find where the section will
live in the output and add that in */
if (symbol->section == (asection *)NULL)
{
/* Ouch, this is an undefined symbol.. */
bfd_error_vector.undefined_symbol(reloc, seclet);
value = symbol->value;
}
else
{
value = symbol->value +
symbol->section->output_offset +
symbol->section->output_section->vma;
}
}
else
{
value = 0;
}
/* Add the value contained in the relocation */
value += (short)((reloc->addend) & 0xffff);
return value;
}
static char *
DEFUN(foo_bfd_get_relocated_section_contents,(seclet),
bfd_seclet_type *seclet)
{
asymbol **symbols = 0;
extern bfd *output_bfd;
bfd *abfd;
/* Get enough memory to hold the stuff */
bfd *input_bfd = seclet->u.indirect.section->owner;
asection *input_section = seclet->u.indirect.section;
char *data = malloc(input_section->_raw_size);
char *dst = data;
char *prev_dst = data;
unsigned int gap = 0;
bfd_size_type reloc_size = bfd_get_reloc_upper_bound(input_bfd,
input_section);
arelent **reloc_vector = (arelent **)ldmalloc(reloc_size);
abfd = output_bfd;
/* read in the section */
bfd_get_section_contents(input_bfd,
input_section,
data,
0,
input_section->_raw_size);
if (bfd_canonicalize_reloc(input_bfd,
input_section,
reloc_vector,
seclet->u.indirect.symbols) )
{
arelent **parent = reloc_vector;
arelent *reloc ;
unsigned int dst_address = 0;
unsigned int src_address = 0;
unsigned int run;
unsigned int idx;
/* Find how long a run we can do */
while (dst_address < seclet->size)
{
reloc = *parent;
if (reloc)
{
/* Note that the relaxing didn't tie up the addresses in the
relocation, so we use the original address to work out the
run of non-relocated data */
run = reloc->address - src_address;
parent++;
}
else
{
run = seclet->size - dst_address;
}
/* Copy the bytes */
for (idx = 0; idx < run; idx++)
{
data[dst_address++] = data[src_address++];
}
/* Now do the relocation */
if (reloc)
{
switch (reloc->howto->type)
{
case R_JMP2:
/* Speciial relaxed type */
{
bfd_vma dot = seclet->offset + dst_address + seclet->u.indirect.section->output_section->vma;
int gap = get_value(reloc,seclet)-dot-1;
if ((gap & ~0xff ) != 0 &&((gap & 0xff00)!= 0xff00)) abort();
bfd_put_8(abfd,gap, data+dst_address);
switch (data[dst_address-1])
{
case 0x5e:
/* jsr -> bsr */
bfd_put_8(abfd, 0x55, data+dst_address-1);
break;
case 0x5a:
/* jmp ->bra */
bfd_put_8(abfd, 0x40, data+dst_address-1);
break;
default:
abort();
}
dst_address++;
src_address+=3;
break;
}
case R_MOVB2:
/* Special relaxed type, there will be a gap between where we
get stuff from and where we put stuff to now
for a mov.b @aa:16 -> mov.b @aa:8
opcode 0x6a 0x0y offset
-> 0x2y off
*/
if (data[dst_address-1] != 0x6a)
abort();
switch (data[dst_address] & 0xf0)
{
case 0x00:
/* Src is memory */
data[dst_address-1] = (data[src_address] & 0xf) | 0x20;
break;
case 0x80:
/* Src is reg */
data[dst_address-1] = (data[src_address] & 0xf) | 0x30;
break;
default:
abort();
}
/* the offset must fit ! after all, what was all the relaxing
about ? */
bfd_put_8(abfd, get_value(reloc, seclet), data + dst_address);
/* Note the magic - src goes up by two bytes, but dst by only
one */
dst_address+=1;
src_address+=3;
break;
/* PCrel 8 bits */
case R_PCRBYTE:
{
bfd_vma dot = seclet->offset + dst_address + seclet->u.indirect.section->output_section->vma;
int gap = get_value(reloc,seclet)-dot;
if (gap > 127 || gap < -128)
{
bfd_error_vector.reloc_value_truncated(reloc, seclet);
}
bfd_put_8(abfd,gap, data+dst_address);
dst_address++;
src_address++;
break;
}
case R_RELBYTE:
{
unsigned int gap =get_value(reloc,seclet);
if (gap > 256)
{
bfd_error_vector.reloc_value_truncated(reloc, seclet);
}
bfd_put_8(abfd, gap, data+dst_address);
dst_address+=1;
src_address+=1;
}
break;
case R_JMP1:
/* A relword which would have like to have been a pcrel */
case R_MOVB1:
/* A relword which would like to have been modified but
didn't make it */
case R_RELWORD:
bfd_put_16(abfd, get_value(reloc,seclet), data+dst_address);
dst_address+=2;
src_address+=2;
break;
default:
abort();
}
}
}
}
free((char *)reloc_vector);
return data;
}
void
DEFUN(rel,(abfd, seclet, output_section),
bfd *abfd AND
bfd_seclet_type *seclet AND
asection *output_section)
{
bfd_byte *data;
if (output_section->flags & SEC_HAS_CONTENTS )
{
data = bfd_get_relocated_section_contents(abfd, seclet);
if(bfd_set_section_contents(abfd,
output_section,
data,
seclet->offset,
seclet->size) == false)
{
abort();
}
}
}
void
DEFUN(seclet_dump_seclet,(abfd, seclet, section),
bfd *abfd AND
bfd_seclet_type *seclet AND
asection *section)
{
switch (seclet->type)
{
case bfd_indirect_seclet:
/* The contents of this section come from another one somewhere
else */
rel(abfd, seclet, section);
break;
default:
abort();
}
}
void
DEFUN(seclet_dump,(abfd),
bfd *abfd)
{
/* Write all the seclets on the bfd out, relocate etc according to the
rules */
asection *o = abfd->sections;
while (o != (asection *)NULL)
{
bfd_seclet_type *p = o->seclets_head;
while (p != (bfd_seclet_type *)NULL)
{
seclet_dump_seclet(abfd, p, o);
p = p ->next;
}
o = o->next;
}
}

29
bfd/seclet.h Normal file
View file

@ -0,0 +1,29 @@
typedef enum
{
bfd_indirect_seclet,
} bfd_seclet_enum_type;
struct bfd_seclet_struct
{
struct bfd_seclet_struct *next;
bfd_seclet_enum_type type;
unsigned int offset;
unsigned int size;
union
{
struct
{
asection *section;
asymbol **symbols;
} indirect;
}
u;
};
typedef struct bfd_seclet_struct bfd_seclet_type;
bfd_seclet_type *EXFUN(bfd_new_seclet,(bfd*,asection*));

View file

@ -36,9 +36,7 @@ SECTION
* section prototypes:: * section prototypes::
@end menu @end menu
INODE @node Section Input, Section Output, Sections, Sections
Section Input, Section Output, Sections, Sections
SUBSECTION SUBSECTION
Section Input Section Input
@ -67,8 +65,7 @@ SUBSECTION
the data area has to be parsed to get out the data and the data area has to be parsed to get out the data and
relocations. relocations.
INODE @node Section Output, typedef asection, Section Input, Sections
Section Output, typedef asection, Section Input, Sections
SUBSECTION SUBSECTION
Section Output Section Output
@ -104,6 +101,25 @@ SUBSECTION
| output_section --------| | output_section --------|
SUBSECTION
Seglets
The data within a section is stored in a <<seglet>>. These
are much like the fixups in <<gas>>. The seglet abstraction
allows the a section to grow and shrink within itself.
A seglet knows how big it is, and which is the next seglet and
where the raw data for it is, and also points to a list of
relocations which apply to it.
The seglet is used by the linker to perform relaxing on final
code. The application creates code which is as big as
necessary to make it work without relaxing, and the user can
select whether to relax. Sometimes relaxing takes a lot of
time. The linker runs around the relocations to see if any
are attached to data which can be shrunk, if so it does it on
a seglet by seglet basis.
*/ */
@ -111,12 +127,9 @@ SUBSECTION
#include "sysdep.h" #include "sysdep.h"
#include "libbfd.h" #include "libbfd.h"
/*
INODE
typedef asection, section prototypes, Section Output, Sections
SUBSECTION
typedef asection
/*doc*
@node typedef asection, section prototypes, Section Output, Sections
SUBSECTION SUBSECTION
typedef asection typedef asection
@ -131,6 +144,11 @@ CODE_FRAGMENT
. .
. CONST char *name; . CONST char *name;
. .
.
. {* Which section is it 0.nth *}
.
. int index;
.
. {* The next section in the list belonging to the BFD, or NULL. *} . {* The next section in the list belonging to the BFD, or NULL. *}
. .
. struct sec *next; . struct sec *next;
@ -214,16 +232,21 @@ CODE_FRAGMENT
. .
.#define SEC_NEVER_LOAD 0x400 .#define SEC_NEVER_LOAD 0x400
. .
. {* The base address of the section in the address space of the .
. target. *}
. .
. bfd_vma vma; . bfd_vma vma;
. .
. {* The size of the section in bytes of the loaded section. This . {* The size of the section in bytes, as it will be output.
. contains a value even if the section has no contents (eg, the . contains a value even if the section has no contents (eg, the
. size of <<.bss>>). *} . size of <<.bss>>). This will be filled in after relocation *}
. .
. bfd_size_type size; . bfd_size_type _cooked_size;
.
. {* The size on disk of the section in bytes originally. Normally this
. value is the same as the size, but if some relaxing has
. been done, then this value will be bigger. *}
.
. bfd_size_type _raw_size;
. .
. {* If this section is going to be output, then this value is the . {* If this section is going to be output, then this value is the
. offset into the output section of the first byte in the input . offset into the output section of the first byte in the input
@ -255,10 +278,6 @@ CODE_FRAGMENT
. .
. unsigned reloc_count; . unsigned reloc_count;
. .
. {* Which section is it 0.nth *}
.
. int index;
.
. {* Information below is back end specific - and not always used . {* Information below is back end specific - and not always used
. or updated . or updated
. .
@ -295,7 +314,7 @@ CODE_FRAGMENT
. .
. {* what the section number is in the target world *} . {* what the section number is in the target world *}
. .
. unsigned int target_index; . int target_index;
. .
. PTR used_by_bfd; . PTR used_by_bfd;
. .
@ -308,13 +327,47 @@ CODE_FRAGMENT
. .
. bfd *owner; . bfd *owner;
. .
. boolean reloc_done;
. {* A symbol which points at this section only *}
. struct symbol_cache_entry *symbol;
. struct symbol_cache_entry **symbol_ptr_ptr;
. struct bfd_seclet_struct *seclets_head;
. struct bfd_seclet_struct *seclets_tail;
.} asection ; .} asection ;
.
.
.#define BFD_ABS_SECTION_NAME "*ABS*"
.#define BFD_UND_SECTION_NAME "*UND*"
.#define BFD_COM_SECTION_NAME "*COM*"
.
. {* the absolute section *}
. extern asection bfd_abs_section;
. {* Pointer to the undefined section *}
. extern asection bfd_und_section;
. {* Pointer to the common section *}
. extern asection bfd_com_section;
.
. extern struct symbol_cache_entry *bfd_abs_symbol;
. extern struct symbol_cache_entry *bfd_com_symbol;
. extern struct symbol_cache_entry *bfd_und_symbol;
.#define bfd_get_section_size_before_reloc(section) \
. (section->reloc_done ? (abort(),1): (section)->_raw_size)
.#define bfd_get_section_size_after_reloc(section) \
. ((section->reloc_done) ? (section)->_cooked_size: (abort(),1))
*/ */
/*
INODE
section prototypes, , typedef asection, Sections
asection bfd_com_section = { BFD_COM_SECTION_NAME ,0 };
asection bfd_und_section = { BFD_UND_SECTION_NAME ,0 };
asection bfd_abs_section = { BFD_ABS_SECTION_NAME ,0 };
struct symbol_cache_entry *bfd_abs_symbol;
struct symbol_cache_entry *bfd_com_symbol;
struct symbol_cache_entry *bfd_und_symbol;
/*
@node section prototypes, , typedef asection, Sections
SUBSECTION SUBSECTION
section prototypes section prototypes
@ -424,6 +477,19 @@ DEFUN(bfd_make_section,(abfd, name),
return NULL; return NULL;
} }
if (strcmp(name, BFD_ABS_SECTION_NAME) == 0)
{
return &bfd_abs_section;
}
if (strcmp(name, BFD_COM_SECTION_NAME) == 0)
{
return &bfd_com_section;
}
if (strcmp(name, BFD_UND_SECTION_NAME) == 0)
{
return &bfd_und_section;
}
while (sect) { while (sect) {
if (!strcmp(sect->name, name)) return NULL; if (!strcmp(sect->name, name)) return NULL;
prev = &sect->next; prev = &sect->next;
@ -446,6 +512,20 @@ DEFUN(bfd_make_section,(abfd, name),
newsect->reloc_count = 0; newsect->reloc_count = 0;
newsect->line_filepos =0; newsect->line_filepos =0;
newsect->owner = abfd; newsect->owner = abfd;
/* Create a symbol whos only job is to point to this section. This is
usfull for things like relocs which are relative to the base of a
section
*/
newsect->symbol = bfd_make_empty_symbol(abfd);
newsect->symbol->name = name;
newsect->symbol->value = 0;
newsect->symbol->section = newsect;
newsect->symbol->flags = BSF_SECTION_SYM;
newsect->symbol_ptr_ptr = &newsect->symbol;
if (BFD_SEND (abfd, _new_section_hook, (abfd, newsect)) != true) { if (BFD_SEND (abfd, _new_section_hook, (abfd, newsect)) != true) {
free (newsect); free (newsect);
return NULL; return NULL;
@ -564,7 +644,8 @@ DEFUN(bfd_set_section_size,(abfd, ptr, val),
return false; return false;
} }
ptr->size = val; ptr->_cooked_size = val;
ptr->_raw_size = val;
return true; return true;
} }
@ -588,6 +669,8 @@ DESCRIPTION
data is written to the output section starting at offset data is written to the output section starting at offset
@var{offset} for @var{count} bytes. @var{offset} for @var{count} bytes.
Normally <<true>> is returned, else <<false>>. Possible error Normally <<true>> is returned, else <<false>>. Possible error
returns are: returns are:
o no_contents o no_contents
@ -668,3 +751,39 @@ DEFUN(bfd_get_section_contents,(abfd, section, location, offset, count),
} }
} }
/* Initialize the internal data structures */
DEFUN_VOID(bfd_section_init)
{
bfd_com_symbol = (asymbol *)zalloc(sizeof(asymbol));
bfd_com_symbol->name = BFD_COM_SECTION_NAME;
bfd_com_symbol->flags = BSF_SECTION_SYM;
bfd_com_symbol->section = &bfd_com_section;
bfd_com_section.symbol = bfd_com_symbol;
bfd_com_section.symbol_ptr_ptr = &bfd_com_symbol;
bfd_com_section.output_section = &bfd_com_section;
bfd_und_symbol = (asymbol *)zalloc(sizeof(asymbol));
bfd_und_symbol->name = BFD_UND_SECTION_NAME;
bfd_und_symbol->flags = BSF_SECTION_SYM;
bfd_und_symbol->section = &bfd_und_section;
bfd_und_section.symbol = bfd_und_symbol;
bfd_und_section.symbol_ptr_ptr = &bfd_und_symbol;
bfd_und_section.output_section = &bfd_und_section;
bfd_abs_symbol = (asymbol *)zalloc(sizeof(asymbol));
bfd_abs_symbol->name = BFD_ABS_SECTION_NAME;
bfd_abs_symbol->flags = BSF_SECTION_SYM;
bfd_abs_symbol->section = &bfd_abs_section;
bfd_abs_section.symbol = bfd_abs_symbol;
bfd_abs_section.symbol_ptr_ptr = &bfd_abs_symbol;
bfd_abs_section.output_section = &bfd_abs_section;
}

View file

@ -93,7 +93,7 @@ d[0] = digs[((x)>>4)&0xf]; ch += (x & 0xff);
static static void
DEFUN_VOID(srec_init) DEFUN_VOID(srec_init)
{ {
unsigned int i; unsigned int i;
@ -142,7 +142,7 @@ struct srec_data_list_struct
typedef struct srec_data_list_struct srec_data_list_type; typedef struct srec_data_list_struct srec_data_list_type;
typedef struct typedef struct srec_data_struct
{ {
srec_data_list_type *head; srec_data_list_type *head;
unsigned int type; unsigned int type;
@ -208,7 +208,7 @@ DEFUN(pass_over,(abfd, func, section),
{ {
unsigned int bytes_on_line; unsigned int bytes_on_line;
boolean eof = false; boolean eof = false;
bfd_vma address;
/* To the front of the file */ /* To the front of the file */
bfd_seek(abfd, (file_ptr)0, SEEK_SET); bfd_seek(abfd, (file_ptr)0, SEEK_SET);
while (eof == false) while (eof == false)
@ -291,12 +291,12 @@ DEFUN(srec_object_p, (abfd),
and allocate enough room for the entire file. */ and allocate enough room for the entire file. */
section = bfd_make_section(abfd, ".text"); section = bfd_make_section(abfd, ".text");
section->size = 0; section->_raw_size = 0;
section->vma = 0xffffffff; section->vma = 0xffffffff;
low = 0xffffffff; low = 0xffffffff;
high = 0; high = 0;
pass_over(abfd, size_srec, section); pass_over(abfd, size_srec, section);
section->size = high - low; section->_raw_size = high - low;
section->vma = low; section->vma = low;
section->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC; section->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC;
@ -314,7 +314,7 @@ DEFUN(srec_get_section_contents,(abfd, section, location, offset, count),
{ {
if (section->used_by_bfd == (PTR)NULL) if (section->used_by_bfd == (PTR)NULL)
{ {
section->used_by_bfd = (PTR)bfd_alloc (abfd, section->size); section->used_by_bfd = (PTR)bfd_alloc (abfd, section->_raw_size);
pass_over(abfd, fillup, section); pass_over(abfd, fillup, section);
} }
(void) memcpy((PTR)location, (void) memcpy((PTR)location,
@ -346,7 +346,7 @@ DEFUN(srec_set_section_contents,(abfd, section, location, offset, bytes_to_do),
file_ptr offset AND file_ptr offset AND
bfd_size_type bytes_to_do) bfd_size_type bytes_to_do)
{ {
tdata_type *tdata = (tdata_type *)(abfd->tdata); tdata_type *tdata = abfd->tdata.srec_data;
srec_data_list_type *entry = (srec_data_list_type *) srec_data_list_type *entry = (srec_data_list_type *)
bfd_alloc(abfd, sizeof(srec_data_list_type)); bfd_alloc(abfd, sizeof(srec_data_list_type));
unsigned char *data = (unsigned char *) bfd_alloc(abfd, bytes_to_do); unsigned char *data = (unsigned char *) bfd_alloc(abfd, bytes_to_do);
@ -371,7 +371,7 @@ DEFUN(srec_set_section_contents,(abfd, section, location, offset, bytes_to_do),
entry->size = bytes_to_do; entry->size = bytes_to_do;
entry->next = tdata->head; entry->next = tdata->head;
tdata->head = entry; tdata->head = entry;
return true;
} }
/* Write a record of type, of the supplied number of bytes. The /* Write a record of type, of the supplied number of bytes. The
@ -471,7 +471,6 @@ DEFUN(srec_write_section,(abfd, tdata, list),
char buffer[MAXCHUNK]; char buffer[MAXCHUNK];
char *dst = buffer; char *dst = buffer;
bfd_vma address; bfd_vma address;
unsigned int i;
unsigned int bytes_this_chunk = list->size - bytes_written; unsigned int bytes_this_chunk = list->size - bytes_written;
@ -511,7 +510,7 @@ DEFUN(srec_mkobject, (abfd),
bfd *abfd) bfd *abfd)
{ {
tdata_type *tdata = (tdata_type *)bfd_alloc(abfd, sizeof(tdata_type)); tdata_type *tdata = (tdata_type *)bfd_alloc(abfd, sizeof(tdata_type));
abfd->tdata = (PTR)tdata; abfd->tdata.srec_data = tdata;
tdata->type = 1; tdata->type = 1;
tdata->head = (srec_data_list_type *)NULL; tdata->head = (srec_data_list_type *)NULL;
return true; return true;
@ -523,12 +522,8 @@ static boolean
DEFUN(srec_write_object_contents,(abfd), DEFUN(srec_write_object_contents,(abfd),
bfd *abfd) bfd *abfd)
{ {
bfd_vma address;
int bytes_written; int bytes_written;
tdata_type *tdata = abfd->tdata.srec_data;
int type;
unsigned int i;
tdata_type *tdata = (tdata_type *)(abfd->tdata);
srec_data_list_type *list; srec_data_list_type *list;
bytes_written = 0; bytes_written = 0;
@ -591,7 +586,7 @@ DEFUN(srec_make_empty_symbol, (abfd),
#define srec_bfd_debug_info_start bfd_void #define srec_bfd_debug_info_start bfd_void
#define srec_bfd_debug_info_end bfd_void #define srec_bfd_debug_info_end bfd_void
#define srec_bfd_debug_info_accumulate (FOO(void, (*), (bfd *, asection *))) bfd_void #define srec_bfd_debug_info_accumulate (FOO(void, (*), (bfd *, asection *))) bfd_void
#define srec_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
bfd_target srec_vec = bfd_target srec_vec =
{ {

View file

@ -22,11 +22,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
SECTION SECTION
Symbols Symbols
DESCRIPTION
BFD trys to maintain as much symbol information as it can when BFD trys to maintain as much symbol information as it can when
it moves information from file to file. BFD passes information it moves information from file to file. BFD passes information
to applications though the <<asymbol>> structure. When the to applications though the <<asymbol>> structure. When the
applicationrequests the symbol table, BFD reads the table in application requests the symbol table, BFD reads the table in
the native form and translates parts of it into the internal the native form and translates parts of it into the internal
format. To maintain more than the infomation passed to format. To maintain more than the infomation passed to
applications some targets keep some information 'behind the applications some targets keep some information 'behind the
@ -38,7 +37,7 @@ DESCRIPTION
information unique to coff which BFD doesn't know or information unique to coff which BFD doesn't know or
understand. If a coff symbol table was read, but was written understand. If a coff symbol table was read, but was written
through an a.out back end, all the coff specific information through an a.out back end, all the coff specific information
would be lost. (.. until BFD 2 :). The symbol table of a BFD would be lost. The symbol table of a BFD
is not necessarily read in until a canonicalize request is is not necessarily read in until a canonicalize request is
made. Then the BFD back end fills in a table provided by the made. Then the BFD back end fills in a table provided by the
application with pointers to the canonical information. To application with pointers to the canonical information. To
@ -57,33 +56,28 @@ DESCRIPTION
SUBSECTION SUBSECTION
Reading Symbols Reading Symbols
DESCRIPTION
There are two stages to reading a symbol table from a BFD; There are two stages to reading a symbol table from a BFD;
allocating storage, and the actual reading process. This is an allocating storage, and the actual reading process. This is an
excerpt from an appliction which reads the symbol table: excerpt from an appliction which reads the symbol table:
EXAMPLE | unsigned int storage_needed;
| asymbol **symbol_table;
unsigned int storage_needed; | unsigned int number_of_symbols;
asymbol **symbol_table; | unsigned int i;
unsigned int number_of_symbols; |
unsigned int i; | storage_needed = get_symtab_upper_bound (abfd);
|
storage_needed = get_symtab_upper_bound (abfd); | if (storage_needed == 0) {
| return ;
if (storage_needed == 0) { | }
return ; | symbol_table = (asymbol **) bfd_xmalloc (storage_needed);
} | ...
symbol_table = (asymbol **) bfd_xmalloc (storage_needed); | number_of_symbols =
... | bfd_canonicalize_symtab (abfd, symbol_table);
number_of_symbols = |
bfd_canonicalize_symtab (abfd, symbol_table); | for (i = 0; i < number_of_symbols; i++) {
| process_symbol (symbol_table[i]);
for (i = 0; i < number_of_symbols; i++) { | }
process_symbol (symbol_table[i]);
}
DESCRIPTION
All storage for the symbols themselves is in an obstack All storage for the symbols themselves is in an obstack
connected to the BFD, and is freed when the BFD is closed. connected to the BFD, and is freed when the BFD is closed.
@ -93,7 +87,6 @@ DESCRIPTION
SUBSECTION SUBSECTION
Writing Symbols Writing Symbols
DESCRIPTION
Writing of a symbol table is automatic when a BFD open for Writing of a symbol table is automatic when a BFD open for
writing is closed. The application attaches a vector of writing is closed. The application attaches a vector of
pointers to pointers to symbols to the BFD being written, and pointers to pointers to symbols to the BFD being written, and
@ -104,35 +97,32 @@ DESCRIPTION
which has been created using <<bfd_make_empty_symbol>>. An which has been created using <<bfd_make_empty_symbol>>. An
example showing the creation of a symbol table with only one element: example showing the creation of a symbol table with only one element:
EXAMPLE | #include "bfd.h"
#include "bfd.h" | main()
main() | {
{ | bfd *abfd;
bfd *abfd; | asymbol *ptrs[2];
asymbol *ptrs[2]; | asymbol *new;
asymbol *new; |
| abfd = bfd_openw("foo","a.out-sunos-big");
| bfd_set_format(abfd, bfd_object);
| new = bfd_make_empty_symbol(abfd);
| new->name = "dummy_symbol";
| new->section = bfd_make_section_old_way(abfd, ".text");
| new->flags = BSF_GLOBAL;
| new->value = 0x12345;
|
| ptrs[0] = new;
| ptrs[1] = (asymbol *)0;
|
| bfd_set_symtab(abfd, ptrs, 1);
| bfd_close(abfd);
| }
|
| ./makesym
| nm foo
| 00012345 A dummy_symbol
abfd = bfd_openw("foo","a.out-sunos-big");
bfd_set_format(abfd, bfd_object);
new = bfd_make_empty_symbol(abfd);
new->name = "dummy_symbol";
new->section = (asection *)0;
new->flags = BSF_ABSOLUTE | BSF_GLOBAL;
new->value = 0x12345;
ptrs[0] = new;
ptrs[1] = (asymbol *)0;
bfd_set_symtab(abfd, ptrs, 1);
bfd_close(abfd);
}
./makesym
nm foo
00012345 A dummy_symbol
DESCRIPTION
Many formats cannot represent arbitary symbol information; for Many formats cannot represent arbitary symbol information; for
instance the <<a.out>> object format does not allow an instance the <<a.out>> object format does not allow an
arbitary number of sections. A symbol pointing to a section arbitary number of sections. A symbol pointing to a section
@ -142,148 +132,135 @@ DESCRIPTION
*/ */
/*doc* /*
@node typedef asymbol, symbol handling functions, Writing Symbols, Symbols @node typedef asymbol, symbol handling functions, Writing Symbols, Symbols
*/ */
/* /*
TYPEDEF SUBSECTION
typedef asymbol typedef asymbol
DESCRIPTION
An <<asymbol>> has the form: An <<asymbol>> has the form:
*/
/*
CODE_FRAGMENT
.typedef struct symbol_cache_entry .typedef struct symbol_cache_entry
.{ .{
A pointer to the BFD which owns the symbol. This information . {* A pointer to the BFD which owns the symbol. This information
is necessary so that a back end can work out what additional . is necessary so that a back end can work out what additional
(invisible to the application writer) information is carried . (invisible to the application writer) information is carried
with the symbol. . with the symbol. *}
.
. struct _bfd *the_bfd; . struct _bfd *the_bfd;
.
The text of the symbol. The name is left alone, and not copied - the . {* The text of the symbol. The name is left alone, and not copied - the
application may not alter it. . application may not alter it. *}
. CONST char *name;
. CONST char *name; .
. {* The value of the symbol.*}
The value of the symbol. . symvalue value;
.
. symvalue value; . {* Attributes of a symbol: *}
.
Attributes of a symbol:
.#define BSF_NO_FLAGS 0x00 .#define BSF_NO_FLAGS 0x00
.
The symbol has local scope; <<static>> in <<C>>. The value is . {* The symbol has local scope; <<static>> in <<C>>. The value
the offset into the section of the data. . is the offset into the section of the data. *}
.#define BSF_LOCAL 0x01 .#define BSF_LOCAL 0x01
.
The symbol has global scope; initialized data in <<C>>. The value . {* The symbol has global scope; initialized data in <<C>>. The
is the offset into the section of the data. . value is the offset into the section of the data. *}
.#define BSF_GLOBAL 0x02 .#define BSF_GLOBAL 0x02
.
Obsolete . {* Obsolete *}
.#define BSF_IMPORT 0x04 .#define BSF_IMPORT 0x04
.
The symbol has global scope, and is exported. The value is the offset . {* The symbol has global scope, and is exported. The value is
into the section of the data. . the offset into the section of the data. *}
.#define BSF_EXPORT 0x08 .#define BSF_EXPORT 0x08
.
The symbol is undefined. <<extern>> in <<C>>. The value has no meaning. . {* The symbol is undefined. <<extern>> in <<C>>. The value has
. no meaning. *}
.#define BSF_UNDEFINED 0x10 .#define BSF_UNDEFINED_OBS 0x10
.
The symbol is common, initialized to zero; default in <<C>>. The . {* The symbol is common, initialized to zero; default in
value is the size of the object in bytes. . <<C>>. The value is the size of the object in bytes. *}
.#define BSF_FORT_COMM_OBS 0x20
.#define BSF_FORT_COMM 0x20 .
. {* A normal C symbol would be one of:
A normal <<C>> symbol would be one of: . <<BSF_LOCAL>>, <<BSF_FORT_COMM>>, <<BSF_UNDEFINED>> or
<<BSF_LOCAL>>, <<BSF_FORT_COMM>>, <<BSF_UNDEFINED>> or <<BSF_EXPORT|BSD_GLOBAL>> . <<BSF_EXPORT|BSD_GLOBAL>> *}
.
The symbol is a debugging record. The value has an arbitary meaning. . {* The symbol is a debugging record. The value has an arbitary
. meaning. *}
.#define BSF_DEBUGGING 0x40 .#define BSF_DEBUGGING 0x40
.
The symbol has no section attached, any value is the actual value and . {* Used by the linker *}
is not a relative offset to a section.
.#define BSF_ABSOLUTE 0x80
Used by the linker
.#define BSF_KEEP 0x10000 .#define BSF_KEEP 0x10000
.#define BSF_KEEP_G 0x80000 .#define BSF_KEEP_G 0x80000
.
Unused . {* Unused *}
.#define BSF_WEAK 0x100000 .#define BSF_WEAK 0x100000
.#define BSF_CTOR 0x200000 .#define BSF_CTOR 0x200000
.#define BSF_FAKE 0x400000 .
. {* This symbol was created to point to a section *}
The symbol used to be a common symbol, but now it is allocated. .#define BSF_SECTION_SYM 0x400000
.
. {* The symbol used to be a common symbol, but now it is
. allocated. *}
.#define BSF_OLD_COMMON 0x800000 .#define BSF_OLD_COMMON 0x800000
.
The default value for common data. . {* The default value for common data. *}
.#define BFD_FORT_COMM_DEFAULT_VALUE 0 .#define BFD_FORT_COMM_DEFAULT_VALUE 0
.
In some files the type of a symbol sometimes alters its location . {* In some files the type of a symbol sometimes alters its
in an output file - ie in coff a <<ISFCN>> symbol which is also <<C_EXT>> . location in an output file - ie in coff a <<ISFCN>> symbol
symbol appears where it was declared and not at the end of a section. . which is also <<C_EXT>> symbol appears where it was
This bit is set by the target BFD part to convey this information. . declared and not at the end of a section. This bit is set
. by the target BFD part to convey this information. *}
.
.#define BSF_NOT_AT_END 0x40000 .#define BSF_NOT_AT_END 0x40000
.
Signal that the symbol is the label of constructor section. . {* Signal that the symbol is the label of constructor section. *}
.#define BSF_CONSTRUCTOR 0x1000000 .#define BSF_CONSTRUCTOR 0x1000000
.
Signal that the symbol is a warning symbol. If the symbol is a warning . {* Signal that the symbol is a warning symbol. If the symbol
symbol, then the value field (I know this is tacky) will point to the . is a warning symbol, then the value field (I know this is
asymbol which when referenced will cause the warning. . tacky) will point to the asymbol which when referenced will
. cause the warning. *}
.#define BSF_WARNING 0x2000000 .#define BSF_WARNING 0x2000000
.
Signal that the symbol is indirect. The value of the symbol is a . {* Signal that the symbol is indirect. The value of the symbol
pointer to an undefined asymbol which contains the name to use . is a pointer to an undefined asymbol which contains the
instead. . name to use instead. *}
.#define BSF_INDIRECT 0x4000000 .#define BSF_INDIRECT 0x4000000
.
. flagword flags; . flagword flags;
.
A pointer to the section to which this symbol is relative, or 0 if the . {* A pointer to the section to which this symbol is
symbol is absolute or undefined. Note that it is not sufficient to set . relative. This will always be non NULL, there are special
this location to 0 to mark a symbol as absolute - the flag . sections for undefined and absolute symbols *}
<<BSF_ABSOLUTE>> must be set also.
. struct sec *section; . struct sec *section;
.
Back end special data. This is being phased out in favour of making . {* Back end special data. This is being phased out in favour
this a union. . of making this a union. *}
. PTR udata; . PTR udata;
.
.} asymbol; .} asymbol;
*/ */
#include "bfd.h" #include "bfd.h"
#include "sysdep.h" #include "sysdep.h"
#include "libbfd.h" #include "libbfd.h"
#include "stab.gnu.h" #include "aout/stab_gnu.h"
/* /*
@node symbol handling functions, , typedef asymbol, Symbols @node symbol handling functions, , typedef asymbol, Symbols
SUBSECTION SUBSECTION
Symbol Handling Functions Symbol Handling Functions
*/ */
/* /*
@ -372,13 +349,11 @@ asymbol *symbol)
{ {
fprintf_vma(file, symbol->value); fprintf_vma(file, symbol->value);
} }
fprintf(file," %c%c%c%c%c%c%c%c%c%c", fprintf(file," %c%c%c%c%c%c%c%c",
(type & BSF_LOCAL) ? 'l':' ', (type & BSF_LOCAL) ? 'l':' ',
(type & BSF_GLOBAL) ? 'g' : ' ', (type & BSF_GLOBAL) ? 'g' : ' ',
(type & BSF_IMPORT) ? 'i' : ' ', (type & BSF_IMPORT) ? 'i' : ' ',
(type & BSF_EXPORT) ? 'e' : ' ', (type & BSF_EXPORT) ? 'e' : ' ',
(type & BSF_UNDEFINED) ? 'u' : ' ',
(type & BSF_FORT_COMM) ? 'c' : ' ',
(type & BSF_CONSTRUCTOR) ? 'C' : ' ', (type & BSF_CONSTRUCTOR) ? 'C' : ' ',
(type & BSF_WARNING) ? 'W' : ' ', (type & BSF_WARNING) ? 'W' : ' ',
(type & BSF_INDIRECT) ? 'I' : ' ', (type & BSF_INDIRECT) ? 'I' : ' ',
@ -421,14 +396,12 @@ asymbol *symbol)
{ {
flagword flags = symbol->flags; flagword flags = symbol->flags;
if (flags & BSF_FORT_COMM) return 'C'; if (symbol->section == &bfd_com_section) return 'C';
if (flags & BSF_UNDEFINED) return 'U'; if (symbol->section == &bfd_und_section) return 'U';
if (flags & BSF_ABSOLUTE)
return (flags & BSF_GLOBAL) ? 'A' : 'a';
if ( flags & (BSF_GLOBAL|BSF_LOCAL) ) { if ( flags & (BSF_GLOBAL|BSF_LOCAL) ) {
if (symbol->section == (asection *)NULL) if ( symbol->section == &bfd_abs_section)
return '*'; return (flags & BSF_GLOBAL) ? 'A' : 'a';
else if ( !strcmp(symbol->section->name, ".text") ) else if ( !strcmp(symbol->section->name, ".text") )
return (flags & BSF_GLOBAL) ? 'T' : 't'; return (flags & BSF_GLOBAL) ? 'T' : 't';
else if ( !strcmp(symbol->section->name, ".data") ) else if ( !strcmp(symbol->section->name, ".data") )
@ -450,3 +423,11 @@ asymbol *symbol)
return '?'; return '?';
} }
bfd_symbol_is_absolute()
{
abort();
}

View file

@ -28,6 +28,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
SECTION SECTION
Targets Targets
DESCRIPTION
Each port of BFD to a different machine requries the creation Each port of BFD to a different machine requries the creation
of a target back end. All the back end provides to the root of a target back end. All the back end provides to the root
part of BFD is a structure containing pointers to functions part of BFD is a structure containing pointers to functions
@ -66,18 +67,20 @@ SECTION
<<bfd_check_format>> on the BFD with a suggested format. The <<bfd_check_format>> on the BFD with a suggested format. The
routine returns <<true>> when the application guesses right. routine returns <<true>> when the application guesses right.
@menu @menu
* bfd_target:: @* bfd_target::
@end menu @end menu
*/ */
/* /*
@node bfd_target, , Targets, Targets INODE
bfd_target, , Targets, Targets
SUBSECTION SUBSECTION
bfd_target bfd_target
DESCRIPTION
This structure contains everything that BFD knows about a This structure contains everything that BFD knows about a
target. It includes things like its byte order, name, what target. It includes things like its byte order, name, what
routines to call to do various operations, etc. routines to call to do various operations, etc.
@ -264,6 +267,7 @@ Symbols and reloctions
. SDEF (void, _bfd_debug_info_start, (bfd *)); . SDEF (void, _bfd_debug_info_start, (bfd *));
. SDEF (void, _bfd_debug_info_end, (bfd *)); . SDEF (void, _bfd_debug_info_end, (bfd *));
. SDEF (void, _bfd_debug_info_accumulate, (bfd *, struct sec *)); . SDEF (void, _bfd_debug_info_accumulate, (bfd *, struct sec *));
. SDEF (bfd_byte *, _bfd_get_relocated_section_contents, (bfd*,struct bfd_seclet_struct *));
Special entry points for gdb to swap in coff symbol table parts Special entry points for gdb to swap in coff symbol table parts