+Fri Apr 1 00:44:00 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
+
+ For SVR4 targets, enable gdb to set breakpoints in shared
+ library functions before the executable is run.
+ * elfread.c (elf_symtab_read): Handle symbols for shared library
+ functions.
+ * sparc-tdep.c (in_solib_trampoline): Renamed to in_plt_section
+ and moved to objfiles.c.
+ * objfiles.c (in_plt_section): Moved to here from sparc-tdep.
+ * config/tm-sysv4.h (IN_SOLIB_TRAMPOLINE): Use new in_plt_section.
+ * config/sparc/tm-sun4sol2.h (IN_SOLIB_TRAMPOLINE): Removed,
+ the new generic definition from tm-sysv4.h works for Solaris.
+
Wed Mar 30 16:14:27 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
* elfread.c (elf_symtab_read): Change storage_needed,
/* For non-absolute symbols, use the type of the section
they are relative to, to intuit text/data. Bfd provides
no way of figuring this out for absolute symbols. */
- if (sym -> section == &bfd_abs_section)
+ if (sym -> section == &bfd_und_section
+ && (sym -> flags & BSF_GLOBAL)
+ && (sym -> flags & BSF_FUNCTION))
+ {
+ /* Symbol is a reference to a function defined in
+ a shared library.
+ If its value is non zero then it is usually the
+ absolute address of the corresponding entry in
+ the procedure linkage table.
+ If its value is zero then the dynamic linker has to
+ resolve the symbol. We are unable to find any
+ meaningful address for this symbol in the
+ executable file, so we skip it.
+ Irix 5 has a zero value for all shared library functions
+ in the main symbol table. The dynamic symbol table
+ would provide the right values, but BFD currently
+ cannot handle dynamic ELF symbol tables. */
+ ms_type = mst_solib_trampoline;
+ symaddr = sym -> value;
+ if (symaddr == 0)
+ continue;
+ }
+ else if (sym -> section == &bfd_abs_section)
{
ms_type = mst_abs;
}
return(NULL);
}
+
+/* In SVR4, we recognize a trampoline by it's section name.
+ That is, if the pc is in a section named ".plt" then we are in
+ a trampoline. */
+
+int
+in_plt_section(pc, name)
+ CORE_ADDR pc;
+ char *name;
+{
+ struct obj_section *s;
+ int retval = 0;
+
+ s = find_pc_section(pc);
+
+ retval = (s != NULL
+ && s->the_bfd_section->name != NULL
+ && STREQ (s->the_bfd_section->name, ".plt"));
+ return(retval);
+}