Version numbers in shared object files

前端 未结 1 2032
臣服心动
臣服心动 2020-12-31 12:14

I\'m building a shared object file from a group of C++ source files using GCC. All the example tutorials on building .so files show the file created with a ver

1条回答
  •  囚心锁ツ
    2020-12-31 12:36

    The version number is appended so you can have multiple incompatible library versions coexisting in the system. You should increment the major version number (the number in soname) every time you change the API in an incompatible way (assuming the previous version is installed and used in the system, of course).

    The 2nd and 3rd numbers in the file name allows for multiple minor revisions of the library in the system, switchable system-wide with a simple symlink update.

    At link time you can give the .so file name as a linker argument, instead of -l option. ldd is smart enough to extract the soname from it, the binary linked this way uses it to find the library.

    For example, let's compile the library and test binary using it:

    czajnik@czajnik:~/z$ gcc -shared -Wl,-soname,libtest.so.2 -o libtest.so.2.3.4  a.c 
    czajnik@czajnik:~/z$ gcc -o test b.c -L. ./libtest.so.2.3.4
    

    You can use ldd to verify, that the binary now looks for libtest.so.2:

    czajnik@czajnik:~/z$ LD_LIBRARY_PATH=. ldd ./test
        linux-gate.so.1 =>  (0x002c1000)
        libtest.so.2 => not found
        libc.so.6 => /lib/libc.so.6 (0x00446000)
        /lib/ld-linux.so.2 (0x00a28000)
    

    It obviously can't find it, but that's what the symlink is for:

    czajnik@czajnik:~/z$ ln -s libtest.so.2.3.4 libtest.so.2
    czajnik@czajnik:~/z$ LD_LIBRARY_PATH=. ldd ./test
        linux-gate.so.1 =>  (0x00d75000)
        libtest.so.2 => ./libtest.so.2 (0x00e31000)
        libc.so.6 => /lib/libc.so.6 (0x00a5e000)
        /lib/ld-linux.so.2 (0x00378000)
    

    Update: All of the above is true, yet I wasn't myself aware of the meaning of the 3rd component of the version number. Until recently, I believed it is simply a patch number (or similar thing). Wrong! For libtool it has a special meaning.

    The 3rd component turned out to be age field, which says how many major versions are backward compatible with the current one.

    Recommended reading:

    • Idiot's Guide to ABI Versioning
    • Libtool's versioning system

    0 讨论(0)
提交回复
热议问题