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
来做到这一点,那么你就很倒霉了,除非变量碰巧有一个你可以扫描内存的唯一值。不过,这种可能性不大。