开发者

can linker omit object file when linking static lib?

开发者 https://www.devze.com 2023-01-29 03:19 出处:网络
I have a static library (lib.a) and a program that links to it. The library doesn\'t have any entry point that would always be called before using it, but I need to execute a piece of code very early

I have a static library (lib.a) and a program that links to it. The library doesn't have any entry point that would always be called before using it, but I need to execute a piece of code very early in the program (preferably before main() starts). Therefore I thought I would use static variable of my own class. I added new source file that contains something like:

#include <MyClass.h>
static MyClass myVar;

The constructor of MyClass would then execute my code. When I link lib.a and try executing "nm" on it I get information that 开发者_运维技巧myVar is there. However, when I link my program and try "nm" on it I do not see myVar. When I put this piece of code into an existing file then the symbol is visible in the final executable. Why is that? Can linker omit object file from lib.a library in this case? I know that the variable is not referenced from outside (it cannot be as it is static) but it should execute code on it's own and therefore I don't get why should it be removed.

In case it makes a difference I'm using some old SunPro compiler.


Technically speaking, the linker should be forced to include that object file while compiling your program. However, support for this is buggy in many compilers, such as MSVC++. Adding an external reference somewhere in your main program should force that object file to be included.

Also note that in the case of nm, it's possible that your static initializer was inlined, and therefore the symbol need not exist in your final binary. Try something with side effects (such as a std::cout statement) in your static, and make sure it doesn't run before blaming the compiler :)


It turns out that what the linker does is pretty standard (I don't mean C++ standard, just generally observer behaviour) and you can work around it. In GNU ld it is --whole-archive option, in my case of Sun tools it is -z allextract. Which didn't actually work as expected for my project, so I used some magic with weak symbols an -z weakextract to achieve what I wanted.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号