Fix code in elf_symtab_read which attempts to read the standard ELF
authorFred Fish <fnf@specifix.com>
Fri, 14 Feb 1992 01:22:12 +0000 (01:22 +0000)
committerFred Fish <fnf@specifix.com>
Fri, 14 Feb 1992 01:22:12 +0000 (01:22 +0000)
symbol table and add symbol information to the misc function vector.
This allows minimum functionality with non -g compiled code, and is
vital for use with shared libraries (non of which are currently
compiled with -g).

Note to anyone doing any SVR4/gdb work.  This bug was introduced into
gdb just prior to the gdb 4.4 release, thus any versions currently
in the field will have broken shared library support since no symbol
information at all will be available for the shared library.  This
fix, along with one about to go into bfd's elf.c should fix that
problem.

gdb/ChangeLog
gdb/elfread.c

index 128c1e2d6faf133ac79d27e1a024bf489cd16c5f..d2fcc6fc0615cc0fcd8b7a24d26ead8f74e6f54a 100644 (file)
@@ -1,3 +1,8 @@
+Thu Feb 13 17:14:28 1992  Fred Fish  (fnf at cygnus.com)
+
+       * elfread.c (elf_symtab_read):  Fix code to correctly track
+       changes in bfd for absolute symbols.
+
 Thu Feb 13 12:43:29 1992  Stu Grossman  (grossman at cygnus.com)
 
        * xm-vaxbsd.h:  Close off comment.
index 8cabd2f5d2990e8f7424b1485629cd403d152a93..a24f4c24d3dc38d0d037951e46557df203eb3463 100644 (file)
@@ -195,25 +195,28 @@ DEFUN (elf_symtab_read, (abfd, addr, mainline),
       for (i = 0; i < number_of_symbols; i++)
        {
          sym = *symbol_table++;
-         /* Select global symbols that are defined in a specific section
-            or are absolute. */
-         if (sym -> flags & BSF_GLOBAL
-             && (sym -> section == &bfd_abs_section))
+         /* Select global/weak symbols that are defined in a specific section.
+            Note that bfd now puts abs symbols in their own section, so
+            all symbols we are interested in will have a section. */
+         if ((sym -> flags & (BSF_GLOBAL | BSF_WEAK))
+             && (sym -> section != NULL))
            {
              symaddr = sym -> value;
-             if (!mainline)
+             /* Relocate all non-absolute symbols by base address.
+                FIXME:  Can we eliminate the check for mainline now,
+                since shouldn't addr be 0 in this case? */
+             if (!mainline && (sym -> section != &bfd_abs_section))
                {
-                 /* Relocate all symbols by base address */
                  symaddr += addr;
                }
              /* 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 && (sym -> section -> flags & SEC_CODE))
+             if (sym -> section -> flags & SEC_CODE)
                {
                  mf_type = mf_text;
                }
-             else if (sym -> section && (sym -> section -> flags & SEC_DATA))
+             else if (sym -> section -> flags & SEC_DATA)
                {
                  mf_type = mf_data;
                }