Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

link with static library vs individual object files

Tags:

static

linker

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.

like image 669
user313031 Avatar asked Apr 09 '10 18:04

user313031


1 Answers

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.

like image 156
Rudi Avatar answered Oct 30 '22 21:10

Rudi