* libaout.h (WORK_OUT_FILE_POSITIONS): One more try at this
authorJohn Gilmore <gnu@cygnus>
Thu, 21 Nov 1991 19:52:23 +0000 (19:52 +0000)
committerJohn Gilmore <gnu@cygnus>
Thu, 21 Nov 1991 19:52:23 +0000 (19:52 +0000)
rather complicated seeming problem.  Eliminate LOGICAL_ versions,
just make N_XXX work by excluding the header from the text segment.
* aoutx.h:  Fix comments to match.

bfd/ChangeLog
bfd/aoutx.h
bfd/libaout.h

index de1e8e69653015343c2065d6445bb738fb9608d2..5d206052b5cb2b80592ba458e7064a5cfbf1acde 100644 (file)
@@ -1,3 +1,50 @@
+Thu Nov 21 11:50:49 1991  John Gilmore  (gnu at cygnus.com)
+
+       * libaout.h (WORK_OUT_FILE_POSITIONS):  One more try at this
+       rather complicated seeming problem.  Eliminate LOGICAL_ versions,
+       just make N_XXX work by excluding the header from the text segment.
+       * aoutx.h:  Fix comments to match.
+
+Tue Nov 19 18:49:01 1991  Per Bothner  (bothner at cygnus.com)
+
+       * libaout.h (WORK_OUT_FILE_POSITIONS):  Use new LOGICAL_TXTADDR,
+       LOGICAL_TXTOFF, LOGICAL_TXTSIZE macros to figure out numbers
+       for the "logical" text segment (i.e. never consider the exec
+       header to be part of the text segment).  This change is
+       needed for consistency with various other parts of bfd and ld.
+       * aoutx.h (NAME(aout,soe_aout_object_p)):  Fix comment,
+       and move calculation of obj_textsec(abfd)->size to libaout.h.
+       * bfd-in.h:  Removed bogus ';'.
+
+       * Makefile.in:  Add MINIMIZE flag to select lean
+       or bloated target_vector.
+       * targets.c:  Use new MINIMIZE macro, and add trad_core if needed.
+       * newsos3.c:  Fixes to ../include/aout64.h remove need
+       for special N_TXTOFF macro, but require N_HEADER_IN_TEXT.
+
+Mon Nov 18 12:00:59 1991  Per Bothner  (bothner at cygnus.com)
+
+       * aout-target.h, aoutf1.h, newsos3.c:  Make aout-target.h
+       handle both little and big-endian targets, with little
+       the default unless TARGET_IS_BIG_ENDIAN_P is defined.
+       * host-aout.c:  Add FIXME note.
+
+Sun Nov 17 13:29:39 1991  Per Bothner  (bothner at cygnus.com)
+
+       * targets.c:  Make the default target_vector contain
+       just &DEFAULT_VECTOR.  This makes executables a lot smaller.
+       Old behavior can be gotten by defining ALL_TARGETS.
+       * aoutf1.h, demo64.c, i386aout.c, newsos3.c, sunos.c:
+       Factored out common code into new file aout-target.h.
+       Saves a lot of duplicate code for a.out variants.
+
+Fri Nov 15 13:00:43 1991  Per Bothner  (bothner at cygnus.com)
+
+       Get 'make headers' to work when configured with +subdirs.
+       * Makefile.in: Add $(subdir) to docdir path.
+       * doc/Makefile.in (protos): Add $(srcdir) prefix
+       to name of sed scripts.
+
 Thu Nov 14 19:49:10 1991  Per Bothner  (bothner at cygnus.com)
 
        * aoutx.h (NAME(aout,print_symbol)):  Fix thinko.
