Elena Zannoni <ezannoni@kwikemart.cygnus.com>
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>
Thu, 4 May 2000 16:52:34 +0000 (16:52 +0000)
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>
Thu, 4 May 2000 16:52:34 +0000 (16:52 +0000)
        * objfiles.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
        SECT_OFF_RODATA): Define as functions of OBJFILE.  Add
        sect_index_text, sect_index_data, sect_index_rodata,
        sect_index_bss to objfile structure.
        * gdb-stabs.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
        SECT_OFF_RODATA): Remove.
        * objfiles.c (allocate_objfile): Initialize
        sect_index_{text,data,bss,rodata} to -1, for error detection.

        * symfile.c (default_symfile_offsets): Initialize
        sect_index_{text,data,bss,rodata} from bfd information.
        * xcoffread.c (xcoff_symfile_offsets): Ditto.
        * somread.c (som_symfile_offsets): Initialize
        sect_index_{text,data,bss,rodata}.

        * coffread.c, dbxread.c, elfread.c, hp-psymtab-read.c,
        hp-symtab-read.c, hpread.c, mdebugread.c, minsyms.c,
        mipsread.c, objfiles.c, os9kread.c, pa64solib.c, partial-stab.h,
        remote-os9k.c, remote-vx.c, remote.c, rs6000-nat.c, somsolib.c,
        stabsread.c, symfile.c, xcoffread.c:
        Update use of SECT_OFF_{TEXT,DATA,BSS,RODATA} to depend on the
        current objfile.

        * xcoffread.c: Add new field objfile to find_targ_sec_arg.

25 files changed:
gdb/ChangeLog
gdb/coffread.c
gdb/dbxread.c
gdb/elfread.c
gdb/gdb-stabs.h
gdb/hp-psymtab-read.c
gdb/hp-symtab-read.c
gdb/hpread.c
gdb/mdebugread.c
gdb/minsyms.c
gdb/mipsread.c
gdb/objfiles.c
gdb/objfiles.h
gdb/os9kread.c
gdb/pa64solib.c
gdb/partial-stab.h
gdb/remote-os9k.c
gdb/remote-vx.c
gdb/remote.c
gdb/rs6000-nat.c
gdb/somread.c
gdb/somsolib.c
gdb/stabsread.c
gdb/symfile.c
gdb/xcoffread.c

index 6a898b6f0cc6e3f9e45debeb185fc567052b53bf..c69168d238de0c20cc56bcdd5c65142218bfa309 100644 (file)
@@ -1,3 +1,30 @@
+Elena Zannoni  <ezannoni@kwikemart.cygnus.com>
+
+        * objfiles.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
+        SECT_OFF_RODATA): Define as functions of OBJFILE.  Add
+        sect_index_text, sect_index_data, sect_index_rodata,
+        sect_index_bss to objfile structure.
+        * gdb-stabs.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
+        SECT_OFF_RODATA): Remove.
+        * objfiles.c (allocate_objfile): Initialize
+        sect_index_{text,data,bss,rodata} to -1, for error detection.
+
+        * symfile.c (default_symfile_offsets): Initialize
+        sect_index_{text,data,bss,rodata} from bfd information.
+        * xcoffread.c (xcoff_symfile_offsets): Ditto.
+        * somread.c (som_symfile_offsets): Initialize
+        sect_index_{text,data,bss,rodata}.
+
+        * coffread.c, dbxread.c, elfread.c, hp-psymtab-read.c,
+        hp-symtab-read.c, hpread.c, mdebugread.c, minsyms.c,
+        mipsread.c, objfiles.c, os9kread.c, pa64solib.c, partial-stab.h,
+        remote-os9k.c, remote-vx.c, remote.c, rs6000-nat.c, somsolib.c,
+        stabsread.c, symfile.c, xcoffread.c:
+        Update use of SECT_OFF_{TEXT,DATA,BSS,RODATA} to depend on the
+        current objfile.
+
+        * xcoffread.c: Add new field objfile to find_targ_sec_arg.
+
 Thu May  4 20:54:00 2000  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * config/mips/tm-mipsv4.h (Dest_Reg), config/mips/tm-irix5.h
index 75a90f737cf4b7ec66d15116d3d9ebb38843efe4..6f6e6cb75f453a2da967b540ba2716b8a68cbd85 100644 (file)
@@ -340,7 +340,7 @@ cs_to_section (cs, objfile)
 {
   asection *sect = NULL;
   struct find_targ_sec_arg args;
-  int off = SECT_OFF_TEXT;
+  int off = SECT_OFF_TEXT (objfile);
 
   args.targ_index = cs->c_secnum;
   args.resultp = &sect;
@@ -349,11 +349,11 @@ cs_to_section (cs, objfile)
     {
       /* This is the section.  Figure out what SECT_OFF_* code it is.  */
       if (bfd_get_section_flags (abfd, sect) & SEC_CODE)
-       off = SECT_OFF_TEXT;
+       off = SECT_OFF_TEXT (objfile);
       else if (bfd_get_section_flags (abfd, sect) & SEC_LOAD)
-       off = SECT_OFF_DATA;
+       off = SECT_OFF_DATA (objfile);
       else
-       off = SECT_OFF_BSS;
+       off = SECT_OFF_BSS (objfile);
     }
   return off;
 }
@@ -843,7 +843,7 @@ coff_symtab_read (symtab_offset, nsyms, objfile)
       if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
        {
          /* Record all functions -- external and static -- in minsyms. */
-         tmpaddr = cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+         tmpaddr = cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
          record_minimal_symbol (cs->c_name, tmpaddr, mst_text, objfile);
 
          fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
@@ -908,7 +908,7 @@ coff_symtab_read (symtab_offset, nsyms, objfile)
                     followed by a later file with no symbols.  */
                  if (in_source_file)
                    complete_symtab (filestring,
-                   cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT),
+                   cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
                                     main_aux.x_scn.x_scnlen);
                  in_source_file = 0;
                }
@@ -969,10 +969,8 @@ coff_symtab_read (symtab_offset, nsyms, objfile)
                    || cs->c_sclass == C_THUMBEXT)
                  tmpaddr += ANOFFSET (objfile->section_offsets, sec);
 
-               switch (sec)
+               if (sec == SECT_OFF_TEXT (objfile) || sec == SECT_OFF_RODATA (objfile))
                  {
-                 case SECT_OFF_TEXT:
-                 case SECT_OFF_RODATA:
                    ms_type =
                      cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXTFUNC
                      || cs->c_sclass == C_THUMBEXT ?
@@ -981,21 +979,23 @@ coff_symtab_read (symtab_offset, nsyms, objfile)
                    if (tmpaddr & 1)    /* FIXME: delete this line */
                      SMASH_TEXT_ADDRESS (tmpaddr);
 #endif
-                   break;
-                 case SECT_OFF_DATA:
+                 }
+               else
+                 if  (sec == SECT_OFF_DATA (objfile))
+                   {
                    ms_type =
                      cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT ?
                      mst_data : mst_file_data;
-                   break;
-                 case SECT_OFF_BSS:
+                   }
+                 else
+                   if (sec == SECT_OFF_BSS (objfile))
+                     {
                    ms_type =
                      cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT ?
                      mst_data : mst_file_data;
-                   break;
-                 default:
-                   ms_type = mst_unknown;
-                   break;
-                 }
+                     }
+                   else
+                     ms_type = mst_unknown;
              }
 
            if (cs->c_name[0] != '@' /* Skip tdesc symbols */ )
@@ -1099,11 +1099,11 @@ coff_symtab_read (symtab_offset, nsyms, objfile)
                 of the epilogue.  */
                            cs->c_value
                            + FUNCTION_EPILOGUE_SIZE
-                           + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT),
+                           + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
 #else
                            fcn_cs_saved.c_value
                            + fcn_aux_saved.x_sym.x_misc.x_fsize
-                           + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT),
+                           + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
 #endif
                            objfile
                );
@@ -1115,7 +1115,7 @@ coff_symtab_read (symtab_offset, nsyms, objfile)
          if (STREQ (cs->c_name, ".bb"))
            {
              tmpaddr = cs->c_value;
-             tmpaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+             tmpaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              push_context (++depth, tmpaddr);
            }
          else if (STREQ (cs->c_name, ".eb"))
@@ -1135,7 +1135,7 @@ coff_symtab_read (symtab_offset, nsyms, objfile)
              if (local_symbols && context_stack_depth > 0)
                {
                  tmpaddr =
-                   cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+                   cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
                  /* Make a block for the local symbols within.  */
                  finish_block (0, &local_symbols, new->old_blocks,
                                new->start_addr, tmpaddr, objfile);
@@ -1427,7 +1427,7 @@ enter_linenos (file_offset, first_line, last_line, objfile)
       if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
        record_line (current_subfile, first_line + L_LNNO32 (&lptr),
                     lptr.l_addr.l_paddr
-                    + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT));
+                    + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)));
       else
        break;
     }
