C++静态库中的共享全局变量:Linux

2023-12-09

在 C++ 中:

静态库“A”定义了一个全局变量 foo。

“B”和“C”是两个动态库,都依赖于 A,因此与 A 链接(静态)。

然后B和C最终加载在同一个进程中 (例如:应用程序负载 B 和 C)。

如果我们在 Windows 环境中,我们将获得 foo 的两个不同实例,一个在 B 中,一个在 C 中,如下所示:

C++静态库中的共享全局变量

Linux环境呢?

语境: 我们目前正在将一个 windows 项目移植到 linux


每个库都将包含 A 的副本。但是,在运行时,进程的所有组件只会使用一个副本。

// h.h
extern int a;
void b(void);
void c(void);

// a.c
#include "h.h"
int a = 0;

// b.c
#include <stdio.h>
#include "h.h"
void b(void)
{
  printf("%i\n", a++);
}

// c.c
#include <stdio.h>
#include "h.h"
void c(void)
{
  printf("%i\n", a++);
}

//main.c
#include <stdio.h>
#include "h.h"
int main()
{
  b();
  c();
}

#Makefile
main: libxc.so libxb.so
    cc -o main main.c -L. -lxc -lxb
libxb.so:
    cc -fPIC -shared a.c b.c -o libxb.so
libxc.so:
    cc -fPIC -shared a.c c.c -o libxc.so

$make
$ LD_LIBRARY_PATH=. ./main
0
1
  

符号表来自libxa.so:



    53: 000000000020098c     4 OBJECT  GLOBAL DEFAULT   24 a
  

From libxc.so:



    53: 000000000020098c     4 OBJECT  GLOBAL DEFAULT   24 a
  

默认可见性是STV_DEFAULT根据LSB:

STV_DEFAULT:符号的可见性STV_DEFAULT属性由符号的绑定类型指定。那是, 全局符号和弱符号在其外部可见 定义 组件(可执行文件或共享对象)。局部符号是 隐藏,如下所述。全局符号和弱符号也是 可抢占的,也就是说,它们可以被相同的定义抢占 另一个组件中的名称。

man 5 elf:

STV_DEFAULT:默认符号可见性规则。 Globa 和弱符号可用于其他 模块;本地模块中的引用可以 被其他定义插入 模块。

有关SysV ABI:

当解析符号引用时, 动态链接器使用广度优先搜索来检查符号表。 也就是说,它首先查看可执行文件的符号表 程序本身,然后在符号表DT_NEEDED条目(按顺序),然​​后在第二层 DT_NEEDED条目等。

如果这不是预期的,使用STV_HIDDEN符号上的阻止它在共享对象外部可见。

