静态库中的符号可见性和操作
Symbol visibility and manipulation in static libraries
我正在尝试从源文件中创建一个静态库。为了说明我面临的问题,让我们考虑以下代码片段:
foo.h
:
void public_fn_exposed_to_client();
foo.cpp
:
#include "foo.h"
#include <iostream>
#define EXPORT __attribute__ ((visibility ("default")))
static void private_fn() {
std::cout << "Hello private world" << std::endl;
}
// Can't declare static as this can be used elsewhere in my lib.
// I tried to make this symbol hidden.
void internal_fn_used_inside_lib(){
std::cout << "Hello Internal Wolrd" << std::endl;
}
EXPORT
void public_fn_exposed_to_client()
{
std::cout << "Hello Outside World" << std::endl;
internal_fn_used_inside_lib();
}
main.cpp
(通常由客户编写(:
#include "foo.h"
int main(int argc, char** argv)
{
// This is all good.
public_fn_exposed_to_client();
}
main2.cpp
(通常由客户编写(:
#include "foo.h"
extern void internal_fn_used_inside_lib();
int main(int argc, char** argv)
{
// Ideally, This should not be allowed
internal_fn_used_inside_lib();
}
汇编:
g++ -o foo.o foo.c -fvisibility=hidden
ar rcs libfoo.a foo.o
ranlib libfoo.a
g++ -o main1 main.cpp -L. -lfoo
g++ -o main2 main2.cpp -L. -lfoo
我想实现 main2 无法编译/链接的情况。这是为了阻止我的库的客户端使用未作为 API 公开的较低级别的函数。
特别是,如何处理不能声明为静态的函数?
我尝试过的事情:
如前所述,我尝试将objcopy与本地化隐藏标志一起使用,但是没有什么可以阻止客户端再次将其全球化,对吗?
导出地图 - 我不知道如何使它们与静态存档一起使用。相反,我不知道它们是否适用。
不可能。可以将静态库视为所有未链接对象文件的单个文件存档。因此,链接对象文件是可见的,从整个静态库中可见。
"隐藏"内容的唯一方法是不提供头文件,但没有什么能阻止用户自己重新创建这些头文件。
相关文章:
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 班级成员可见性C++
- 内联模板函数的可见性
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 符号可见性和 gcc 警告
- C++/libscreen 无法更新可见性
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- C++继承构造函数的可见性
- CRTP - 嵌套叶类类型的可见性
- C++模板 - 实例之间的通用操作和成员可见性
- 放松的订单和线程间可见性
- GCC 6.x警告有关Lambda可见性
- C++ 中的Shared_ptr和内存可见性
- 静态库中的符号可见性和操作
- 未直接继承的基模板类成员的可见性
- 从shm_open() mmap()更改对共享内存的可见性
- 原子操作传播/可见性(原子负载与原子RMW负载)