New from bfd.c
authorSteve Chamberlain <sac@cygnus>
Fri, 24 Jan 1992 22:54:03 +0000 (22:54 +0000)
committerSteve Chamberlain <sac@cygnus>
Fri, 24 Jan 1992 22:54:03 +0000 (22:54 +0000)
include/bfd.h

index a0e8e50..ce6c446 100644 (file)
@@ -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. <<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 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:
           <<BSF_LOCAL>>, <<BSF_FORT_COMM>>,  <<BSF_UNDEFINED>> 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 <<BSF_ABSOLUTE>> 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,