@@ -1547,7 +1547,7 @@ process_coff_symbol (cs, aux, objfile)
 
   if (ISFCN (cs->c_type))
     {
-      SYMBOL_VALUE (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+      SYMBOL_VALUE (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
       SYMBOL_TYPE (sym) =
        lookup_function_type (decode_function_type (cs, cs->c_type, aux));
 
@@ -1577,7 +1577,7 @@ process_coff_symbol (cs, aux, objfile)
        case C_EXT:
          SYMBOL_CLASS (sym) = LOC_STATIC;
          SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
-         SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+         SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
          add_symbol_to_list (sym, &global_symbols);
          break;
 
@@ -1586,7 +1586,7 @@ process_coff_symbol (cs, aux, objfile)
        case C_STAT:
          SYMBOL_CLASS (sym) = LOC_STATIC;
          SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
-         SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+         SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
          if (within_function)
            {
              /* Static symbol of local scope */
index 74667e4c1293ba469f53e8b44c2a6f7499fd4f14..25302de1ccbb02f84a4135f66ccf9cc807bd2e17 100644 (file)
@@ -488,17 +488,17 @@ record_minimal_symbol (name, address, type, objfile)
     {
     case N_TEXT | N_EXT:
       ms_type = mst_text;
-      section = SECT_OFF_TEXT;
+      section = SECT_OFF_TEXT (objfile);
       bfd_section = DBX_TEXT_SECTION (objfile);
       break;
     case N_DATA | N_EXT:
       ms_type = mst_data;
-      section = SECT_OFF_DATA;
+      section = SECT_OFF_DATA (objfile);
       bfd_section = DBX_DATA_SECTION (objfile);
       break;
     case N_BSS | N_EXT:
       ms_type = mst_bss;
-      section = SECT_OFF_BSS;
+      section = SECT_OFF_BSS (objfile);
       bfd_section = DBX_BSS_SECTION (objfile);
       break;
     case N_ABS | N_EXT:
@@ -509,7 +509,7 @@ record_minimal_symbol (name, address, type, objfile)
 #ifdef N_SETV
     case N_SETV | N_EXT:
       ms_type = mst_data;
-      section = SECT_OFF_DATA;
+      section = SECT_OFF_DATA (objfile);
       bfd_section = DBX_DATA_SECTION (objfile);
       break;
     case N_SETV:
@@ -517,7 +517,7 @@ record_minimal_symbol (name, address, type, objfile)
          of going over many .o files, it doesn't make sense to have one
          file local.  */
       ms_type = mst_file_data;
-      section = SECT_OFF_DATA;
+      section = SECT_OFF_DATA (objfile);
       bfd_section = DBX_DATA_SECTION (objfile);
       break;
 #endif
@@ -526,7 +526,7 @@ record_minimal_symbol (name, address, type, objfile)
     case N_FN:
     case N_FN_SEQ:
       ms_type = mst_file_text;
-      section = SECT_OFF_TEXT;
+      section = SECT_OFF_TEXT (objfile);
       bfd_section = DBX_TEXT_SECTION (objfile);
       break;
     case N_DATA:
@@ -547,12 +547,12 @@ record_minimal_symbol (name, address, type, objfile)
        if (VTBL_PREFIX_P ((tempstring)))
          ms_type = mst_data;
       }
-      section = SECT_OFF_DATA;
+      section = SECT_OFF_DATA (objfile);
       bfd_section = DBX_DATA_SECTION (objfile);
       break;
     case N_BSS:
       ms_type = mst_file_bss;
-      section = SECT_OFF_BSS;
+      section = SECT_OFF_BSS (objfile);
       bfd_section = DBX_BSS_SECTION (objfile);
       break;
     default:
@@ -1157,17 +1157,17 @@ read_dbx_dynamic_symtab (objfile)
 
          if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
            {
-             sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+             sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              type = N_TEXT;
            }
          else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
            {
-             sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+             sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
              type = N_DATA;
            }
          else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
            {
-             sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS);
+             sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
              type = N_BSS;
            }
          else
@@ -1208,7 +1208,7 @@ read_dbx_dynamic_symtab (objfile)
     {
       arelent *rel = *relptr;
       CORE_ADDR address =
-      rel->address + ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+      rel->address + ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
 
       switch (bfd_get_arch (abfd))
        {
@@ -1382,7 +1382,7 @@ read_dbx_symtab (objfile)
       /* Don't set pst->texthigh lower than it already is.  */
       CORE_ADDR text_end =
       (lowest_text_address == (CORE_ADDR) -1
-       ? (text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT))
+       ? (text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))
        : lowest_text_address)
       + text_size;
 
@@ -1558,6 +1558,7 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
       struct partial_symtab *subpst =
       allocate_psymtab (include_list[i], objfile);
 
+      /* Copy the sesction_offsets array from the main psymtab. */
       subpst->section_offsets = pst->section_offsets;
       subpst->read_symtab_private =
        (char *) obstack_alloc (&objfile->psymbol_obstack,
@@ -1738,6 +1739,10 @@ read_ofile_symtab (pst)
   sym_size = LDSYMLEN (pst);
   text_offset = pst->textlow;
   text_size = pst->texthigh - pst->textlow;
+  /* This cannot be simply objfile->section_offsets because of
+     elfstab_offset_sections() which initializes the psymtab section
+     offsets information in a special way, and that is different from
+     objfile->section_offsets. */ 
   section_offsets = pst->section_offsets;
 
   current_objfile = objfile;
@@ -1880,7 +1885,7 @@ read_ofile_symtab (pst)
   if (last_source_start_addr > text_offset)
     last_source_start_addr = text_offset;
 
-  pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT);
+  pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
 
   /* Process items which we had to "process_later" due to dependancies 
      on other stabs.  */
@@ -1899,6 +1904,8 @@ read_ofile_symtab (pst)
    NAME is the symbol name, in our address space.
    SECTION_OFFSETS is a set of amounts by which the sections of this object
    file were relocated when it was loaded into memory.
+   Note that these section_offsets are not the 
+   objfile->section_offsets but the pst->section_offsets.
    All symbols that refer
    to memory locations need to be offset by these amounts.
    OBJFILE is the object file from which we are reading symbols.
@@ -1942,7 +1949,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
   if (!block_address_function_relative)
     /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
        function start address, so just use the text offset.  */
-    function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
+    function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
 
   /* Something is wrong if we see real data before
      seeing a source file name.  */
@@ -1982,7 +1989,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
        }
 
       /* Relocate for dynamic loading */
-      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
 #ifdef SMASH_TEXT_ADDRESS
       SMASH_TEXT_ADDRESS (valu);
 #endif
@@ -2090,7 +2097,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
     case N_FN_SEQ:
       /* This kind of symbol indicates the start of an object file.  */
       /* Relocate for dynamic loading */
-      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       break;
 
     case N_SO:
@@ -2099,7 +2106,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
          Finish the symbol table of the previous source file
          (if any) and start accumulating a new symbol table.  */
       /* Relocate for dynamic loading */
-      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
 
       n_opt_found = 0;
 
@@ -2126,7 +2133,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
              patch_subfile_names (current_subfile, name);
              break;            /* Ignore repeated SOs */
            }
-         end_symtab (valu, objfile, SECT_OFF_TEXT);
+         end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
          end_stabs ();
        }
 
@@ -2149,7 +2156,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
          included in the compilation of the main source file
          (whose name was given in the N_SO symbol.)  */
       /* Relocate for dynamic loading */
-      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       start_subfile (name, current_subfile->dirname);
       break;
 
@@ -2227,7 +2234,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
                   elfstab_offset_sections ever starts dealing with the
                   text offset, and we still need to do this, we need to
                   invent a SECT_OFF_ADDR_KLUDGE or something.  */
-               valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+               valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
                goto define_a_symbol;
              }
          }
@@ -2247,22 +2254,22 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
 
     case_N_STSYM:              /* Static symbol in data seg */
     case N_DSLINE:             /* Source line number, data seg */
-      valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
+      valu += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
       goto define_a_symbol;
 
     case_N_LCSYM:              /* Static symbol in BSS seg */
     case N_BSLINE:             /* Source line number, bss seg */
       /*   N_BROWS:       overlaps with N_BSLINE */
-      valu += ANOFFSET (section_offsets, SECT_OFF_BSS);
+      valu += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
       goto define_a_symbol;
 
     case_N_ROSYM:              /* Static symbol in Read-only data seg */
-      valu += ANOFFSET (section_offsets, SECT_OFF_RODATA);
+      valu += ANOFFSET (section_offsets, SECT_OFF_RODATA (objfile));
       goto define_a_symbol;
 
     case N_ENTRY:              /* Alternate entry point */
       /* Relocate for dynamic loading */
-      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       goto define_a_symbol;
 
       /* The following symbol types we don't know how to process.  Handle
@@ -2314,7 +2321,7 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
              /* Deal with the SunPRO 3.0 compiler which omits the address
                 from N_FUN symbols.  */
              if (type == N_FUN
-                 && valu == ANOFFSET (section_offsets, SECT_OFF_TEXT))
+                 && valu == ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile)))
                valu = 
                  find_stab_function_addr (name, last_source_file, objfile);
 #endif
