From d3cef9f830cd99cd6587030f2cd1c885b07af70f Mon Sep 17 00:00:00 2001 From: dje Date: Sat, 6 Mar 2004 20:49:30 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@79031 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/collect2.c | 23 +++++++++++++---------- 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 + + * 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 * 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; } -- 2.7.4