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

时间:2016-05-27 23:28:58

标签: gcc g++ shared-libraries linker-scripts

我尝试使用

创建具有相同功能的两个版本的库
__asm__(".symver ......

方法

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;
}

这是版本scripf文件

LIBSIMPLE_1.0{
    global:
    first; second;
    local:
    *;
};

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

使用gcc构建库时,一切运行良好,并且我能够链接到库二进制文件。使用nm工具,我看到导出了 first() second()函数符号。 现在,当我尝试使用g ++时,会导出非符号。 所以我试图使用extern&#34; C&#34;包含两个声明的指令

extern "C" {

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

nm表示导出了 second()函数符号,但 first()仍然未导出和损坏。

这里有什么我想要让它起作用?或者用c ++编译器实现这一点是不可能的?

1 个答案:

答案 0 :(得分:1)

我不知道为什么,以及&#34;&#34;&#39;&#39;&#39;第一&#39;没有出口 - 怀疑还有其他东西在干扰。

否则C ++名称错误肯定是一种痛苦。 &#39; asm &#39;指令(AFAIK)需要C ++函数的错位名称,而不是简单的C&#39;名称。所以&#39; int first(int)&#39;需要引用为(例如)&#39; _Z5firsti&#39;而不仅仅是“第一次”#。当然,就便携性而言,这是一个真正的痛苦......

链接器映射文件更加宽容,因为它支持的&#34; extern&#34; C ++&#34; {...}&#39;块以列出的形式列出C ++符号 - &#39; int first(int)&#39;。

整个过程是一场维持噩梦。我真正喜欢的是一个函数属性,可用于指定别名和版本......

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