index d63d16a30fabea9f6a1d7bc0c68064348731fc0a..e76d5cda7fffdb4f7746402efb3b28a573a2de13 100644 (file)
@@ -191,18 +191,18 @@ record_minimal_symbol_and_info (name, address, ms_type, info, bfd_section,
     {
     case mst_text:
     case mst_file_text:
-      section = SECT_OFF_TEXT;
+      section = SECT_OFF_TEXT (objfile);
 #ifdef SMASH_TEXT_ADDRESS
       SMASH_TEXT_ADDRESS (address);
 #endif
       break;
     case mst_data:
     case mst_file_data:
-      section = SECT_OFF_DATA;
+      section = SECT_OFF_DATA (objfile);
       break;
     case mst_bss:
     case mst_file_bss:
-      section = SECT_OFF_BSS;
+      section = SECT_OFF_BSS (objfile);
       break;
     default:
       section = -1;
@@ -294,7 +294,7 @@ elf_symtab_read (objfile, dynamic)
        error ("Can't read symbols from %s: %s", bfd_get_filename (objfile->obfd),
               bfd_errmsg (bfd_get_error ()));
       /* FIXME: Should use section specific offset, not SECT_OFF_TEXT. */
-      offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+      offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
       for (i = 0; i < number_of_symbols; i++)
        {
          sym = symbol_table[i];
@@ -460,15 +460,15 @@ elf_symtab_read (objfile, dynamic)
                      index = SECT_OFF_MAX;
                      if (STREQ ("Bbss.bss", sym->name))
                        {
-                         index = SECT_OFF_BSS;
+                         index = SECT_OFF_BSS (objfile);
                        }
                      else if (STREQ ("Ddata.data", sym->name))
                        {
-                         index = SECT_OFF_DATA;
+                         index = SECT_OFF_DATA (objfile);
                        }
                      else if (STREQ ("Drodata.rodata", sym->name))
                        {
-                         index = SECT_OFF_RODATA;
+                         index = SECT_OFF_RODATA (objfile);
                        }
                      if (index != SECT_OFF_MAX)
                        {
index 7e498fb06059ee85b9b21e1d0db26c7a201de772..3ec13930f5da5a9b84380e81e77405fb4414cd7b 100644 (file)
 #if !defined (GDBSTABS_H)
 #define GDBSTABS_H
 
-/* Offsets in the psymtab's section_offsets array for various kinds of
-   stabs symbols.  Every psymtab built from stabs will have these offsets
-   filled in by these guidelines, so that when actually reading symbols, the
-   proper offset can simply be selected and added to the symbol value.  */
-
-#define        SECT_OFF_TEXT   0
-#define        SECT_OFF_DATA   1
-#define        SECT_OFF_BSS    2
-#define        SECT_OFF_RODATA 3
 #define        SECT_OFF_MAX    40      /* Count of possible values */
 
 /* The stab_section_info chain remembers info from the ELF symbol table,
index d3d0ff2eeff24af491f2f71210babc06cf3d873d..33153091e3d824264ec68598980f28bfeb74a75d 100644 (file)
@@ -601,7 +601,7 @@ scan_procs (curr_pd_p, qPD, max_procs, start_adr, end_adr, pst, vt_bits, objfile
                                           LOC_BLOCK,   /* "I am a routine"        */
                                           &objfile->global_psymbols,
                                           (qPD[curr_pd].adrStart +     /* Starting address of rtn */
-                                ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT)),
+                                ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))),
                                           0,   /* core addr?? */
                      trans_lang ((enum hp_language) qPD[curr_pd].language),
                                           objfile);
@@ -614,7 +614,7 @@ scan_procs (curr_pd_p, qPD, max_procs, start_adr, end_adr, pst, vt_bits, objfile
                                           LOC_BLOCK,   /* "I am a routine"        */
                                           &objfile->static_psymbols,
                                           (qPD[curr_pd].adrStart +     /* Starting address of rtn */
-                                ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT)),
+                                ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))),
                                           0,   /* core addr?? */
                      trans_lang ((enum hp_language) qPD[curr_pd].language),
                                           objfile);
@@ -1816,7 +1816,7 @@ hpread_build_psymtabs (objfile, mainline)
                  past_first_source_file = 1;
 
                valu = hpread_get_textlow (i, hp_symnum, objfile, symcount);
