From b8fbeb1874605f3dfe03e0b3ced670f6308b95f5 Mon Sep 17 00:00:00 2001 From: Elena Zannoni Date: Thu, 4 May 2000 16:52:34 +0000 Subject: [PATCH] Elena Zannoni * 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. --- gdb/ChangeLog | 27 ++++++++++++++++ gdb/coffread.c | 52 +++++++++++++++--------------- gdb/dbxread.c | 59 +++++++++++++++++++--------------- gdb/elfread.c | 14 ++++---- gdb/gdb-stabs.h | 9 ------ gdb/hp-psymtab-read.c | 22 ++++++------- gdb/hp-symtab-read.c | 4 +-- gdb/hpread.c | 10 +++--- gdb/mdebugread.c | 74 ++++++++++++++++++++++--------------------- gdb/minsyms.c | 6 ++-- gdb/mipsread.c | 6 ++-- gdb/objfiles.c | 38 +++++++++++++--------- gdb/objfiles.h | 28 ++++++++++++++++ gdb/os9kread.c | 30 +++++++++--------- gdb/pa64solib.c | 12 +++---- gdb/partial-stab.h | 26 +++++++-------- gdb/remote-os9k.c | 4 +-- gdb/remote-vx.c | 6 ++-- gdb/remote.c | 12 +++---- gdb/rs6000-nat.c | 6 ++-- gdb/somread.c | 14 ++++++++ gdb/somsolib.c | 24 +++++++------- gdb/stabsread.c | 6 ++-- gdb/symfile.c | 50 +++++++++++++++++++---------- gdb/xcoffread.c | 74 ++++++++++++++++++++++++++++--------------- 25 files changed, 365 insertions(+), 248 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6a898b6f0cc..c69168d238d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,30 @@ +Elena Zannoni + + * 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 * config/mips/tm-mipsv4.h (Dest_Reg), config/mips/tm-irix5.h diff --git a/gdb/coffread.c b/gdb/coffread.c index 75a90f737cf..6f6e6cb75f4 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -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 = § @@ -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 */ diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 74667e4c129..25302de1ccb 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -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 diff --git a/gdb/elfread.c b/gdb/elfread.c index d63d16a30fa..e76d5cda7ff 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -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) { diff --git a/gdb/gdb-stabs.h b/gdb/gdb-stabs.h index 7e498fb0605..3ec13930f5d 100644 --- a/gdb/gdb-stabs.h +++ b/gdb/gdb-stabs.h @@ -28,15 +28,6 @@ #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, diff --git a/gdb/hp-psymtab-read.c b/gdb/hp-psymtab-read.c index d3d0ff2eeff..33153091e3d 100644 --- a/gdb/hp-psymtab-read.c +++ b/gdb/hp-psymtab-read.c @@ -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. */ diff --git a/gdb/hp-symtab-read.c b/gdb/hp-symtab-read.c index dc045a4ef4e..1e67972196a 100644 --- a/gdb/hp-symtab-read.c +++ b/gdb/hp-symtab-read.c @@ -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; diff --git a/gdb/hpread.c b/gdb/hpread.c index 4da08e4927d..b36531a85fe 100644 --- a/gdb/hpread.c +++ b/gdb/hpread.c @@ -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; diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 085cd094be8..6c7ddccf93f 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -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 diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 2fd73cf74ba..a032dd35115 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -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; diff --git a/gdb/mipsread.c b/gdb/mipsread.c index d137a9aaac5..9d8f0ff9ea0 100644 --- a/gdb/mipsread.c +++ b/gdb/mipsread.c @@ -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) { diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 41ec317bc5c..d307c2ab85d 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -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. */ diff --git a/gdb/objfiles.h b/gdb/objfiles.h index d1bd4dad2a8..b24894a6fd2 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -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) */ diff --git a/gdb/os9kread.c b/gdb/os9kread.c index f820fe8dffa..cbc51a75e01 100644 --- a/gdb/os9kread.c +++ b/gdb/os9kread.c @@ -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 (); } @@ -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; diff --git a/gdb/pa64solib.c b/gdb/pa64solib.c index cb991b2c09d..ab568f57581 100644 --- a/gdb/pa64solib.c +++ b/gdb/pa64solib.c @@ -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)); } } diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h index 9c4be680a2b..b8c9de8d1fe 100644 --- a/gdb/partial-stab.h +++ b/gdb/partial-stab.h @@ -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; diff --git a/gdb/remote-os9k.c b/gdb/remote-os9k.c index dd821154e42..fd758b5a1b1 100644 --- a/gdb/remote-os9k.c +++ b/gdb/remote-os9k.c @@ -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); } diff --git a/gdb/remote-vx.c b/gdb/remote-vx.c index 06407041e69..d1a2582c27f 100644 --- a/gdb/remote-vx.c +++ b/gdb/remote-vx.c @@ -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); } diff --git a/gdb/remote.c b/gdb/remote.c index 00172b3feac..1087d9f014a 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -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); diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index 49b481dcba7..133269c826d 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -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); } diff --git a/gdb/somread.c b/gdb/somread.c index bc9a3829abb..8dda58df9cd 100644 --- a/gdb/somread.c +++ b/gdb/somread.c @@ -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; diff --git a/gdb/somsolib.c b/gdb/somsolib.c index 5d559a083cd..fa7ecd09c0a 100644 --- a/gdb/somsolib.c +++ b/gdb/somsolib.c @@ -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; diff --git a/gdb/stabsread.c b/gdb/stabsread.c index 7adf078e825..206310e4d42 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -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; } diff --git a/gdb/symfile.c b/gdb/symfile.c index 108695a338e..b01fe33f712 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -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 diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 944128293fa..991c83a3724 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -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 = § + 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. */ -- 2.30.2