相反,在 Windows 上,符号始终从给定的 DLL 导入,并且默认情况下符号不会导出到其他 DLL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++静态库中的共享全局变量:Linux 的相关文章

  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • dotnet 与 Angular cli 对比

    我已经阅读了许多 Angular 2 4 教程 希望能够积累足够的信心来致力于构建一个项目 他们中的大多数使用 Angular cli 来生成入门模板 就在几天前 我偶然发现了一个使用 dotnet cli 解释 NET Core Angu
  • PHP 中 pthread 的问题

    我在 PHP 中遇到 pthreads 问题 当我启动 apache 时 我看到这样的错误 php exe Entry point not found The procedure entry point was not found zend
  • 设置 matplotlib 3D 绘图的刻度颜色

    如果我有一个 3D matplotlib 图 Axes3D对象 如何更改刻度线的颜色 我弄清楚了如何更改轴线 刻度标签和轴标签的颜色 显而易见的解决方案 使用ax tick params axis x colors red 仅更改刻度标签而
  • 将数据从内容可编辑 div 复制到隐藏输入以进行表单提交?

    我想从我的 contenteditable div 中正确复制我的数据 以便我可以将其提交到我的数据库 这将用于类似于 Facebook 的帖子 我的代码如下所示 div class isPlaceholder div 输入一些数据后 ht
  • 外部链接到选项卡、选项卡未更改、Bootstrap 3.3.5

    我的问题与这些问题非常相似 我试图使用链接来更改选项卡 但该链接仅更改选项卡内容 而不更改活动选项卡 最相似 Bootstrap 使用 url 链接到选项卡 非常相似 在 Bootstrap 3 中使用 onclick 显示带有外部链接的选
  • 如何知道android中的音频何时开始播放

    在我的应用程序中 我想在用户启动时获取音乐播放器的开始时间和停止时的结束时间 我不想在我的应用程序中启动任何音乐播放器 我只想跟踪设备中的用户活动 所以我希望我的应用程序在用户开始播放音乐时收到任何通知 我是否对音乐播放器启动和停止有任何意
  • Perl 按散列中的值对散​​列进行排序

    我认为我的想法是正确的 但我搞砸了一些语法 约定 因为我收到错误 全局符号 timeHash需要显式包名称 Code foreach key sort hashValueDescendingNum keys timeHash print t
  • 图像/按钮上的文字

    如何使用 html css 在图像 按钮上制作文本 例如 我有一个按钮 登录按钮 我希望将文本 登录 放置在该按钮上 文本应位于图像 按钮的中心 您可以简单地设置background image相关财产button 或其他元素 如果您使用代
  • 在Java中将字符串转换为双精度型

    我怎样才能转换String例如 12 34 to a double在Java中 您可以使用Double parseDouble 转换一个String to a double String text 12 34 example String
  • window.history.pushState 不会回到历史记录中

    我在尝试 History pushstate 事件时遇到了一些问题 我将其设置为页面的 url 将是通过 AJAX 加载的页面的实际 URL 并且效果很好 我知道它应该自动创建历史记录 加载之前加载的页面 不幸的是 帽子并没有发生 当我点击
  • 密码存储,hash() 与 sha-512 或 crypt() 与河豚 (bcrypt)?

    这是我当前在 PHP SQL 项目中的密码哈希过程 从 dev urandom 中获取 512 位的每用户盐 除了最终哈希值之外 还存储在用户的数据库记录中 从 dev urandom 中取出存储在文件系统中的 512 位 pepper 这
  • 从 $_GET/$_POST 获取信息并将其保存到数据库的做法?

    当涉及到从 get post 获取信息并将信息保存到数据库时 当今的最佳实践是什么 数据是否仍像以前一样进行转义 或者是否还有其他做法 另外 HTMLPurifier 可以用在什么地方呢 我目前正在使用它来过滤富文本 切勿将 GET 中的数
  • 调试 .NET 程序集绑定又名查找使用的 dll 以及原因

    我们在运行时加载的引用 dll 上遇到了一些神秘的版本不匹配问题 错误如 无法加载文件或程序集 X 或其依赖项之一 找到的程序集的清单定义与程序集引用不匹配 HRESULT 异常 0x80131040 有没有办法调试程序集绑定 换句话说 我
  • JQuery 结合 $(document).ready 和 $('DropDown').change 声明

    我想运行一个函数 function myFunction 关于活动 document ready and如果某个下拉菜单发生变化 myDropDown change 有没有一个好的方法来合并这个声明 这样我就不需要两次单独的调用myFunc
  • redactor.js PastePlainText - 但需要按钮来粘贴 html

    我们的大多数客户抱怨从 Word 到我们的 redactor js 富文本编辑器字段的格式设置 我们升级为使用pastePlainText 设置 这似乎效果很好 然而 有些客户仍然需要将 html 粘贴到富文本框中 我们使用插件在工具栏上添
  • 在 Bash 中否定多个条件

    我意识到这是一个简单的问题 但由于 bash 中严格的语法要求 我发现很难得到答案 我有以下脚本 if z 1 z 2 then echo both arguments are set fi 当我不带参数运行它时 我得到以下输出 test
  • SQL Server:并发线程可以更新同一行吗?

    我有一个具有此 UPDATE 查询的存储过程 UPDATE TOP 1 Batch tbl SET locked 1 OUTPUT inserted batchId INTO batchId FROM Batch tbl WHERE loc
  • ASP.NET MVC 中的所有内置 ActionResults

    我正在寻找 ASP NET MVC 控制器中可用的内置 第 3 方将是一个额外的 ActionResults 列表 到目前为止 我发现了以下内容 ContentResult this Content ActionResult this Vi
  • 301 重定向与 DNS 更改:终止 301 重定向并更新子域的 DNS 是否安全?

    我有一个在子域上运行的站点 该子域已迁移到新服务器和新域名 为了保留搜索积分 我知道 301 重定向是处理迁移转换的正确方法 营销部门提到的 301 重定向是我从未听说过的 从技术角度来看 我不明白你必须维持重定向多长时间 有人可以解释一下
  • C++静态库中的共享全局变量:Linux

    在 C 中 静态库 A 定义了一个全局变量 foo B 和 C 是两个动态库 都依赖于 A 因此与 A 链接 静态 然后B和C最终加载在同一个进程中 例如 应用程序负载 B 和 C 如果我们在 Windows 环境中 我们将获得 foo 的