gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:59:18 27 4
gpt4 key购买 nike

我正在尝试使用相同函数的两个版本创建库

__asm__(".symver ......

方法

库.h

#ifndef CTEST_H
#define CTEST_H

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

#endif

库.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++ 编译器无法实现?

最佳答案

我不知道为什么,对于 'extern "C"','first' 没有导出 - 怀疑有其他干扰。

否则,C++ 名称重整在这里肯定是一件痛苦的事情。 'asm' 指令 (AFAIK) 需要 C++ 函数的错位名称,而不是简单的 'C' 名称。因此,“int first(int)”需要被引用为(例如)“_Z5firsti”,而不仅仅是“first”。就可移植性而言,这当然是一个真正的痛苦......

链接器映射文件更加宽容,因为它支持的“extern "C++"{...}” block 以其编写的形式列出 C++ 符号 - “int first(int)”。

整个过程是维护的噩梦。我真正想要的是一个可用于指定别名和版本的函数属性...


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

关于gcc - C++ 共享库符号版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37493667/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com