gpt4 book ai didi

c++ - 如何在每个共享库中使用自己的静态库拷贝

转载 作者:IT王子 更新时间:2023-10-29 00:54:26 24 4
gpt4 key购买 nike

我有一些无法更改或重建的静态库。该库使用全局变量。像这样:

//lib A
#include <iostream>

static int i = 0;

void printA(){
std::cout << i++ << std::endl;
}

我想创建两个共享库,它们有自己的静态库“拷贝”及其全局状态:

//lib B
#include "liba.h"

void printB(){
printA();
}

⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

//lib C
#include "liba.h"

void printC(){
printA();
}

...并同时使用它们:

#include "libb.h"
#include "libc.h"

int main(){
printB();
printB();
printC();
printC();
}

我期望以下输出:

0
1
0
1

.. 但实际上得到:

0
1
2
3

似乎 libBlibC 共享公共(public)计数器变量。如果可以访问 libA 源代码,我会使用 -fvisibility=hidden 重建它。但不幸的是我只有二进制文件。

有没有什么方法可以在不重建 libA 的情况下实现预期的行为?

最佳答案

如果 LibA 使用静态计数器,libB 和 libC 通过调用 printA 递增,那么如果没有对象文件操作或不可移植的黑客攻击,就无法做你想做的事。

链接器在链接时将所有对全局变量(甚至 static s)的引用解析为相同的符号。

如果您愿意操作目标文件,那么以下内容应该适合您:

$ objcopy --prefix-symbols=copy_ liba.a liba-copy.a

#define printA copy_ printA
#include "liba.h"
/* ... */

如果您可以使用 nm 从静态库中获取符号(您要查找的名称将采用 <counter name>.<process ID> 的形式)并执行类似以下操作,然后您可以在运行时读写静态计数器变量:

int counter asm("<counter name>.<process ID>");
counter = 0;

请注意,每次更新库后都必须重复此过程。

关于c++ - 如何在每个共享库中使用自己的静态库拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56340693/

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