index 16208468fc5961e5c5e2931c0d25238feba43621..9e5886e12fefb3560451d261ba5ddec4bd94ef11 100644 (file)
@@ -325,7 +325,6 @@ DEFUN(NAME(aout,some_aout_object_p),(abfd, execp, callback_to_real_object_p),
 
   obj_datasec (abfd)->size = execp->a_data;
   obj_bsssec (abfd)->size = execp->a_bss;
-  obj_textsec (abfd)->size = execp->a_text;
 
   obj_textsec (abfd)->flags = (execp->a_trsize != 0 ?
                       (SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_HAS_CONTENTS) :
@@ -336,16 +335,25 @@ DEFUN(NAME(aout,some_aout_object_p),(abfd, execp, callback_to_real_object_p),
   obj_bsssec (abfd)->flags = SEC_ALLOC;
 
 #ifdef THIS_IS_ONLY_DOCUMENTATION
+  /* The common code can't fill in these things because they depend
+     on either the start address of the text segment, the rounding
+     up of virtual addersses between segments, or the starting file 
+     position of the text segment -- all of which varies among different
+     versions of a.out.  */
+
   /* Call back to the format-dependent code to fill in the rest of the 
      fields and do any further cleanup.  Things that should be filled
      in by the callback:  */
 
   struct exec *execp = exec_hdr (abfd);
 
+  obj_textsec (abfd)->size = N_TXTSIZE(*execp);
+  /* data and bss are already filled in since they're so standard */
+
   /* The virtual memory addresses of the sections */
-  obj_datasec (abfd)->vma = N_DATADDR(*execp);
-  obj_bsssec (abfd)->vma = N_BSSADDR(*execp);
   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);
@@ -359,12 +367,6 @@ DEFUN(NAME(aout,some_aout_object_p),(abfd, execp, callback_to_real_object_p),
   obj_str_filepos (abfd) = N_STROFF (*execp);
   obj_sym_filepos (abfd) = N_SYMOFF (*execp);
 
-  /* This common code can't fill in those things because they depend
-     on either the start address of the text segment, the rounding
-     up of virtual addersses between segments, or the starting file 
-     position of the text segment -- all of which varies among different
-     versions of a.out.  */
-
   /* Determine the architecture and machine type of the object file.  */
   switch (N_MACHTYPE (*exec_hdr (abfd))) {
   default:
@@ -397,7 +399,6 @@ DEFUN(NAME(aout,some_aout_object_p),(abfd, execp, callback_to_real_object_p),
      header, should cope with them in this callback as well.  */
 #endif                         /* DOCUMENTATION */
 
-
   return (*callback_to_real_object_p)(abfd);
 }
 
@@ -945,7 +946,7 @@ DEFUN(NAME(aout,slurp_symbol_table),(abfd),
 
   /* malloc this, so we can free it if simply. The symbol caching
      might want to allocate onto the bfd's obstack  */
-  syms = (struct external_nlist *) malloc(symbol_size);
+  syms = (struct external_nlist *) bfd_xmalloc(symbol_size);
   bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET);
   if (bfd_read ((PTR)syms, 1, symbol_size, abfd) != symbol_size) {
   bailout:
@@ -1617,6 +1618,37 @@ DEFUN(NAME(aout,print_symbol),(ignore_abfd, afile, symbol, how),
         fprintf(file," %s", symbol->name);
     }
     break;
+  case bfd_print_symbol_nm:
+    {
+      int section_code = bfd_decode_symclass  (symbol);
+
+      if (section_code == 'U')
+       fprintf(file, "        ");
+      else if (symbol->section != (asection *)NULL)
+       fprintf_vma(file, symbol->value+symbol->section->vma);
+      else 
+       fprintf_vma(file, symbol->value);
+      if (section_code == '?')
+       {
+         int type_code = aout_symbol(symbol)->type  & 0xff;
+         char *stab_name = bfd_stab_name(type_code);
+         char buf[10];
+         if (stab_name == NULL)
+           {
+             sprintf(buf, "(%d)", type_code);
+             stab_name = buf;
+           }
+         fprintf(file," - %02x %04x %5s",
+                 (unsigned)(aout_symbol(symbol)->other & 0xff),
+                 (unsigned)(aout_symbol(symbol)->desc & 0xffff),
+                 stab_name);
+        }
+      else
+       fprintf(file," %c", section_code);
+      if (symbol->name)
+        fprintf(file," %s", symbol->name);
+    }
+    break;
   }
 }
 
@@ -1645,6 +1677,7 @@ DEFUN(NAME(aout,find_nearest_line),(abfd,
   /* Run down the file looking for the filename, function and linenumber */
   asymbol **p;
   static  char buffer[100];
+  static  char filename_buffer[200];
   bfd_vma high_line_vma = ~0;
   bfd_vma low_func_vma = 0;
   asymbol *func = 0;
@@ -1654,9 +1687,28 @@ DEFUN(NAME(aout,find_nearest_line),(abfd,
   if (symbols != (asymbol **)NULL) {
     for (p = symbols; *p; p++) {
       aout_symbol_type  *q = (aout_symbol_type *)(*p);
+    next:
       switch (q->type){
       case N_SO:
        *filename_ptr = q->symbol.name;
+       /* Look ahead to next symbol to check if that too is an N_SO. */
+       p++;
+       if (*p == NULL)
+         break;
+       q = (aout_symbol_type *)(*p);
+       if (q->type != N_SO)
+         goto next;
+
+       /* Found a second N_SO  First is directory; second is filename. */
+       if (q->symbol.name[0] == '/')
+         *filename_ptr = q->symbol.name;
+       else
+         {
+           sprintf(filename_buffer, "%.140s%.50s",
+                   *filename_ptr, q->symbol.name);
+           *filename_ptr = filename_buffer;
+         }
+       
        if (obj_textsec(abfd) != section) {
          return true;
        }
index 0797bc51ce3e1d7fd4be5f8ffc814eb24b8e347d..57d50ed563fde4efd4f1f6315029283530d7c97e 100644 (file)
@@ -207,7 +207,7 @@ PROTO (boolean,     NAME(aout,close_and_cleanup), (bfd *abfd));
 PROTO (boolean,        NAME(aout,find_nearest_line), (bfd *abfd, asection *section,
       asymbol **symbols, bfd_vma offset, CONST char **filename_ptr,
       CONST char **functionname_ptr, unsigned int *line_ptr));
-PROTO (int,    NAME(aout,sizeof_headers), (bfd *ignore_abfd, boolean exec));
+PROTO (int,    NAME(aout,sizeof_headers), (bfd *abfd, boolean exec));
 
 
 PROTO (void,   NAME(aout,swap_exec_header_in), (bfd *abfd,
@@ -226,10 +226,12 @@ PROTO (void,      NAME(aout,swap_exec_header_out),(bfd *abfd, struct internal_exec *e
 
 /* Calculate the file positions of the parts of a newly read aout header */
 #define WORK_OUT_FILE_POSITIONS(abfd, execp)                           \
+  obj_textsec (abfd)->size = N_TXTSIZE(*execp);                                \
+                                                                       \
   /* The virtual memory addresses of the sections */                   \
-  obj_datasec (abfd)->vma = N_DATADDR(*execp);                         \
-  obj_bsssec (abfd)->vma = N_BSSADDR(*execp);                          \
   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);                     \