一种跨平台的C/C++动态库的符号隐藏方式

发布时间:2024年01月23日

什么是符号隐藏

在同一个文件中,如果有一些函数我们并不想要让外部访问,我们通常会添加 static 修饰符,把它设置为内部链接属性。

static void foo();

但是通常库不太可能是单文件组成,这些文件中有些是做接口给外部使用,有些则单纯的只是库的内部实现。对于外部使用者来说,内部实现的这些符号没有实际的作用,理论上我们完全可以像对待文件内部符号一样把它们统统隐藏掉。但是在语言层面我们并没有相关的语法用于表达这个概念(Java中的包访问权限和C#中的internal类似这个概念)。不同的编译器提供了不同的方式来完成这件事情,这篇文章总结了一种跨平台的处理方式。

符号隐藏的作用

一般来说做符号隐藏有以下三个作用:

  • 安全,去掉不必要的符号,可以增加逆向破解的难度。
  • 压缩空间,符号实际上是放在 dll 中的,去掉这些符号可以缩减 dll 的大小
  • 性能,符号隐藏掉意味着它不会参与到动态链接过程,编译器可以有更大的优化空间,可能会产生更好的性能。

如何做符号隐藏

符号隐藏可以采用下面几个步骤(文中假定你使用MSVC或者4.0以上版本的GCC,低版本GCC不支持符号隐藏):

1. 动态库

符号能否隐藏在于它在动态链接的过程中是否需要用到。静态库实际上是目标文件的集合,它并没有完成链接过程。所以符号隐藏通常都是基于动态库的,静态库的符号隐藏没有很好的跨平台方式,如果想要

文章来源:https://blog.csdn.net/chenyuping333/article/details/135752285
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。