Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do dynamic libraries break C++ standard?

The C++ standard 3.6.3 states

Destructors for initialized objects of static duration are called as a result of returning from main and as a result of calling exit

On windows you have FreeLibrary and linux you have dlclose to unload a dynamically linked library. And you can call these functions before returning from main.

A side effect of unloading a shared library is that all destructors for static objects defined in the library are run.

Does this mean it violates the C++ standard as these destructors have been run prematurely ?

like image 604
parapura rajkumar Avatar asked Nov 03 '11 22:11

parapura rajkumar


People also ask

Is C standard library dynamically linked?

Overview of the C++ compilation steps: The ldd command lists the runtime library dependencies. libc is the C Standard library which is also linked dynamically.

Which is better static or dynamic library?

In C exist two kinds of libraries the first ones are the static that allows us to link to the program and are not relevant during the runtime, and the other ones are called dynamic libraries those are preferable use when you run a lot of programs at the same time who are using the same library and you want to be more ...

What is true about dynamic libraries?

A dynamic library is loaded into the address space during execution runtime or launch. When loaded at execution runtime, a dynamic library is known as a "dynamically loaded library" or "dynamically linked library." When loaded at launch, a dynamic library is known as a "dynamic dependent library."

Are static libraries faster than dynamic?

Static linking produces a larger executable file than dynamic linking because it has to compile all of the library code directly into the executable. The benefit is a reduction in overhead from no longer having to call functions from a library, and anywhere from somewhat to noticeably faster load times.


4 Answers

It's a meaningless question. The C++ standard doesn't say what dlclose does or should do.

If the standard were to include a specification for dlclose, it would certainly point out that dlclose is an exception to 3.6.3. So then 3.6.3 wouldn't be violated because it would be a documented exception. But we can't know that, since it doesn't cover it.

What effect dlclose has on the guarantees in the C++ standard is simply outside the scope of that standard. Nothing dlclose can do can violate the C++ standard because the standard says nothing about it.

(If this were to happen without the program doing anything specific to invoke it, then you would have a reasonable argument that the standard is being violated.)

like image 87
David Schwartz Avatar answered Oct 11 '22 19:10

David Schwartz


Parapura, it may be helpful to keep in mind that the C++ standard is a language definition that imposes constraints on how the compiler converts source code into object code.

The standard does not impose constraints on the operating system, hardware, or anything else.

If a user powers off his machine, is that a violation of the C++ standard? Of course not. Does the standard need to say "unless the user powers off the device" as an "exception" to every rule? That would be silly.

Similarly, if an operating system kills a process or forces the freeing of some system resources, or even allows a third party program to clobber your data structures -- this is not a violation of the C++ standard. It may well be a bug in the OS, but the C++ language definition remains intact.

The standard is only binding on compilers, and forces the resulting executable code to have certain properties. Nevertheless, it does not bind runtime behavior, which is why we spend so much time on exception handling.

like image 29
rsj Avatar answered Oct 11 '22 21:10

rsj


I'm taking this to be a bit of an open-ended question.

I'd say it's like this: The standard only defines what a program is. And a program (a "hosted" one, I should add) is a collection of compiled and linked translation units that has a unique main entry point.

A shared library has no such thing, so it doesn't even constitute a "program" in the sense of the standard. It's just a bunch of linked executable code without any sort of "flow". If you use load-time linking, the library becomes part of the program, and all is as expected. But if you use runtime linking, the situation is different.

Therefore, you may like to view it like this: global variables in the runtime-linked shared object are essentially dynamic objects which are constructed by the dynamic loader, and which are destroyed when the library is unloaded. The fact that those objects are declared like global objects doesn't change that, since the objects aren't part of a "program" at that point.

like image 32
Kerrek SB Avatar answered Oct 11 '22 19:10

Kerrek SB


They are only run prematurely if you go to great effort to do so - the default behavior is standard conforming.

like image 2
Mark Ransom Avatar answered Oct 11 '22 21:10

Mark Ransom