link with static library vs individual object file

2019-01-27 16:25发布

问题:

For a reason i want to unpack a static lib (libx.a) into individual object files (a.o b.o c.o), and specify these object files (a.o b.o c.o) in the linker input list instead of libx.a, with other linker options remaining the same.

However, i have noticed the above change has resulted in quite some difference in the output executable. Basically, (a.o b.o c.o) method will result in larger output size.

So what's the difference between the two methods (libx.a and individual object files)? And is there a way to work around?

The GNU binutil (for and ar ld) version i'm using is 2.16.1

Thanks.

回答1:

Ld removes unused parts of linked .lib archives (like variables with global linkage). This optimization cannot take place when the object files are passed directly, since the linker cannot determine if some unreferenced element of an .o file is needed by some unknown part later (for example because it would be extern visible by the module export list) or can be removed entirely. When a .lib is put in place in the linking process the linker knows for sure that it can drop unnecessary elements.



标签: static linker