ldd -r -v 如何向文件添加版本符号?
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
我很好奇这个版本符号 VA_API_0.34.0
是如何添加到 VideoEncoderFilter.so
的。
如果我有一个 foo.c 并且我想创建一个版本符号 FOO_API_0.34.0
,我该怎么做?
gcc -c -fPIC foo.c -o foo.o
gcc foo.o -shared -o libfoo.so
GNU ld 支持 version scripts。如果要将版本FOO_API_0.34.0
添加到符号foo
,可以这样做:
$ 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
您可以使用 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
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
我很好奇这个版本符号 VA_API_0.34.0
是如何添加到 VideoEncoderFilter.so
的。
如果我有一个 foo.c 并且我想创建一个版本符号 FOO_API_0.34.0
,我该怎么做?
gcc -c -fPIC foo.c -o foo.o
gcc foo.o -shared -o libfoo.so
GNU ld 支持 version scripts。如果要将版本FOO_API_0.34.0
添加到符号foo
,可以这样做:
$ 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
您可以使用 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