-               valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+               valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
                pst = hpread_start_psymtab (objfile,
                                            namestring, valu,
                                            (hp_symnum
@@ -1850,7 +1850,7 @@ hpread_build_psymtabs (objfile, mainline)
              /* Now begin a new module and a new psymtab for it */
              SET_NAMESTRING (dn_bufp, &namestring, objfile);
              valu = hpread_get_textlow (i, hp_symnum, objfile, symcount);
-             valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+             valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              if (!pst)
                {
                  pst = hpread_start_psymtab (objfile,
@@ -1869,11 +1869,11 @@ hpread_build_psymtabs (objfile, mainline)
              /* The beginning of a function.  DNTT_TYPE_ENTRY may also denote
                 a secondary entry point.  */
              valu = dn_bufp->dfunc.hiaddr + ANOFFSET (objfile->section_offsets,
-                                                      SECT_OFF_TEXT);
+                                                      SECT_OFF_TEXT (objfile));
              if (valu > texthigh)
                texthigh = valu;
              valu = dn_bufp->dfunc.lowaddr +
-               ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+               ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              SET_NAMESTRING (dn_bufp, &namestring, objfile);
              if (dn_bufp->dfunc.global)
                add_psymbol_to_list (namestring, strlen (namestring),
@@ -1890,11 +1890,11 @@ hpread_build_psymtabs (objfile, mainline)
 
            case DNTT_TYPE_DOC_FUNCTION:
              valu = dn_bufp->ddocfunc.hiaddr + ANOFFSET (objfile->section_offsets,
-                                                         SECT_OFF_TEXT);
+                                                         SECT_OFF_TEXT (objfile));
              if (valu > texthigh)
                texthigh = valu;
              valu = dn_bufp->ddocfunc.lowaddr +
-               ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+               ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              SET_NAMESTRING (dn_bufp, &namestring, objfile);
              if (dn_bufp->ddocfunc.global)
                add_psymbol_to_list (namestring, strlen (namestring),
@@ -1984,7 +1984,7 @@ hpread_build_psymtabs (objfile, mainline)
                valu = dn_bufp->dsvar.location;
                /* Relocate in case it's in a shared library */
                if (storage == LOC_STATIC)
-                 valu += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+                 valu += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
 
                /* Luckily, dvar, svar, typedef, and tagdef all
                   have their "global" bit in the same place, so it works
@@ -2208,7 +2208,7 @@ hpread_start_psymtab (objfile,
      struct partial_symbol **global_syms;
      struct partial_symbol **static_syms;
 {
-  int offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+  int offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
   extern void hpread_psymtab_to_symtab ();
   struct partial_symtab *result =
   start_psymtab_common (objfile, objfile->section_offsets,
@@ -2246,7 +2246,7 @@ hpread_end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
 {
   int i;
   struct objfile *objfile = pst->objfile;
-  int offset = ANOFFSET (pst->section_offsets, SECT_OFF_TEXT);
+  int offset = ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (objfile));
 
 #ifdef DUMPING
   /* Turn on to see what kind of a psymtab we've built. */
index dc045a4ef4e58b438d96c05ecc1e2f44e56b9f84..1e67972196ad29d53d9f799e9e06cdad8d5c44f7 100644 (file)
@@ -2823,8 +2823,8 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile,
   unsigned long desc;
   int type;
   CORE_ADDR valu;
-  int offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
-  int data_offset = ANOFFSET (section_offsets, SECT_OFF_DATA);
+  int offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
+  int data_offset = ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
   union dnttentry *dn_temp;
   dnttpointer hp_type;
   struct symbol *sym;
index 4da08e4927d2cb56748264b322b30eb467376906..b36531a85feec0b9b5242312a45330acf825c5c1 100644 (file)
@@ -466,7 +466,7 @@ hpread_build_psymtabs (objfile, mainline)
                  past_first_source_file = 1;
 
                valu = hpread_get_textlow (i, hp_symnum, objfile);
-               valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+               valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
                pst = hpread_start_psymtab (objfile,
                                            namestring, valu,
                                            (hp_symnum
@@ -484,7 +484,7 @@ hpread_build_psymtabs (objfile, mainline)
                 is supposed to be.  */
              SET_NAMESTRING (dn_bufp, &namestring, objfile);
              valu = hpread_get_textlow (i, hp_symnum, objfile);
-             valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+             valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              if (!pst)
                {
                  pst = hpread_start_psymtab (objfile,
@@ -502,11 +502,11 @@ hpread_build_psymtabs (objfile, mainline)
              /* The beginning of a function.  DNTT_TYPE_ENTRY may also denote
                 a secondary entry point.  */
              valu = dn_bufp->dfunc.hiaddr + ANOFFSET (objfile->section_offsets,
-                                                      SECT_OFF_TEXT);
+                                                      SECT_OFF_TEXT (objfile));
              if (valu > texthigh)
                texthigh = valu;
              valu = dn_bufp->dfunc.lowaddr +
-               ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+               ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              SET_NAMESTRING (dn_bufp, &namestring, objfile);
              add_psymbol_to_list (namestring, strlen (namestring),
                                   VAR_NAMESPACE, LOC_BLOCK,
@@ -1775,7 +1775,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile,
   unsigned long desc;
   int type;
   CORE_ADDR valu;
-  int offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
+  int offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
   union dnttentry *dn_temp;
   dnttpointer hp_type;
   struct symbol *sym;
index 085cd094be882fae91dc6a12ffbc644b070fdbb5..6c7ddccf93fb184bb42ed2ab6ad4cfabe0d2f01d 100644 (file)
@@ -384,7 +384,7 @@ static struct blockvector *
   new_bvect PARAMS ((int));
 
 static int
-parse_symbol PARAMS ((SYMR *, union aux_ext *, char *, int, struct section_offsets *));
+parse_symbol PARAMS ((SYMR *, union aux_ext *, char *, int, struct section_offsets *, struct objfile *));
 
 static struct type *
   parse_type PARAMS ((int, union aux_ext *, unsigned int, int *, int, char *));
@@ -716,12 +716,13 @@ add_pending (fh, sh, t)
    SYMR's handled (normally one).  */
 
 static int
-parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
+parse_symbol (sh, ax, ext_sh, bigend, section_offsets, objfile)
      SYMR *sh;
      union aux_ext *ax;
      char *ext_sh;
      int bigend;
      struct section_offsets *section_offsets;
+     struct objfile *objfile;
 {
   const bfd_size_type external_sym_size = debug_swap->external_sym_size;
   void (*const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *)) =
@@ -753,18 +754,18 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
          The value of a stBlock symbol is the displacement from the
          procedure address.  */
       if (sh->st != stEnd && sh->st != stBlock)
-       sh->value += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+       sh->value += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       break;
     case scData:
     case scSData:
     case scRData:
     case scPData:
     case scXData:
-      sh->value += ANOFFSET (section_offsets, SECT_OFF_DATA);
+      sh->value += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
       break;
     case scBss:
     case scSBss:
-      sh->value += ANOFFSET (section_offsets, SECT_OFF_BSS);
+      sh->value += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
       break;
     }
 
@@ -2042,7 +2043,7 @@ parse_procedure (pr, search_symtab, pst)
          procedure descriptor in e->pdr.adr.
          As the address in the procedure descriptor is usually relative,
          we would have to relocate e->pdr.adr with cur_fdr->adr and
-         ANOFFSET (pst->section_offsets, SECT_OFF_TEXT).
+         ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (pst->objfile)).
          Unfortunately cur_fdr->adr and e->pdr.adr are both absolute
          in shared libraries on some systems, and on other systems
          e->pdr.adr is sometimes offset by a bogus value.
@@ -2102,13 +2103,14 @@ ecoff_relocate_efi (sym, delta)
 
    This routine clobbers top_stack->cur_block and ->cur_st. */
 
-static void parse_external PARAMS ((EXTR *, int, struct section_offsets *));
+static void parse_external PARAMS ((EXTR *, int, struct section_offsets *, struct objfile *));
 
 static void
-parse_external (es, bigend, section_offsets)
+parse_external (es, bigend, section_offsets, objfile)
      EXTR *es;
      int bigend;
      struct section_offsets *section_offsets;
+     struct objfile *objfile;
 {
   union aux_ext *ax;
 
@@ -2183,7 +2185,7 @@ parse_external (es, bigend, section_offsets)
 
       /* Note that the case of a symbol with indexNil must be handled
          anyways by parse_symbol().  */
-      parse_symbol (&es->asym, ax, (char *) NULL, bigend, section_offsets);
+      parse_symbol (&es->asym, ax, (char *) NULL, bigend, section_offsets, objfile);
       break;
     default:
       break;
@@ -2474,12 +2476,12 @@ parse_partial_symbols (objfile)
        {
        case stProc:
          /* Beginnning of Procedure */
-         svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+         svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
          break;
        case stStaticProc:
          /* Load time only static procs */
          ms_type = mst_file_text;
-         svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+         svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
          break;
        case stGlobal:
          /* External symbol */
@@ -2492,12 +2494,12 @@ parse_partial_symbols (objfile)
          else if (SC_IS_DATA (ext_in->asym.sc))
            {
              ms_type = mst_data;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
            }
          else if (SC_IS_BSS (ext_in->asym.sc))
            {
              ms_type = mst_bss;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS);
+             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
            }
          else
            ms_type = mst_abs;
@@ -2507,17 +2509,17 @@ parse_partial_symbols (objfile)
          if (SC_IS_TEXT (ext_in->asym.sc))
            {
              ms_type = mst_file_text;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
            }
          else if (SC_IS_DATA (ext_in->asym.sc))
            {
              ms_type = mst_file_data;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
            }
          else if (SC_IS_BSS (ext_in->asym.sc))
            {
              ms_type = mst_file_bss;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS);
+             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
            }
          else
            ms_type = mst_abs;
@@ -2561,7 +2563,7 @@ parse_partial_symbols (objfile)
        {
          textlow = fh->adr;
          if (relocatable || textlow != 0)
-           textlow += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+           textlow += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
        }
       else
        textlow = 0;
@@ -2649,7 +2651,7 @@ parse_partial_symbols (objfile)
                      CORE_ADDR procaddr;
                      long isym;
 
-                     sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+                     sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
                      if (sh.st == stStaticProc)
                        {
                          namestring = debug_info->ss + fh->issBase + sh.iss;
@@ -2657,7 +2659,7 @@ parse_partial_symbols (objfile)
                                                               sh.value,
                                                               mst_file_text,
                                                               NULL,
-                                                              SECT_OFF_TEXT,
+                                                              SECT_OFF_TEXT (objfile),
                                                               NULL,
                                                               objfile);
                        }
@@ -2700,12 +2702,12 @@ parse_partial_symbols (objfile)
                        case scPData:
                        case scXData:
                          namestring = debug_info->ss + fh->issBase + sh.iss;
-                         sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+                         sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
                          prim_record_minimal_symbol_and_info (namestring,
                                                               sh.value,
                                                               mst_file_data,
                                                               NULL,
-                                                              SECT_OFF_DATA,
+                                                              SECT_OFF_DATA (objfile),
                                                               NULL,
                                                               objfile);
                          break;
@@ -2714,12 +2716,12 @@ parse_partial_symbols (objfile)
                          /* FIXME!  Shouldn't this use cases for bss, 
                             then have the default be abs? */
                          namestring = debug_info->ss + fh->issBase + sh.iss;
-                         sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS);
+                         sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
                          prim_record_minimal_symbol_and_info (namestring,
                                                               sh.value,
                                                               mst_file_bss,
                                                               NULL,
-                                                              SECT_OFF_BSS,
+                                                              SECT_OFF_BSS (objfile),
                                                               NULL,
                                                               objfile);
                          break;
@@ -2818,18 +2820,18 @@ parse_partial_symbols (objfile)
                  /* The value of a stEnd symbol is the displacement from the
                     corresponding start symbol value, do not relocate it.  */
                  if (sh.st != stEnd)
-                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
                  break;
                case scData:
                case scSData:
                case scRData:
                case scPData:
                case scXData:
-                 sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+                 sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
                  break;
                case scBss:
                case scSBss:
-                 sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS);
+                 sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
                  break;
                }
 
@@ -2842,7 +2844,7 @@ parse_partial_symbols (objfile)
                case stStaticProc:
                  prim_record_minimal_symbol_and_info (name, sh.value,
                                                       mst_file_text, NULL,
-                                                      SECT_OFF_TEXT, NULL,
+                                                      SECT_OFF_TEXT (objfile), NULL,
                                                       objfile);
 
                  /* FALLTHROUGH */
@@ -2915,13 +2917,13 @@ parse_partial_symbols (objfile)
                  if (SC_IS_DATA (sh.sc))
                    prim_record_minimal_symbol_and_info (name, sh.value,
                                                         mst_file_data, NULL,
-                                                        SECT_OFF_DATA,
+                                                        SECT_OFF_DATA (objfile),
                                                         NULL,
                                                         objfile);
                  else
                    prim_record_minimal_symbol_and_info (name, sh.value,
                                                         mst_file_bss, NULL,
-                                                        SECT_OFF_BSS,
+                                                        SECT_OFF_BSS (objfile),
                                                         NULL,
                                                         objfile);
                  class = LOC_STATIC;
@@ -3026,18 +3028,18 @@ parse_partial_symbols (objfile)
                {
                case scText:
                case scRConst:
-                 svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+                 svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
                  break;
                case scData:
                case scSData:
                case scRData:
                case scPData:
                case scXData:
-                 svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+                 svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
                  break;
                case scBss:
                case scSBss:
-                 svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS);
+                 svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
                  break;
                }
 
@@ -3435,7 +3437,7 @@ psymtab_to_symtab_1 (pst, filename)
              else
                {
                  /* Handle encoded stab line number. */
-                 valu += ANOFFSET (pst->section_offsets, SECT_OFF_TEXT);
+                 valu += ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (pst->objfile));
                  record_line (current_subfile, sh.index, valu);
                }
            }
@@ -3446,7 +3448,7 @@ psymtab_to_symtab_1 (pst, filename)
          else
            complain (&stab_unknown_complaint, name);
        }
