1. 简介
在Bash里输入
readelf -s /usr/lib/x86_64-linux-gnu/libc.so.6 | grep printf
会看到很多带有版本标记的符号
例如
2295: 000000000005b8a0 11 FUNC GLOBAL DEFAULT 15 vfprintf@@GLIBC_2.2.5
“vfprintf@@GLIBC_2.2.5” "函数@@版本"标记这种符号都在很多函数库见到,但是这样的符号我们是如何生成呢?
2. 代码
本人Github源码:
https://github.com/engineer1109/GCCVersionScript
提供了一个CMake使用C++/C函数版本标记的模板
首先我们需要创建一个ClassA.map这样的文件。
CLASSA_1.0 {
global:
funcA;
_ZN2AA5funcBEv;
local:
*;
};
CLASSA_1.0是我们需要打上的版本符号标记。
global下的funcA代表ClassA下的函数
extern "C" {
void funcA();
}
_ZN2AA5funcBEv 代表ClassA下的函数
class AA {
public:
void funcB();
};
C++函数需要Itanium ABI转换后才能使用,可以自行了解下C++编译后的处理符号https://itanium-cxx-abi.github.io/cxx-abi/abi.html
最后cmake文件加入
set_target_properties (ClassA PROPERTIES LINK_FLAGS "-Wl,--version-script -Wl,${CMAKE_CURRENT_SOURCE_DIR}/ClassA.map")
经过编译得到libClassA.so, 进行验证
readelf -s libClassA.so | grep funcA
readelf -s libClassA.so | grep funcB
得到
13: 000000000000117a 54 FUNC GLOBAL DEFAULT 15 funcA@@CLASSA_1.0
68: 000000000000117a 54 FUNC GLOBAL DEFAULT 15 funcA
14: 00000000000011b0 62 FUNC GLOBAL DEFAULT 15 _ZN2AA5funcBEv@@CLASSA_1.0
57: 00000000000011b0 62 FUNC GLOBAL DEFAULT 15 _ZN2AA5funcBEv
这应该对一些Linux C++基础库开发的人有用。