aboutsummaryrefslogtreecommitdiff
path: root/bfd/sunos.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1996-02-21 02:51:02 +0000
committerIan Lance Taylor <ian@airs.com>1996-02-21 02:51:02 +0000
commitfe6fc35fdb89b493421742b290e86142b910ee85 (patch)
tree828be68a258b7cc960d48c266f3b9ae820b26091 /bfd/sunos.c
parenteb224848cdfa6892dad3f933658145c4305747f9 (diff)
downloadgdb-fe6fc35fdb89b493421742b290e86142b910ee85.zip
gdb-fe6fc35fdb89b493421742b290e86142b910ee85.tar.gz
gdb-fe6fc35fdb89b493421742b290e86142b910ee85.tar.bz2
* sunos.c (SUNOS_CONSTRUCTOR): Define.
(sunos_add_one_symbol): Don't let a symbol from a dynamic object override a constructor symbol. Set SUNOS_CONSTRUCTOR when appropriate.
Diffstat (limited to 'bfd/sunos.c')
-rw-r--r--bfd/sunos.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/bfd/sunos.c b/bfd/sunos.c
index e0c7a88..d0b8797 100644
--- a/bfd/sunos.c
+++ b/bfd/sunos.c
@@ -1,5 +1,5 @@
/* BFD backend for SunOS binaries.
- Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
+ Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
@@ -620,9 +620,11 @@ struct sunos_link_hash_entry
/* Symbol is defined by a regular object. */
#define SUNOS_DEF_REGULAR 02
/* Symbol is referenced by a dynamic object. */
-#define SUNOS_REF_DYNAMIC 010
+#define SUNOS_REF_DYNAMIC 04
/* Symbol is defined by a dynamic object. */
-#define SUNOS_DEF_DYNAMIC 020
+#define SUNOS_DEF_DYNAMIC 010
+ /* Symbol is a constructor symbol in a regular object. */
+#define SUNOS_CONSTRUCTOR 020
};
/* The SunOS linker hash table. */
@@ -1077,6 +1079,29 @@ sunos_add_one_symbol (info, abfd, name, flags, section, value, string,
}
}
+ if ((abfd->flags & DYNAMIC) != 0
+ && abfd->xvec == info->hash->creator
+ && (h->flags & SUNOS_CONSTRUCTOR) != 0)
+ {
+ /* The existing symbol is a constructor symbol, and this symbol
+ is from a dynamic object. A constructor symbol is actually a
+ definition, although the type will be bfd_link_hash_undefined
+ at this point. We want to ignore the definition from the
+ dynamic object. */
+ section = bfd_und_section_ptr;
+ }
+ else if ((flags & BSF_CONSTRUCTOR) != 0
+ && (abfd->flags & DYNAMIC) == 0
+ && h->root.root.type == bfd_link_hash_defined
+ && h->root.root.u.def.section->owner != NULL
+ && (h->root.root.u.def.section->owner->flags & DYNAMIC) != 0)
+ {
+ /* The existing symbol is defined by a dynamic object, and this
+ is a constructor symbol. As above, we want to force the use
+ of the constructor symbol from the regular object. */
+ h->root.root.type = bfd_link_hash_new;
+ }
+
/* Do the usual procedure for adding a symbol. */
if (! _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section,
value, string, copy, collect,
@@ -1112,6 +1137,10 @@ sunos_add_one_symbol (info, abfd, name, flags, section, value, string,
++sunos_hash_table (info)->dynsymcount;
h->dynindx = -2;
}
+
+ if ((flags & BSF_CONSTRUCTOR) != 0
+ && (abfd->flags & DYNAMIC) == 0)
+ h->flags |= SUNOS_CONSTRUCTOR;
}
return true;