From aaef9b06ac9ea6d57345f70e22327a122d6d897c Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Sat, 6 Mar 2004 20:49:30 +0000 Subject: 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 --- gcc/ChangeLog | 8 ++++++++ gcc/collect2.c | 23 +++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) (limited to 'gcc') 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; } -- cgit v1.1