-      st = end_symtab (pst->texthigh, pst->objfile, SECT_OFF_TEXT);
+      st = end_symtab (pst->texthigh, pst->objfile, SECT_OFF_TEXT (pst->objfile));
       end_stabs ();
 
       /* Sort the symbol table now, we are done adding symbols to it.
@@ -3561,7 +3563,7 @@ psymtab_to_symtab_1 (pst, filename)
              (*swap_sym_in) (cur_bfd, sym_ptr, &sh);
              c = parse_symbol (&sh,
                                debug_info->external_aux + fh->iauxBase,
-                               sym_ptr, fh->fBigendian, pst->section_offsets);
+                               sym_ptr, fh->fBigendian, pst->section_offsets, pst->objfile);
              sym_ptr += c * external_sym_size;
            }
 
@@ -3629,7 +3631,7 @@ psymtab_to_symtab_1 (pst, filename)
 
       ext_ptr = PST_PRIVATE (pst)->extern_tab;
       for (i = PST_PRIVATE (pst)->extern_count; --i >= 0; ext_ptr++)
-       parse_external (ext_ptr, fh->fBigendian, pst->section_offsets);
+       parse_external (ext_ptr, fh->fBigendian, pst->section_offsets, pst->objfile);
 
       /* If there are undefined symbols, tell the user.
          The alpha has an undefined symbol for every symbol that is
index 2fd73cf74ba44821017c6fbde3d816870244ff6f..a032dd35115cffafcd2ee08609b925cf55203005 100644 (file)
@@ -609,15 +609,15 @@ prim_record_minimal_symbol (name, address, ms_type, objfile)
     case mst_text:
     case mst_file_text:
     case mst_solib_trampoline:
-      section = SECT_OFF_TEXT;
+      section = SECT_OFF_TEXT (objfile);
       break;
     case mst_data:
     case mst_file_data:
-      section = SECT_OFF_DATA;
+      section = SECT_OFF_DATA (objfile);
       break;
     case mst_bss:
     case mst_file_bss:
-      section = SECT_OFF_BSS;
+      section = SECT_OFF_BSS (objfile);
       break;
     default:
       section = -1;
index d137a9aaac5730c978267a9bef74f9caedd5f51a..9d8f0ff9ea0d9ed610f7c9755def70ac1f5e1af0 100644 (file)
@@ -402,7 +402,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile)
                ms_type = mst_text;
              else
                ms_type = mst_file_text;
-             sym_value += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+             sym_value += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
            }
          else if (sym_shndx == SHN_MIPS_DATA)
            {
@@ -410,7 +410,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile)
                ms_type = mst_data;
              else
                ms_type = mst_file_data;
-             sym_value += ANOFFSET (section_offsets, SECT_OFF_DATA);
+             sym_value += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
            }
          else if (sym_shndx == SHN_MIPS_ACOMMON)
            {
@@ -418,7 +418,7 @@ read_alphacoff_dynamic_symtab (section_offsets, objfile)
                ms_type = mst_bss;
              else
                ms_type = mst_file_bss;
-             sym_value += ANOFFSET (section_offsets, SECT_OFF_BSS);
+             sym_value += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
            }
          else if (sym_shndx == SHN_ABS)
            {
index 41ec317bc5c8a661c0c0d40275d1c91a99919041..d307c2ab85d26e180956820cf554bfd13df9ec5f 100644 (file)
@@ -305,6 +305,14 @@ allocate_objfile (abfd, flags)
        }
     }
 
+  /* Initialize the section indexes for this objfile, so that we can
+     later detect if they are used w/o being properly assigned to. */
+
+    objfile->sect_index_text = -1;
+    objfile->sect_index_data = -1;
+    objfile->sect_index_bss = -1;
+    objfile->sect_index_rodata = -1;
+
   /* Add this file onto the tail of the linked list of other such files. */
 
   objfile->next = NULL;
@@ -591,8 +599,8 @@ objfile_relocate (objfile, new_offsets)
 
     ALL_OBJFILE_PSYMTABS (objfile, p)
     {
-      p->textlow += ANOFFSET (delta, SECT_OFF_TEXT);
-      p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT);
+      p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
+      p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
     }
   }
 
@@ -643,41 +651,41 @@ objfile_relocate (objfile, new_offsets)
 
        if (flags & SEC_CODE)
          {
-           s->addr += ANOFFSET (delta, SECT_OFF_TEXT);
-           s->endaddr += ANOFFSET (delta, SECT_OFF_TEXT);
+           s->addr += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
+           s->endaddr += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
          }
        else if (flags & (SEC_DATA | SEC_LOAD))
          {
-           s->addr += ANOFFSET (delta, SECT_OFF_DATA);
-           s->endaddr += ANOFFSET (delta, SECT_OFF_DATA);
+           s->addr += ANOFFSET (delta, SECT_OFF_DATA (objfile));
+           s->endaddr += ANOFFSET (delta, SECT_OFF_DATA (objfile));
          }
        else if (flags & SEC_ALLOC)
          {
-           s->addr += ANOFFSET (delta, SECT_OFF_BSS);
-           s->endaddr += ANOFFSET (delta, SECT_OFF_BSS);
+           s->addr += ANOFFSET (delta, SECT_OFF_BSS (objfile));
+           s->endaddr += ANOFFSET (delta, SECT_OFF_BSS (objfile));
          }
       }
   }
 
   if (objfile->ei.entry_point != ~(CORE_ADDR) 0)
-    objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT);
+    objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
 
   if (objfile->ei.entry_func_lowpc != INVALID_ENTRY_LOWPC)
     {
-      objfile->ei.entry_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT);
-      objfile->ei.entry_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT);
+      objfile->ei.entry_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
+      objfile->ei.entry_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
     }
 
   if (objfile->ei.entry_file_lowpc != INVALID_ENTRY_LOWPC)
     {
-      objfile->ei.entry_file_lowpc += ANOFFSET (delta, SECT_OFF_TEXT);
-      objfile->ei.entry_file_highpc += ANOFFSET (delta, SECT_OFF_TEXT);
+      objfile->ei.entry_file_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
+      objfile->ei.entry_file_highpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
     }
 
   if (objfile->ei.main_func_lowpc != INVALID_ENTRY_LOWPC)
     {
-      objfile->ei.main_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT);
-      objfile->ei.main_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT);
+      objfile->ei.main_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
+      objfile->ei.main_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
     }
 
   /* Relocate breakpoints as necessary, after things are relocated. */
index d1bd4dad2a8ae14532f2122b58d68456113980d1..b24894a6fd2e0bb362be9cd7acd8ed054d5e7cb5 100644 (file)
@@ -372,6 +372,18 @@ struct objfile
     struct section_offsets *section_offsets;
     int num_sections;
 
+    /* Indexes in the section_offsets array. These are initialized by the
+       *_symfile_offsets() family of functions (som_symfile_offsets,
+       xcoff_symfile_offsets, default_symfile_offsets). In theory they
+       should correspond to the section indexes used by bfd for the
+       current objfile. The exception to this for the time being is the
+       SOM version. */
+
+    int sect_index_text;
+    int sect_index_data;
+    int sect_index_bss;
+    int sect_index_rodata;
+
     /* These pointers are used to locate the section table, which
        among other things, is used to map pc addresses into sections.
        SECTIONS points to the first entry in the table, and
@@ -584,4 +596,20 @@ is_in_import_list PARAMS ((char *, struct objfile *));
   ALL_OBJFILES (objfile)                       \
     ALL_OBJFILE_OSECTIONS (objfile, osect)
 
+#define SECT_OFF_DATA(objfile) \
+     ((objfile->sect_index_data == -1) ? \
+      (internal_error ("sect_index_data not initialized"), -1) : objfile->sect_index_data)
+
+#define SECT_OFF_RODATA(objfile) \
+     ((objfile->sect_index_rodata == -1) ? \
+      (internal_error ("sect_index_rodata not initialized"), -1) : objfile->sect_index_rodata)
+
+#define SECT_OFF_TEXT(objfile) \
+     ((objfile->sect_index_text == -1) ? \
+      (internal_error ("sect_index_text not initialized"), -1) : objfile->sect_index_text)
+
+#define SECT_OFF_BSS(objfile) \
+     ((objfile->sect_index_bss == -1) ? \
+      (internal_error ("sect_index_bss not initialized"), -1) : objfile->sect_index_bss)
+
 #endif /* !defined (OBJFILES_H) */
index f820fe8dffa0265f346a3fde55de0b16b9b8e61d..cbc51a75e013a259a7ef94eaaa952399830f300f 100644 (file)
@@ -208,7 +208,7 @@ record_minimal_symbol (name, address, type, objfile)
     {
     case N_TEXT:
       ms_type = mst_text;
-      address += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+      address += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
       break;
     case N_DATA:
       ms_type = mst_data;
@@ -608,7 +608,7 @@ read_os9k_psymtab (objfile, text_addr, text_size)
 #ifdef END_OF_TEXT_DEFAULT
   end_of_text_addr = END_OF_TEXT_DEFAULT;
 #else
-  end_of_text_addr = text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT)
+  end_of_text_addr = text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))
     + text_size;               /* Relocate */
 #endif
 
@@ -655,7 +655,7 @@ read_os9k_psymtab (objfile, text_addr, text_size)
          continue;
 
        case N_SYM_SE:
-         CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+         CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
          if (psymfile_depth == 1 && pst)
            {
              os9k_end_psymtab (pst, psymtab_include_list, includes_used,
@@ -692,7 +692,7 @@ read_os9k_psymtab (objfile, text_addr, text_size)
 
                valu = CUR_SYMBOL_VALUE;
                if (valu)
-                 valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+                 valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
                past_first_source_file = 1;
 
                p = strchr (namestring, ':');
@@ -884,7 +884,7 @@ read_os9k_psymtab (objfile, text_addr, text_size)
              continue;
 
            case 'f':
-             CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+             CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              if (pst && pst->textlow == 0)
                pst->textlow = CUR_SYMBOL_VALUE;
 
@@ -895,7 +895,7 @@ read_os9k_psymtab (objfile, text_addr, text_size)
              continue;
 
            case 'F':
-             CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+             CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
              if (pst && pst->textlow == 0)
                pst->textlow = CUR_SYMBOL_VALUE;
 
@@ -933,7 +933,7 @@ read_os9k_psymtab (objfile, text_addr, text_size)
            }
 
        case N_SYM_RBRAC:
-         CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+         CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 #ifdef HANDLE_RBRAC
          HANDLE_RBRAC (CUR_SYMBOL_VALUE);
          continue;
@@ -1423,7 +1423,7 @@ os9k_read_ofile_symtab (pst)
      which comes from pst->textlow is correct. */
   if (last_source_start_addr == 0)
     last_source_start_addr = text_offset;
-  pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT);
+  pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
   end_stabs ();
 }
 \f
@@ -1473,12 +1473,12 @@ os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile)
     case N_SYM_LBRAC:
       /* On most machines, the block addresses are relative to the
          N_SO, the linker did not relocate them (sigh).  */
