Search code examples
linuxgccbinutils

ldd -r -v How do I add version symbol to file?


Version information:
./VideoEncoderFilter.so:
    libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
    libva.so.1 (VA_API_0.34.0) => not found
    libdl.so.2 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libdl.so.2
    libstdc++.so.6 (GLIBCXX_3.4.20) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    libstdc++.so.6 (CXXABI_1.3.8) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    libstdc++.so.6 (CXXABI_1.3.9) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    libstdc++.so.6 (CXXABI_1.3) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    libstdc++.so.6 (GLIBCXX_3.4.15) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6

I am curious how this version symbol VA_API_0.34.0 added to VideoEncoderFilter.so.

If I have a foo.c and I want to create a version symbol FOO_API_0.34.0, what do I do?

gcc -c -fPIC foo.c -o foo.o
gcc foo.o -shared -o libfoo.so

Solution

  • GNU ld supports version scripts. If you want to add the version FOO_API_0.34.0 to the symbol foo, you can do it like this:

    $ cat libfoo.versions
    FOO_API_0.34.0 {
      global: foo;
    };
    $ gcc -c -fPIC foo.c -o foo.o
    $ gcc foo.o -shared -o libfoo.so -Wl,--version-script=libfoo.versions
    

    You can verify that the symbol is there using readelf:

    $ readelf --dyn-syms -W libfoo.so
    
    Symbol table '.dynsym' contains 7 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
         1: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
         2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
         3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
         4: 0000000000000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@GLIBC_2.2.5 (3)
         5: 0000000000000000     0 OBJECT  GLOBAL DEFAULT  ABS FOO_API_0.34.0
         6: 00000000000010f5    11 FUNC    GLOBAL DEFAULT   12 foo@@FOO_API_0.34.0