84

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

1

2 Answers 2

67

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.

3
  • 29
    .a can only be included as part of a program during compiling. .so's can be "imported" while a program loads.
    – LawrenceC
    May 14, 2011 at 23:39
  • 4
    what does .a stand for?
    – hfrmobile
    Nov 29, 2016 at 12:17
  • 7
    @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, 2016 at 16:19
33

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. (This works on my Ubuntu 20.04 system)

3
  • 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. May 15, 2011 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, 2011 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, 2011 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.