aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Edelsohn <edelsohn@gnu.org>2004-03-06 20:49:30 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2004-03-06 15:49:30 -0500
commitaaef9b06ac9ea6d57345f70e22327a122d6d897c (patch)
tree987b073666e53f5505a9113ffd957ec49bddccfe
parent7a9a5a4441eeed70b2f5608dd9510612ae195f90 (diff)
downloadgcc-aaef9b06ac9ea6d57345f70e22327a122d6d897c.zip
gcc-aaef9b06ac9ea6d57345f70e22327a122d6d897c.tar.gz
gcc-aaef9b06ac9ea6d57345f70e22327a122d6d897c.tar.bz2
collect2.c (main): Only export initfunc and finifunc if LD_INIT_SWITCH not defined.
* collect2.c (main): Only export initfunc and finifunc if LD_INIT_SWITCH not defined. (scan_prog_file): Only export constructors and destructors if LD_INIT_SWITCH not defined. Only export symbols not found in shared objects. From-SVN: r79031
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/collect2.c23
2 files changed, 21 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ac59b7c..2de8e1d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2004-03-06 David Edelsohn <edelsohn@gnu.org>
+
+ * collect2.c (main): Only export initfunc and finifunc if
+ LD_INIT_SWITCH not defined.
+ (scan_prog_file): Only export constructors and destructors if
+ LD_INIT_SWITCH not defined. Only export symbols not found in
+ shared objects.
+
2004-03-06 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* pa.md (icacheflush): Reorder operands to make match_scratch operand
diff --git a/gcc/collect2.c b/gcc/collect2.c
index c41a347..4fbe3a4 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -1398,10 +1398,12 @@ main (int argc, char **argv)
if (! exports.first)
*ld2++ = concat ("-bE:", export_file, NULL);
+#ifndef LD_INIT_SWITCH
add_to_list (&exports, initname);
add_to_list (&exports, fininame);
add_to_list (&exports, "_GLOBAL__DI");
add_to_list (&exports, "_GLOBAL__DD");
+#endif
exportf = fopen (export_file, "w");
if (exportf == (FILE *) 0)
fatal_perror ("fopen %s", export_file);
@@ -2719,7 +2721,7 @@ scan_prog_file (const char *prog_name, enum pass which_pass)
case 1:
if (! is_shared)
add_to_list (&constructors, name);
-#ifdef COLLECT_EXPORT_LIST
+#if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
if (which_pass == PASS_OBJ)
add_to_list (&exports, name);
#endif
@@ -2728,7 +2730,7 @@ scan_prog_file (const char *prog_name, enum pass which_pass)
case 2:
if (! is_shared)
add_to_list (&destructors, name);
-#ifdef COLLECT_EXPORT_LIST
+#if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
if (which_pass == PASS_OBJ)
add_to_list (&exports, name);
#endif
@@ -2753,7 +2755,7 @@ scan_prog_file (const char *prog_name, enum pass which_pass)
case 5:
if (! is_shared)
add_to_list (&frame_tables, name);
-#ifdef COLLECT_EXPORT_LIST
+#if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH)
if (which_pass == PASS_OBJ)
add_to_list (&exports, name);
#endif
@@ -2761,13 +2763,14 @@ scan_prog_file (const char *prog_name, enum pass which_pass)
default: /* not a constructor or destructor */
#ifdef COLLECT_EXPORT_LIST
- /* If we are building a shared object on AIX we need
- to explicitly export all global symbols. */
- if (shared_obj)
- {
- if (which_pass == PASS_OBJ && (! export_flag))
- add_to_list (&exports, name);
- }
+ /* Explicitly export all global symbols when
+ building a shared object on AIX, but do not
+ re-export symbols from another shared object
+ and do not export symbols if the user
+ provides an explicit export list. */
+ if (shared_obj && !is_shared
+ && which_pass == PASS_OBJ && !export_flag)
+ add_to_list (&exports, name);
#endif
continue;
}