-      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       new = push_context (desc, valu);
       break;
 
     case N_SYM_RBRAC:
-      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       new = pop_context ();
 
 #if !defined (OS9K_VARIABLES_INSIDE_BLOCK)
@@ -1547,7 +1547,7 @@ os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile)
          one line-number -- core-address correspondence.
          Enter it in the line list for this symbol table. */
       /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
-      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
       /* FIXME: loses if sizeof (char *) > sizeof (int) */
       record_line (current_subfile, (int) name, valu);
       break;
@@ -1570,7 +1570,7 @@ os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile)
          switch (deftype)
            {
            case 'S':
-             valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+             valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
              n = strrchr (name, '/');
              if (n != NULL)
                {
@@ -1588,7 +1588,7 @@ os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile)
                {
                  if (last_source_file)
                    {
-                     end_symtab (valu, objfile, SECT_OFF_TEXT);
+                     end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
                      end_stabs ();
                    }
                  start_stabs ();
@@ -1605,7 +1605,7 @@ os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile)
 
            case 'f':
            case 'F':
-             valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+             valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
              function_stab_type = type;
 
              within_function = 1;
@@ -1615,7 +1615,7 @@ os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile)
 
            case 'V':
            case 'v':
-             valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
+             valu += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
              define_symbol (valu, name, desc, type, objfile);
              break;
 
index cb991b2c09d3aca2894fa7123c938b51f23f10cb..ab568f57581f9e52a91244aa0f4d1effe18979f2 100644 (file)
@@ -328,9 +328,9 @@ pa64_solib_load_symbols (so, name, from_tty, text_addr, target)
       return;
     }
 
-  ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT)
+  ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT (so->objfile))
     = so->pa64_solib_desc.text_base;
-  ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA)
+  ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA (so->objfile))
     = so->pa64_solib_desc.data_base;
 
   /* Relocate all the sections based on where they got loaded.  */
@@ -338,13 +338,13 @@ pa64_solib_load_symbols (so, name, from_tty, text_addr, target)
     {
       if (p->the_bfd_section->flags & SEC_CODE)
        {
-         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT);
-         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT);
+         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT (so->objfile));
+         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT (so->objfile));
        }
       else if (p->the_bfd_section->flags & SEC_DATA)
        {
-         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA);
-         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA);
+         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA (so->objfile));
+         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA (so->objfile));
        }
     }
 
index 9c4be680a2b253b84138530384a780eee0fa21bd..b8c9de8d1fef885c7277ef380bdb1735abfb0442 100644 (file)
@@ -46,19 +46,19 @@ switch (CUR_SYMBOL_TYPE)
 
   case N_TEXT | N_EXT:
   case N_NBTEXT | N_EXT:
-    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
     goto record_it;
 
   case N_DATA | N_EXT:
   case N_NBDATA | N_EXT:
-    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
     goto record_it;
 
   case N_BSS:
   case N_BSS | N_EXT:
   case N_NBBSS | N_EXT:
   case N_SETV | N_EXT:         /* FIXME, is this in BSS? */
-    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS);
+    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
     goto record_it;
 
   case N_ABS | N_EXT:
@@ -85,7 +85,7 @@ switch (CUR_SYMBOL_TYPE)
   case N_FN_SEQ:
   case N_TEXT:
 #ifdef DBXREAD_ONLY
-    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
     SET_NAMESTRING ();
     if ((namestring[0] == '-' && namestring[1] == 'l')
        || (namestring[(nsl = strlen (namestring)) - 1] == 'o'
@@ -121,7 +121,7 @@ switch (CUR_SYMBOL_TYPE)
     continue;
 
   case N_DATA:
-    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+    CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
     goto record_it;
 
   case N_UNDF | N_EXT:
@@ -203,7 +203,7 @@ switch (CUR_SYMBOL_TYPE)
       char *p;
       int prev_textlow_not_set;
 
-      valu = CUR_SYMBOL_VALUE + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+      valu = CUR_SYMBOL_VALUE + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 
       prev_textlow_not_set = textlow_not_set;
 
@@ -423,7 +423,7 @@ switch (CUR_SYMBOL_TYPE)
     switch (p[1])
       {
       case 'S':
-       CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+       CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
 #ifdef STATIC_TRANSFORM_NAME
        namestring = STATIC_TRANSFORM_NAME (namestring);
 #endif
@@ -434,7 +434,7 @@ switch (CUR_SYMBOL_TYPE)
                             psymtab_language, objfile);
        continue;
       case 'G':
-       CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA);
+       CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
        /* The addresses in these entries are reported to be
           wrong.  See the code that reads 'G's for symtabs. */
        add_psymbol_to_list (namestring, p - namestring,
@@ -575,7 +575,7 @@ switch (CUR_SYMBOL_TYPE)
        continue;
 
       case 'f':
-       CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+       CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 #ifdef DBXREAD_ONLY
        /* Kludges for ELF/STABS with Sun ACC */
        last_function_name = namestring;
@@ -602,7 +602,7 @@ switch (CUR_SYMBOL_TYPE)
        if (textlow_not_set
            || (CUR_SYMBOL_VALUE < pst->textlow
                && CUR_SYMBOL_VALUE
-               != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT)))
+               != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))))
          {
            pst->textlow = CUR_SYMBOL_VALUE;
            textlow_not_set = 0;
@@ -619,7 +619,7 @@ switch (CUR_SYMBOL_TYPE)
           are put into the global psymtab like one would expect.
           They're also in the minimal symbol table.  */
       case 'F':
-       CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT);
+       CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 #ifdef DBXREAD_ONLY
        /* Kludges for ELF/STABS with Sun ACC */
        last_function_name = namestring;
@@ -627,7 +627,7 @@ switch (CUR_SYMBOL_TYPE)
        /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
           value for the bottom of the text seg in those cases. */
        if (CUR_SYMBOL_VALUE == ANOFFSET (objfile->section_offsets, 
-                                         SECT_OFF_TEXT))
+                                         SECT_OFF_TEXT (objfile)))
          CUR_SYMBOL_VALUE = 
            find_stab_function_addr (namestring, pst->filename, objfile);
        if (pst && textlow_not_set)
@@ -649,7 +649,7 @@ switch (CUR_SYMBOL_TYPE)
        if (textlow_not_set
            || (CUR_SYMBOL_VALUE < pst->textlow
                && CUR_SYMBOL_VALUE
-               != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT)))
+               != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))))
          {
            pst->textlow = CUR_SYMBOL_VALUE;
            textlow_not_set = 0;
index dd821154e42718eb4c642e155c1a857115c4dc73..fd758b5a1b189c4c6173830e45d3899544faa52d 100644 (file)
@@ -514,8 +514,8 @@ rombug_wait (pid, status)
        new_symfile_objfile (obj_sec->objfile, 1, 0);
       offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
       memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
-      ANOFFSET (offs, SECT_OFF_DATA) = addr;
-      ANOFFSET (offs, SECT_OFF_BSS) = addr;
+      ANOFFSET (offs, SECT_OFF_DATA (symfile_objfile)) = addr;
+      ANOFFSET (offs, SECT_OFF_BSS (symfile_objfile)) = addr;
 
       objfile_relocate (symfile_objfile, offs);
     }
index 06407041e698b96ff9e44993bc667f08ff1c6a96..d1a2582c27f6a4b95e5ff91d03086aacd2ca2c94 100644 (file)
@@ -717,9 +717,9 @@ vx_add_symbols (name, from_tty, text_addr, data_addr, bss_addr)
   bfd_map_over_sections (objfile->obfd, find_sect, &ss);
 
   /* Both COFF and b.out frontends use these SECT_OFF_* values.  */
-  ANOFFSET (offs, SECT_OFF_TEXT) = text_addr - ss.text_start;
-  ANOFFSET (offs, SECT_OFF_DATA) = data_addr - ss.data_start;
-  ANOFFSET (offs, SECT_OFF_BSS) = bss_addr - ss.bss_start;
+  ANOFFSET (offs, SECT_OFF_TEXT (so->objfile)) = text_addr - ss.text_start;
+  ANOFFSET (offs, SECT_OFF_DATA (so->objfile)) = data_addr - ss.data_start;
+  ANOFFSET (offs, SECT_OFF_BSS (so->objfile)) = bss_addr - ss.bss_start;
   objfile_relocate (objfile, offs);
 }
 
index 00172b3feaca970462c97c3f3d2687bd1212d0e6..1087d9f014a2fc6029458795373daa157e08e241 100644 (file)
@@ -1803,14 +1803,14 @@ get_offsets ()
   offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
   memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
 
-  ANOFFSET (offs, SECT_OFF_TEXT) = text_addr;
+  ANOFFSET (offs, SECT_OFF_TEXT (symfile_objfile)) = text_addr;
 
   /* This is a temporary kludge to force data and bss to use the same offsets
      because that's what nlmconv does now.  The real solution requires changes
      to the stub and remote.c that I don't have time to do right now.  */
 
-  ANOFFSET (offs, SECT_OFF_DATA) = data_addr;
-  ANOFFSET (offs, SECT_OFF_BSS) = data_addr;
+  ANOFFSET (offs, SECT_OFF_DATA (symfile_objfile)) = data_addr;
+  ANOFFSET (offs, SECT_OFF_BSS (symfile_objfile)) = data_addr;
 
   objfile_relocate (symfile_objfile, offs);
 }
@@ -1918,9 +1918,9 @@ remote_cisco_objfile_relocate (text_off, data_off, bss_off)
       offs = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
       memcpy (offs, symfile_objfile->section_offsets, SIZEOF_SECTION_OFFSETS);
 
