Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Jan 1999 17:08:00 -0600
From:      "Brian C. Grayson" <bgrayson@marvin.ece.utexas.edu>
To:        freebsd-hackers@FreeBSD.ORG
Subject:   a.out/ELF differences:  C++ static constructor ordering
Message-ID:  <19990127170800.A27484@marvin.ece.utexas.edu>

next in thread | raw e-mail | index | archive | help
  I just noticed (after two days of gdb and instrumenting the STL
header files -- fun!) that my current problem stems from the fact
that under ELF, static constructors are invoked in a different
order than under a.out.  

1.  Under both formats, objects within a file are created in
    program-order.  Good.

2.  Under ELF, objects in different files are constructed in the
    order that the files appear on the link command line
    (example below).  Under a.out, objects in different files are
    constructed in _reverse_ order from the file order on the command
    line (this is the behavior I've seen under *BSD/a.out, AIX
    XCOFF, Solaris ELF, and probably others).
 
Is this change intentional?  Unfortunately, this behavior breaks a
major project of mine (50Kloc and counting).  I wouldn't be
surprised if it breaks numerous other complex C++ programs, also.

This is with gcc 2.7.2.1 on both a.out and ELF.

As an example, create the files foo.h, a.cc, b.cc, and main.cc as
follows:

foo.h:
class Foo {
  public:
    Foo(char* p) { printf("%s\n", p); }
};  

a.cc:
#include "foo.h"
Foo a("a");
Foo a2("a2");

b.cc
#include "foo.h"
Foo b("b");

main.cc:
main () {}

  Now, build some executables.  The first two are on an ELF
machine, the second two on a.out.
c++ -o ab.elf a.cc b.cc main.cc
c++ -o ba.elf b.cc a.cc main.cc

c++ -o ab.aout a.cc b.cc main.cc
c++ -o ba.aout b.cc a.cc main.cc

ab.elf and ab.aout behave differently:
% ab.elf
a
a2
b
% ab.aout
b
a
a2

ba.elf and ba.aout also differ:
% ba.elf
b
a
a2
% ba.aout
a
a2
b

  Looking at the csu source code, __ctors/do_ctors both process the
lists in the same order, so it appears that the linker is
appending in one case, and prepending in the other????

  Brian

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990127170800.A27484>