From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 534 invoked by alias); 3 Oct 2012 09:20:38 -0000 Received: (qmail 455 invoked by uid 48); 3 Oct 2012 09:20:22 -0000 From: "adivilceanu at yahoo dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/54791] New: AIX-only: Constructors are not called in main program. Date: Wed, 03 Oct 2012 09:20:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Keywords: X-Bugzilla-Severity: major X-Bugzilla-Who: adivilceanu at yahoo dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Changed-Fields: Message-ID: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2012-10/txt/msg00191.txt.bz2 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: unassigned@gcc.gnu.org ReportedBy: adivilceanu@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 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 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 ?