11
votes

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
What is it that you're trying to accomplish by splitting out the individual object files? - Mark Bessey
The original reason was that, I wanted to specify the output section for a static lib in the linker script. And for some reason, the archive syntax (libx.a:*.o(.text)) does not work, probably due to the out-of-date binutil version in my tool chain. Since I could not upgrade the tool chain, I had to unpack the library and use the object files explicity. And that's how I ran into this problem. - user313031

1 Answers

10
votes

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.