From 9a7c544993cc4ea2a0ede27a2316233c2ff59ca9 Mon Sep 17 00:00:00 2001 From: Steve Chamberlain Date: Fri, 24 Jan 1992 22:54:03 +0000 Subject: [PATCH] New from bfd.c --- include/bfd.h | 128 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 93 insertions(+), 35 deletions(-) diff --git a/include/bfd.h b/include/bfd.h index a0e8e50006f..ce6c4465c3d 100644 --- a/include/bfd.h +++ b/include/bfd.h @@ -181,7 +181,7 @@ typedef struct lineno_cache_entry { typedef struct sec *sec_ptr; #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_alignment(bfd, ptr) ((ptr)->alignment_power) #define bfd_get_section_flags(bfd, ptr) ((ptr)->flags) @@ -207,10 +207,23 @@ typedef enum bfd_error { invalid_error_code} bfd_ec; extern bfd_ec bfd_error; +struct reloc_cache_entry; +struct bfd_seclet_struct ; + typedef struct bfd_error_vector { PROTO(void,(* nonrepresentable_section ),(CONST bfd *CONST abfd, 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; PROTO (char *, bfd_errmsg, ()); @@ -267,7 +280,8 @@ CAT(NAME,_generic_stat_arch_elt),\ CAT(NAME,_sizeof_headers),\ CAT(NAME,_bfd_debug_info_start),\ 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 \ coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, \ @@ -325,6 +339,8 @@ extern CONST short _bfd_host_big_endian; + + void EXFUN(bfd_init, (void)); bfd *EXFUN(bfd_openr, (CONST char *filename, CONST char*target)); bfd *EXFUN(bfd_fdopenr, (CONST char *filename, CONST char *target, int fd)); @@ -372,6 +388,11 @@ typedef struct sec CONST char *name; + + /* Which section is it 0.nth */ + + int index; + /* The next section in the list belonging to the BFD, or NULL. */ struct sec *next; @@ -455,16 +476,21 @@ typedef struct sec #define SEC_NEVER_LOAD 0x400 - /* The base address of the section in the address space of the - target. */ + 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 - 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 offset into the output section of the first byte in the input @@ -496,10 +522,6 @@ typedef struct sec unsigned reloc_count; - /* Which section is it 0.nth */ - - int index; - /* Information below is back end specific - and not always used or updated @@ -536,7 +558,7 @@ typedef struct sec /* what the section number is in the target world */ - unsigned int target_index; + int target_index; PTR used_by_bfd; @@ -549,7 +571,33 @@ typedef struct sec 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 ; + + +#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)) asection *EXFUN(bfd_get_section_by_name, (bfd *abfd, CONST char *name)); asection *EXFUN(bfd_make_section_old_way, (bfd *, CONST char *name)); asection * EXFUN(bfd_make_section, (bfd *, CONST char *name)); @@ -690,9 +738,6 @@ typedef struct reloc_cache_entry /* addend for relocation value */ bfd_vma addend; - /* if sym is null this is the section */ - struct sec *section; - /* Pointer to how to perform the required relocation */ CONST struct reloc_howto_struct *howto; @@ -778,17 +823,13 @@ typedef CONST struct reloc_howto_struct #define HOWTO_PREPARE(relocation, symbol) \ { \ if (symbol != (asymbol *)NULL) { \ - if (symbol->flags & BSF_FORT_COMM) { \ + if (symbol->section == &bfd_com_section) { \ relocation = 0; \ } \ else { \ relocation = symbol->value; \ } \ } \ - if (symbol->section != (asection *)NULL) { \ - relocation += symbol->section->output_section->vma + \ - symbol->section->output_offset; \ - } \ } typedef unsigned char bfd_byte; @@ -863,11 +904,11 @@ typedef struct symbol_cache_entry /* The symbol is undefined. <> in <>. The value has no meaning. */ -#define BSF_UNDEFINED 0x10 +#define BSF_UNDEFINED_OBS 0x10 /* The symbol is common, initialized to zero; default in <>. The value is the size of the object in bytes. */ -#define BSF_FORT_COMM 0x20 +#define BSF_FORT_COMM_OBS 0x20 /* A normal C symbol would be one of: <>, <>, <> or @@ -877,10 +918,6 @@ typedef struct symbol_cache_entry meaning. */ #define BSF_DEBUGGING 0x40 - /* The symbol has no section attached, any value is the actual - value and is not a relative offset to a section. */ -#define BSF_ABSOLUTE 0x80 - /* Used by the linker */ #define BSF_KEEP 0x10000 #define BSF_KEEP_G 0x80000 @@ -888,7 +925,9 @@ typedef struct symbol_cache_entry /* Unused */ #define BSF_WEAK 0x100000 #define BSF_CTOR 0x200000 -#define BSF_FAKE 0x400000 + + /* This symbol was created to point to a section */ +#define BSF_SECTION_SYM 0x400000 /* The symbol used to be a common symbol, but now it is allocated. */ @@ -921,11 +960,9 @@ typedef struct symbol_cache_entry flagword flags; - /* A pointer to the section to which this symbol is relative, - or 0 if the symbol is absolute or undefined. Note that it - is not sufficient to set this location to 0 to mark a - symbol as absolute - the flag <> must be set - also. */ + /* A pointer to the section to which this symbol is + relative. This will always be non NULL, there are special + sections for undefined and absolute symbols */ struct sec *section; /* Back end special data. This is being phased out in favour @@ -1048,13 +1085,31 @@ struct _bfd boolean has_armap; /* Used by the back end to hold private data. */ - PTR tdata; + union + { + struct aout_data_struct *aout_data; + struct artdata *aout_ar_data; + struct _oasys_data *oasys_obj_data; + struct _oasys_ar_data *oasys_ar_data; + struct coff_tdata *coff_obj_data; + struct ieee_data_struct *ieee_data; + struct ieee_ar_data_struct *ieee_ar_data; + struct srec_data_struct *srec_data; + struct elf_obj_tdata_struct *elf_obj_data; + struct elf_core_tdata_struct *elf_core_data; + struct bout_data_struct *bout_data; + struct sun_core_struct *sun_core_data; + PTR any; + } 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; }; unsigned int EXFUN(bfd_get_reloc_upper_bound, (bfd *abfd, asection *sect)); @@ -1121,9 +1176,11 @@ long EXFUN(bfd_get_mtime, (bfd *)); #define bfd_coff_swap_aouthdr_out(abfd, i,o) \ BFD_SEND (abfd, _bfd_coff_swap_aouthdr_out, (abfd, i, o)) -symindex EXFUN(bfd_get_next_mapent, (bfd *, symindex, carsym **)); +#define bfd_get_relocated_section_contents(abfd, seclet) \ + BFD_SEND (abfd, _bfd_get_relocated_section_contents, (abfd, seclet)) +symindex EXFUN(bfd_get_next_mapent, (bfd *, symindex previous, carsym ** sym)); boolean EXFUN(bfd_set_archive_head, (bfd *output, bfd *new_head)); -bfd *EXFUN(bfd_get_elt_at_index, (bfd *, int)); +bfd *EXFUN(bfd_get_elt_at_index, (bfd * archive, int index)); bfd* EXFUN(bfd_openr_next_archived_file, (bfd *archive, bfd *previous)); CONST char *EXFUN(bfd_core_file_failing_command, (bfd *)); int EXFUN(bfd_core_file_failing_signal, (bfd *)); @@ -1214,6 +1271,7 @@ typedef struct bfd_target SDEF (void, _bfd_debug_info_start, (bfd *)); SDEF (void, _bfd_debug_info_end, (bfd *)); SDEF (void, _bfd_debug_info_accumulate, (bfd *, struct sec *)); + SDEF (bfd_byte *, _bfd_get_relocated_section_contents, (bfd*,struct bfd_seclet_struct *)); SDEF(void, _bfd_coff_swap_aux_in,( bfd *abfd , PTR ext, -- 2.30.2