http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54791



             Bug #: 54791

           Summary: AIX-only: Constructors are not called in main program.

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: major

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: adivilce...@yahoo.com





I work on a very big project on AIX 6.1(TL5 SP7). I migrated from xlC to

gcc(v4.7.2). I have the problem that constructors of a global objects defined

almost anywhere are not called. After searching a lot on this I saw this could

be if the objects are in libs(static or shared) and not referenced. This is not

my case because my global object is defined in the main source file(where main

is defined) and they are referenced.

I try to isolate the problem so I removed all the code from my main source file

and just let the following code:



#include <mybigtreeofconfidentialheaders.h>



class Adiv{

public:

    Adiv(char in_name[])

    {

        printf("Adiv()=%s\n",in_name);

        strcpy(name,in_name);

    }

    ~Adiv()

    {

        printf("~Adiv()=%s\n",name);

    }

    void f()

    {

        printf("f()name=%s\n",name);

    }

    char name[32];

    int x;

};



Adiv a("a");

static Adiv b("b");



int main()

{

    static Adiv c("c");

    a.f();

    b.f();

    c.f();

    return 0;

}





After building and executing I get the following output:

Adiv()=c

f()name=

f()name=

f()name=c

~Adiv()=c



Now, if I remove the #include <mybigtreeofconfidentialheaders.h> then I get the

correct output:

Adiv()=a

Adiv()=b

Adiv()=c

f()name=a

f()name=b

f()name=c

~Adiv()=c

~Adiv()=b

~Adiv()=a



The line I use to compile is:

g++ -c   -w -fno-strict-aliasing -fpermissive -save-temps -DMYCUSTOM_DEFINES

-DIALL_CHECKS -D_AIX_PTHREADS_D7   -Imy_custom_includes main.cpp

The line I use to link is:

g++ -Wl,-bmaxdata:0x40000000

-Wl,-blibpath:/usr/lib/threads:/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.7.2:/usr/lib:/lib

 -Wl,-bloadmap:/map.txt -omyexe main.o myobj_1.o myobj_2.o ...myobj_n.o



I want to mention that beside the pdsmain.cpp I have a lot of other

confidential cpp that I compile and link with pdsmain.cpp, but that should not

affect the constructors calling in the main object file, correct ?



So my basic question is: What could cause the constructors not to be called ?

Its definitely has to do with the big tree of headers. I can not provide them

as they are confidential.

I tried the same build (with the big tree of headers) on Linux and there it

works ! 



If needed I think I can provide the assembly file of the main.cpp with and

without the big tree of headers for you to see the differences.



One more thing:

This thread seems to have the same problem as me but it was never solved:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2413#c3.

See the comment from " David Obermann 2006-09-20 06:38:07 UTC ".



It seems in both cases the problem is reproducible with big applications on

AIX.

Could be the very number of global objects? Big TOC ?

Reply via email to