-      ANOFFSET (offs, SECT_OFF_TEXT) = text_off;
-      ANOFFSET (offs, SECT_OFF_DATA) = data_off;
-      ANOFFSET (offs, SECT_OFF_BSS) = bss_off;
+      ANOFFSET (offs, SECT_OFF_TEXT (symfile_objfile)) = text_off;
+      ANOFFSET (offs, SECT_OFF_DATA (symfile_objfile)) = data_off;
+      ANOFFSET (offs, SECT_OFF_BSS (symfile_objfile)) = bss_off;
 
       /* First call the standard objfile_relocate.  */
       objfile_relocate (symfile_objfile, offs);
index 49b481dcba7a37f5ed5085a30e4c7c0eb192ab86..133269c826de4e7145b5bdca3f12b2ff59f7a2b5 100644 (file)
@@ -357,9 +357,9 @@ vmap_symtab (vp)
 
   /* The symbols in the object file are linked to the VMA of the section,
      relocate them VMA relative.  */
-  ANOFFSET (new_offsets, SECT_OFF_TEXT) = vp->tstart - vp->tvma;
-  ANOFFSET (new_offsets, SECT_OFF_DATA) = vp->dstart - vp->dvma;
-  ANOFFSET (new_offsets, SECT_OFF_BSS) = vp->dstart - vp->dvma;
+  ANOFFSET (new_offsets, SECT_OFF_TEXT (objfile)) = vp->tstart - vp->tvma;
+  ANOFFSET (new_offsets, SECT_OFF_DATA (objfile)) = vp->dstart - vp->dvma;
+  ANOFFSET (new_offsets, SECT_OFF_BSS (objfile)) = vp->dstart - vp->dvma;
 
   objfile_relocate (objfile, new_offsets);
 }
index bc9a3829abbe61d66932114e973f839363806252..8dda58df9cd7b20eb87e11759d1ba14a3f52783b 100644 (file)
@@ -471,10 +471,24 @@ som_symfile_offsets (objfile, addrs)
   objfile->section_offsets = (struct section_offsets *)
     obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
 
+  /* FIXME: ezannoni 2000-04-20 The section names in SOM are not
+     .text, .data, etc, but $TEXT$, $DATA$,... We should initialize
+     SET_OFF_* from bfd. (See default_symfile_offsets()). But I don't
+     know the correspondence between SOM sections and GDB's idea of
+     section names. So for now we default to what is was before these
+     changes.*/
+  objfile->sect_index_text = 0;
+  objfile->sect_index_data = 1;
+  objfile->sect_index_bss = 2;
+  objfile->sect_index_rodata = 3;
+
   /* First see if we're a shared library.  If so, get the section
      offsets from the library, else get them from addrs.  */
   if (!som_solib_section_offsets (objfile, objfile->section_offsets))
     {
+      /* Note: Here is OK to compare with ".text" because this is the
+         name that gdb itself gives to that section, not the SOM
+         name. */
       for (i = 0; i < SECT_OFF_MAX && addrs->other[i].name; i++)
        if (strcmp (addrs->other[i].name, ".text") == 0)
          break;
index 5d559a083cd909f32e3c23d853d3da75dc50ca80..fa7ecd09c0a8e6230596cc34c0f440c0596f0e0f 100644 (file)
@@ -355,13 +355,13 @@ som_solib_load_symbols (so, name, from_tty, text_addr, target)
     {
       if (p->the_bfd_section->flags & SEC_CODE)
        {
-         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT);
-         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT);
+         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT (so->objfile));
+         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT (so->objfile));
        }
       else if (p->the_bfd_section->flags & SEC_DATA)
        {
-         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA);
-         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA);
+         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA (so->objfile));
+         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA (so->objfile));
        }
     }
 
@@ -1407,11 +1407,11 @@ som_solib_section_offsets (objfile, offsets)
          asection *private_section;
 
          /* The text offset is easy.  */
-         ANOFFSET (offsets, SECT_OFF_TEXT)
+         ANOFFSET (offsets, SECT_OFF_TEXT (objfile))
            = (so_list->som_solib.text_addr
               - so_list->som_solib.text_link_addr);
-         ANOFFSET (offsets, SECT_OFF_RODATA)
-           = ANOFFSET (offsets, SECT_OFF_TEXT);
+         ANOFFSET (offsets, SECT_OFF_RODATA (objfile))
+           = ANOFFSET (offsets, SECT_OFF_TEXT (objfile));
 
          /* We should look at presumed_dp in the SOM header, but
             that's not easily available.  This should be OK though.  */
@@ -1420,14 +1420,14 @@ som_solib_section_offsets (objfile, offsets)
          if (!private_section)
            {
              warning ("Unable to find $PRIVATE$ in shared library!");
-             ANOFFSET (offsets, SECT_OFF_DATA) = 0;
-             ANOFFSET (offsets, SECT_OFF_BSS) = 0;
+             ANOFFSET (offsets, SECT_OFF_DATA (objfile)) = 0;
+             ANOFFSET (offsets, SECT_OFF_BSS (objfile)) = 0;
              return 1;
            }
-         ANOFFSET (offsets, SECT_OFF_DATA)
+         ANOFFSET (offsets, SECT_OFF_DATA (objfile))
            = (so_list->som_solib.data_start - private_section->vma);
-         ANOFFSET (offsets, SECT_OFF_BSS)
-           = ANOFFSET (offsets, SECT_OFF_DATA);
+         ANOFFSET (offsets, SECT_OFF_BSS (objfile))
+           = ANOFFSET (offsets, SECT_OFF_DATA (objfile));
          return 1;
        }
       so_list = so_list->next;
index 7adf078e8258da857c7901c46f6781f368273e47..206310e4d421e2fe94d3d644dbd450979dbcc95c 100644 (file)
@@ -1351,13 +1351,13 @@ define_symbol (valu, string, desc, type, objfile)
   switch (type & N_TYPE)
     {
     case N_TEXT:
-      SYMBOL_SECTION (sym) = SECT_OFF_TEXT;
+      SYMBOL_SECTION (sym) = SECT_OFF_TEXT (objfile);
       break;
     case N_DATA:
-      SYMBOL_SECTION (sym) = SECT_OFF_DATA;
+      SYMBOL_SECTION (sym) = SECT_OFF_DATA (objfile);
       break;
     case N_BSS:
-      SYMBOL_SECTION (sym) = SECT_OFF_BSS;
+      SYMBOL_SECTION (sym) = SECT_OFF_BSS (objfile);
       break;
     }
 
index 108695a338e6cf825649e6e8decfe58e5eff389b..b01fe33f7121ad2460601b87490f120a425cbcb9 100644 (file)
@@ -518,33 +518,49 @@ default_symfile_offsets (objfile, addrs)
      struct section_addr_info *addrs;
 {
   int i;
+  asection *sect = NULL;
 
   objfile->num_sections = SECT_OFF_MAX;
   objfile->section_offsets = (struct section_offsets *)
     obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
   memset (objfile->section_offsets, 0, SIZEOF_SECTION_OFFSETS);
 
-  /* Now calculate offsets for other sections. */
+  /* Now calculate offsets for section that were specified by the
+     caller. */
   for (i = 0; i < MAX_SECTIONS && addrs->other[i].name; i++)
     {
       struct other_sections *osp ;
 
       osp = &addrs->other[i] ;
-      if (addrs->other[i].addr == 0)
+      if (osp->addr == 0)
        continue;
-#if 0
-      if (strcmp (".text", osp->name) == 0)
-       SECT_OFF_TEXT = osp->sectindex ;
-      else if (strcmp (".data", osp->name) == 0)
-       SECT_OFF_DATA = osp->sectindex ;
-      else if (strcmp (".bss", osp->name) == 0)
-       SECT_OFF_BSS =  osp->sectindex ;
-#endif
+
       /* Record all sections in offsets */
+      /* The section_offsets in the objfile are here filled in using
+         the BFD index. */
       ANOFFSET (objfile->section_offsets, osp->sectindex) = osp->addr;
     }
-}
 
+  /* Remember the bfd indexes for the .text, .data, .bss and
+     .rodata sections. */
+
+  sect = bfd_get_section_by_name (objfile->obfd, ".text");
+  if (sect) 
+    objfile->sect_index_text = sect->index;
+
+  sect = bfd_get_section_by_name (objfile->obfd, ".data");
+  if (sect) 
+    objfile->sect_index_data = sect->index;
+
+  sect = bfd_get_section_by_name (objfile->obfd, ".bss");
+  if (sect) 
+    objfile->sect_index_bss = sect->index;
+
+  sect = bfd_get_section_by_name (objfile->obfd, ".rodata");
+  if (sect) 
+    objfile->sect_index_rodata = sect->index;
+
+}
 
 /* Process a symbol file, as either the main file or as a dynamically
    loaded file.
@@ -631,12 +647,12 @@ syms_from_objfile (objfile, addrs, mainline, verbo)
       if (lower_sect == NULL)
        warning ("no loadable sections found in added symbol-file %s",
                 objfile->name);
-      else if ((bfd_get_section_flags (objfile->obfd, lower_sect) & SEC_CODE)
-              == 0)
-       warning ("Lowest section in %s is %s at %s",
-                objfile->name,
-                bfd_section_name (objfile->obfd, lower_sect),
-                paddr (bfd_section_vma (objfile->obfd, lower_sect)));
+      else 
+       if ((bfd_get_section_flags (objfile->obfd, lower_sect) & SEC_CODE) == 0)
+         warning ("Lowest section in %s is %s at %s",
+                  objfile->name,
+                  bfd_section_name (objfile->obfd, lower_sect),
+                  paddr (bfd_section_vma (objfile->obfd, lower_sect)));
       if (lower_sect != NULL)
        lower_offset = bfd_section_vma (objfile->obfd, lower_sect);
       else
index 944128293fa493896f616d1653aaa3e177cda5f4..991c83a372445aa943bf4ba6d1e22b21b1c8264d 100644 (file)
@@ -275,6 +275,7 @@ struct find_targ_sec_arg
     int targ_index;
     int *resultp;
     asection **bfd_sect;
+    struct objfile *objfile;
   };
 
 static void find_targ_sec PARAMS ((bfd *, asection *, void *));
@@ -286,15 +287,16 @@ find_targ_sec (abfd, sect, obj)
      PTR obj;
 {
   struct find_targ_sec_arg *args = (struct find_targ_sec_arg *) obj;
+  struct objfile *objfile = args->objfile;
   if (sect->target_index == args->targ_index)
     {
       /* This is the section.  Figure out what SECT_OFF_* code it is.  */
       if (bfd_get_section_flags (abfd, sect) & SEC_CODE)
