是否可以从另一个翻译单元访问静态变量

Is it possible to access static variable from another translation unit?

本文关键字:单元 访问 静态 变量 翻译 另一个 是否      更新时间:2023-10-16

a1.cpp

static int a = 20;

a2.cpp

#include <iostream>
extern int a;
int main() {
  std::cout<<a<<std::endl;  // link error
}

如果你不能修改a1.cpp,是否可以更改a2.cpp,使其可以访问a1.cpp中的a?也许使用汇编?

-------编辑--------

万一有人感兴趣,我终于找到了一种方法:

a1.cpp

static int a = 20;

a2.cpp

int b = 100;
int main() {
    int* p = &b;
    p--;
    *p = 42;  // now a in a1.cpp is changed from 20 to 42, tested by clang++ 3.8.1
    return 0;
}

我知道这不是static的原因,只是想知道我们是否可以使用地址和偏移量来破解它。

如果变量是a1.cpp中的static,则只有a1.cpp可以直接访问它,其他具有extern的单元根本无法访问它。

程序集可以访问它,但如果您在运行时知道变量的内存地址,则只能

通常,a1.cpp必须将指向变量的指针传递给a2.cpp(在这种情况下,不需要汇编(。但是,如果你不能改变a1.cpp来做到这一点,那么你就很倒霉了,除非变量碰巧有一个你可以扫描内存的唯一值。不过,这种可能性不大。