GCC VersionScript 给函数符号添加版本标记

文章介绍了如何在Bash中使用readelf命令查看库中的函数版本标记,以及通过CMake和C++示例解释了如何为C++函数创建和应用版本脚本,如CLASSA_1.0,以实现函数的版本控制。通过编译和链接标志,可以为libClassA.so生成相应的版本符号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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++基础库开发的人有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值