C++共享库符号版本控制

3
我正在尝试创建一个库,其中包含两个版本的同一函数,使用的是
__asm__(".symver ......

approach

library.h

#ifndef CTEST_H
#define CTEST_H

int first(int x);
int second(int x);

#endif

library.cpp

#include "simple.h"
#include <stdio.h>

__asm__(".symver first_1_0,first@LIBSIMPLE_1.0");
int first_1_0(int x)
{
    printf("lib: %s\n", __FUNCTION__);
    return x + 1;
}

__asm__(".symver first_2_0,first@@LIBSIMPLE_2.0");
int first_2_0(int x)
{
    int y;
    printf("lib: %d\n", y);
    printf("lib: %s\n", __FUNCTION__);
    return (x + 1) * 1000;
}

int second(int x)
{
    printf("lib: %s\n", __FUNCTION__);
    return x + 2;
}

这里是版本脚本文件。
LIBSIMPLE_1.0{
    global:
    first; second;
    local:
    *;
};

LIBSIMPLE_2.0{
    global:
    first;
    local:
    *;
};

当使用gcc构建库时,一切正常,我能够链接到一个库二进制文件。使用nm工具,我看到first()second() 函数符号都被导出。现在,当我尝试使用g++时,没有任何符号被导出。因此,我尝试使用extern "C"指令来包装两个声明。

extern "C" {

int first(int x);
int second(int x);
}

nm显示second()函数符号被导出,但first()仍然未被导出且被混淆。

我错过了什么使它能够工作吗?或者用C++编译器实现这一点是不可能的吗?

1个回答

1
我不知道为什么,使用“extern"C"”,'first'没有被导出-怀疑有其他干扰因素。
否则,C++名称重载肯定是个麻烦。据我所知,“asm”指令需要C ++函数的重载名称,而不是简单的'C'名称。因此,“int first(int)”需要被引用为(例如)'_Z5firsti',而不仅仅是'first'。当然,就可移植性而言,这真的很麻烦...
链接器映射文件更加宽容,因为它支持'extern"C++"{...}'块以列出C ++符号的实际形式-'int first(int)'。
整个过程是一个维护噩梦。我真正想要的是一个函数属性,可以用来指定别名和版本...

提醒一下,C++11现在支持内联命名空间,可用于在C++中提供符号版本控制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接