This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[BUG] ld behavior varies for C++ static initializer depending on.a or .o input


Using GNU ld version 2.13.90.0.18 20030206 (comes with Redhat 9)
Also experienced with previous 3.x and 2.9x versions.

When linking with a bunch of .o files, the desired behavior (static initializers are called) happens. But when linking .a files composed of those .o files, static initializers are not called. On the other hand, when the .cpp files are combined to make a single .o file, which is then used to form a .a file, that works.

This was previously reported to gcc bugs, but they sent me here (I've been lurking for quite a while to see if it was okay to post bugs here):
http://gcc.gnu.org/cgi-bin/gnatsweb.pl (bug 7769)


There is some good discussion there.

Full source code and makefile follows in the attachment. See below for a quick glance of what I'm talking about.

one.cc
------
#include <stdio.h>

class A {
public:
	A() { printf("Hello world!\n"); }
};
A a;
------

two.cc
------
int main() {}
------

combined.cc
-----------
#include "one.cc"
#include "two.cc"
-----------

Makefile
--------
CPP=g++
test:main1 main2 main3 main4
	./main1
	./main2
	./main3
	./main4
%.o:%.cc
	$(CPP) -c $<
lib%.a:%.o
	ar rv $@ $<
both.a:one.o two.o
	ar rv $@ $^
main1:one.o two.o
	$(CPP) one.o two.o -o main1
main2:libone.a libtwo.a
	$(CPP) libone.a libtwo.a -o main2
main3:both.a
	$(CPP) both.a -o main3
main4:libcombined.a
	$(CPP) libcombined.a -o main4
clean:
	rm -f *.a *.o main*
--------


thanks for your time. Hal

Attachment: static_init.tar.bz2
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]