-       *args->resultp = SECT_OFF_TEXT;
+       *args->resultp = SECT_OFF_TEXT (objfile);
       else if (bfd_get_section_flags (abfd, sect) & SEC_LOAD)
-       *args->resultp = SECT_OFF_DATA;
+       *args->resultp = SECT_OFF_DATA (objfile);
       else
-       *args->resultp = SECT_OFF_BSS;
+       *args->resultp = SECT_OFF_BSS (objfile);
       *args->bfd_sect = sect;
     }
 }
@@ -305,12 +307,13 @@ secnum_to_section (secnum, objfile)
      int secnum;
      struct objfile *objfile;
 {
-  int off = SECT_OFF_TEXT;
+  int off = SECT_OFF_TEXT (objfile);
   asection *sect = NULL;
   struct find_targ_sec_arg args;
   args.targ_index = secnum;
   args.resultp = &off;
   args.bfd_sect = &sect;
+  args.objfile = objfile;
   bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
   return off;
 }
@@ -321,7 +324,7 @@ secnum_to_bfd_section (secnum, objfile)
      int secnum;
      struct objfile *objfile;
 {
-  int off = SECT_OFF_TEXT;
+  int off = SECT_OFF_TEXT (objfile);
   asection *sect = NULL;
   struct find_targ_sec_arg args;
   args.targ_index = secnum;
@@ -849,7 +852,7 @@ enter_line_range (subfile, beginoffset, endoffset, startaddr, endaddr,
              ? int_lnno.l_addr.l_paddr
              : read_symbol_nvalue (int_lnno.l_addr.l_symndx));
       addr += ANOFFSET (this_symtab_psymtab->objfile->section_offsets,
-                       SECT_OFF_TEXT);
+                       SECT_OFF_TEXT (this_symtab_psymtab->objfile));
 
       if (addr < startaddr || (endaddr && addr >= endaddr))
        return;
@@ -1095,7 +1098,7 @@ read_xcoff_symtab (pst)
          if (last_source_file)
            {
              pst->symtab =
-               end_symtab (cur_src_end_addr, objfile, SECT_OFF_TEXT);
+               end_symtab (cur_src_end_addr, objfile, SECT_OFF_TEXT (objfile));
              end_stabs ();
            }
 
@@ -1160,7 +1163,7 @@ read_xcoff_symtab (pst)
                        {
                          complete_symtab (filestring, file_start_addr);
                          cur_src_end_addr = file_end_addr;
-                         end_symtab (file_end_addr, objfile, SECT_OFF_TEXT);
+                         end_symtab (file_end_addr, objfile, SECT_OFF_TEXT (objfile));
                          end_stabs ();
                          start_stabs ();
                          /* Give all csects for this source file the same
@@ -1180,7 +1183,7 @@ read_xcoff_symtab (pst)
 
                      file_start_addr =
                        cs->c_value + ANOFFSET (objfile->section_offsets,
-                                               SECT_OFF_TEXT);
+                                               SECT_OFF_TEXT (objfile));
                      file_end_addr = file_start_addr + CSECT_LEN (&main_aux);
 
                      if (cs->c_name && cs->c_name[0] == '.')
@@ -1276,7 +1279,7 @@ read_xcoff_symtab (pst)
 
          complete_symtab (filestring, file_start_addr);
          cur_src_end_addr = file_end_addr;
-         end_symtab (file_end_addr, objfile, SECT_OFF_TEXT);
+         end_symtab (file_end_addr, objfile, SECT_OFF_TEXT (objfile));
          end_stabs ();
 
          /* XCOFF, according to the AIX 3.2 documentation, puts the filename
@@ -1311,7 +1314,7 @@ read_xcoff_symtab (pst)
          if (STREQ (cs->c_name, ".bf"))
            {
              CORE_ADDR off = ANOFFSET (objfile->section_offsets,
-                                       SECT_OFF_TEXT);
+                                       SECT_OFF_TEXT (objfile));
              bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
                                    0, cs->c_naux, &main_aux);
 
@@ -1323,7 +1326,7 @@ read_xcoff_symtab (pst)
                (fcn_cs_saved.c_value + off,
                 fcn_stab_saved.c_name, 0, 0, objfile);
              if (new->name != NULL)
-               SYMBOL_SECTION (new->name) = SECT_OFF_TEXT;
+               SYMBOL_SECTION (new->name) = SECT_OFF_TEXT (objfile);
            }
          else if (STREQ (cs->c_name, ".ef"))
            {
@@ -1356,7 +1359,7 @@ read_xcoff_symtab (pst)
                            (fcn_cs_saved.c_value
                             + fcn_aux_saved.x_sym.x_misc.x_fsize
                             + ANOFFSET (objfile->section_offsets,
-                                        SECT_OFF_TEXT)),
+                                        SECT_OFF_TEXT (objfile))),
                            objfile);
              within_function = 0;
            }
@@ -1426,7 +1429,7 @@ read_xcoff_symtab (pst)
              new = push_context (depth,
                                  (cs->c_value
                                   + ANOFFSET (objfile->section_offsets,
-                                              SECT_OFF_TEXT)));
+                                              SECT_OFF_TEXT (objfile))));
            }
          else if (STREQ (cs->c_name, ".eb"))
            {
@@ -1448,7 +1451,7 @@ read_xcoff_symtab (pst)
                                new->start_addr,
                                (cs->c_value
                                 + ANOFFSET (objfile->section_offsets,
-                                            SECT_OFF_TEXT)),
+                                            SECT_OFF_TEXT (objfile))),
                                objfile);
                }
              local_symbols = new->locals;
@@ -1467,7 +1470,7 @@ read_xcoff_symtab (pst)
 
       complete_symtab (filestring, file_start_addr);
       cur_src_end_addr = file_end_addr;
-      s = end_symtab (file_end_addr, objfile, SECT_OFF_TEXT);
+      s = end_symtab (file_end_addr, objfile, SECT_OFF_TEXT (objfile));
       /* When reading symbols for the last C_FILE of the objfile, try
          to make sure that we set pst->symtab to the symtab for the
          file, not to the _globals_ symtab.  I'm not sure whether this
@@ -2763,22 +2766,43 @@ xcoff_symfile_offsets (objfile, addrs)
      struct objfile *objfile;
      struct section_addr_info *addrs;
 {
+  asection *sect = NULL;
   int i;
 
   objfile->num_sections = SECT_OFF_MAX;
   objfile->section_offsets = (struct section_offsets *)
     obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
 
-  /* syms_from_objfile kindly subtracts from addr the bfd_section_vma
-     of the .text section.  This strikes me as wrong--whether the
-     offset to be applied to symbol reading is relative to the start
-     address of the section depends on the symbol format.  In any
-     event, this whole "addr" concept is pretty broken (it doesn't
-     handle any section but .text sensibly), so just ignore the addr
-     parameter and use 0.  rs6000-nat.c will set the correct section
-     offsets via objfile_relocate.  */
+  /* Initialize the section indexes for future use. */
+  sect = bfd_get_section_by_name (objfile->obfd, ".text");
+  if (sect) 
+    objfile->sect_index_text = sect->index;
+
+  sect = bfd_get_section_by_name (objfile->obfd, ".data");
+  if (sect) 
+    objfile->sect_index_data = sect->index;
+
+  sect = bfd_get_section_by_name (objfile->obfd, ".bss");
+  if (sect) 
+    objfile->sect_index_bss = sect->index;
+
+  sect = bfd_get_section_by_name (objfile->obfd, ".rodata");
+  if (sect) 
+    objfile->sect_index_rodata = sect->index;
+
   for (i = 0; i < objfile->num_sections; ++i)
-    ANOFFSET (objfile->section_offsets, i) = 0;
+    {
+      /* syms_from_objfile kindly subtracts from addr the
+        bfd_section_vma of the .text section.  This strikes me as
+        wrong--whether the offset to be applied to symbol reading is
+        relative to the start address of the section depends on the
+        symbol format.  In any event, this whole "addr" concept is
+        pretty broken (it doesn't handle any section but .text
+        sensibly), so just ignore the addr parameter and use 0.
+        rs6000-nat.c will set the correct section offsets via
+        objfile_relocate.  */
+       ANOFFSET (objfile->section_offsets, i) = 0;
+    }
 }
 
 /* Register our ability to parse symbols for xcoff BFD files.  */