Print

Print


I've checked and you're right.

```
]==> cat t1.cxx
#include <iostream>
struct t1 {
  t1() {std::cout << "constructing t1" << std::endl;}
  ~t1() {std::cout << "destructing t1" << std::endl;}
};
static t1 _t1;
]==> cat t2.cxx
#include <iostream>
struct t2 {
  t2() {std::cout << "constructing t2" << std::endl;}
  ~t2() {std::cout << "destructing t2" << std::endl;}
};
static t2 _t2;
]==> cat t3.cxx
#include <iostream>
struct t3 {
  t3() {std::cout << "constructing t3" << std::endl;}
  ~t3() {std::cout << "destructing t3" << std::endl;}
};
static t3 _t3;
]==> cat test.cxx
#include <dlfcn.h>
#include <iostream>
#include <cstdlib>
void atexit1() {
  std::cout << "atexit1" << std::endl;
}
void atexit2() {
  std::cout << "atexit2" << std::endl;
}
void atexit3() {
  std::cout << "atexit3" << std::endl;
}
int main(int argc, char **argv) {
  atexit(atexit1);
  dlopen("./libt1.so", RTLD_NOW|RTLD_NODELETE);
  atexit(atexit2);
  dlopen("./libt2.so", RTLD_NOW|RTLD_NODELETE);
  atexit(atexit3);
  dlopen("./libt3.so", RTLD_NOW|RTLD_NODELETE);
  return 0;
}
]==> g++ -shared -fPIC t1.cxx -o libt1.so
]==> g++ -shared -fPIC t2.cxx -o libt2.so
]==> g++ -shared -fPIC t3.cxx -o libt3.so
]==> g++ test.cxx -o test -ldl           
]==> ./test 
constructing t1
constructing t2
constructing t3
destructing t3
atexit3
destructing t2
atexit2
destructing t1
atexit1
```

I was confused because I read a lot of glibc's code recently and it essentially calls `main` like this:

```
exit(main(...));
```
See: https://sourceware.org/git/?p=glibc.git;a=blob;f=csu/libc-start.c;h=f4aa01a988994b274c0e792345ca8bbbcc6a475f;hb=HEAD#l320

And `exit` just calls the `atexit` handlers and quits. See: https://sourceware.org/git/?p=glibc.git;a=blob;f=stdlib/exit.c;h=9d3c5f48dfe1885a35e6a0a70e66275ddc19d3ef;hb=HEAD#l102

Therefore, the only way for all this to work this way is for `dlopen` to register its own `atexit` handlers, but I haven't seen anything like this when I skimmed thorough this code. Do you know what is the justification for doing it this way? I mean the order of implicit dlcloses and atexit handlers.

Anyways, I learned something new, thanks! And sorry for the noise.

---
Reply to this email directly or view it on GitHub:
https://github.com/xrootd/xrootd/issues/338#issuecomment-195476112

########################################################################
Use REPLY-ALL to reply to list

To unsubscribe from the XROOTD-DEV list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=XROOTD-DEV&A=1