58

As far as I understand they are libraries, but what is the difference between the two?

45

A .a file is a static library, while a .so file is a shared object (dynamic) library similar to a DLL on Windows. There's some detailed information about the differences between the two on this page.

  • 13
    .a can only be included as part of a program during compiling. .so's can be "imported" while a program loads. – LawrenceC May 14 '11 at 23:39
  • 2
    what does .a stand for? – hfrmobile Nov 29 '16 at 12:17
  • 2
    @hfrmobile The a stands for archive - a static library is a collection of object files created using the ar utility. More info here – ajk Nov 29 '16 at 16:19
26

As a follow on, a .a file is an "ar" archive. Not unlike a tar archive, it stores .o or object files, allowing them to be pulled out of the archive, and linked into a program, among other things. You could use ar to store other files if you wanted.

You can get a listing of the members of an ar file with the -t parameter, for instance:

ar -t /usr/lib/libc.a

A .so file is a "shared object" file, and has a lot more information available to the linker so that members can be linked in to a loading program as rapidly as possible.

For instance, try:

objdump -T /lib/libc-2.11.1.so

(or whatever version of libc.so you have in your /lib directory.) Note that a .so file could also just contain a linker script directing it to find the file elsewhere, or use something else.

Interestingly, a .so file can also be a full fledged program. For instance, trying running /lib/libc.so.6. (Sadly, this last part doesn't seem to work on more modern systems. Not that it's a great loss.)

  • Typo. you mean to write ar -t /usr/lib/libc.a. Actually the - doesn't seem to be necessary in this case. Also /lib/libc.so.6. just prints some output. I don't know if I would call it a full fledged program. – Faheem Mitha May 15 '11 at 8:09
  • 1
    It's a full fledged program in the sense that it has a main symbol for exec to find. – Hack Saw May 16 '11 at 16:05
  • 2
    You can also run ldd on .so's, and it will show you what other libraries it uses. Static will return with a message saying it's not a dynamic library. – Marcin May 17 '11 at 1:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.