未在 __attribute__((constructor)) 内设置变量或在调用 __attribute__((constructor)) 后重置全局静态变量
Variable not set inside __attribute__((constructor)) or global static variable reset after __attribute__((constructor)) invoked
我有一个 std::vector
需要在加载库时填充一些随机值。但我看到它在加载库后已被重置。是不是因为global
和static
图书馆代码:
static std::vector<uint8_t> g_randomNr{};
__attribute__((constructor)) void generateRandomNrAtStart(void)
{
static bool firstLoad = false;
g_randomNr.clear();
if (!firstLoad) {
firstLoad = true;
std::cout << "Library is loaded and generating first random number ...\n";
}
std::cout << "Generating random number ...\n";
for (int i = 0; i < 20; i++) {
g_randomNr.push_back(i);
}
std::cout << "Random number generated with length of " << g_randomNr.size() << "\n";
}
void getRandomNr(std::vector<uint8_t>& randomNr)
{
randomNr = g_randomNr;
}
主要代码:
int main()
{
std::vector<uint8_t> randomNr{};
getRandomNr(randomNr);
std::cout << randomNr.size() << "\n";
return 0;
}
输出:
Library is loaded and generating first random number ...
Generating random number ...
Random number generated with length of 20
0
在上面的输出中,我期望 cout main
函数中有 20 个,但我收到的是空 vector
您很可能患有 static initialization order fiasco。
我建议延迟初始化 vector
:
auto& instance() {
static std::vector<uint8_t> g_randomNr;
return g_randomNr;
}
然后在你的共享库构造函数中:
__attribute__((constructor)) void generateRandomNrAtStart(void)
{
auto& g_randomNr = instance();
// ...
并且也在制作副本的函数中:
void getRandomNr(std::vector<uint8_t>& randomNr)
{
randomNr = instance();
}
另一种选择是使用 priorities:
来控制向量初始化和构造函数调用的顺序
__attribute__((init_priority(101))) static std::vector<uint8_t> g_randomNr{};
__attribute__((constructor(102))) void generateRandomNrAtStart() { ... }
现场演示:https://godbolt.org/z/bh9zj9cE3
可能是 OT 问题:请注意,在构造函数中使用 I/O(在您的情况下为 std::cout
)可能会遇到同样的问题。参见,例如,.
我有一个 std::vector
需要在加载库时填充一些随机值。但我看到它在加载库后已被重置。是不是因为global
和static
图书馆代码:
static std::vector<uint8_t> g_randomNr{};
__attribute__((constructor)) void generateRandomNrAtStart(void)
{
static bool firstLoad = false;
g_randomNr.clear();
if (!firstLoad) {
firstLoad = true;
std::cout << "Library is loaded and generating first random number ...\n";
}
std::cout << "Generating random number ...\n";
for (int i = 0; i < 20; i++) {
g_randomNr.push_back(i);
}
std::cout << "Random number generated with length of " << g_randomNr.size() << "\n";
}
void getRandomNr(std::vector<uint8_t>& randomNr)
{
randomNr = g_randomNr;
}
主要代码:
int main()
{
std::vector<uint8_t> randomNr{};
getRandomNr(randomNr);
std::cout << randomNr.size() << "\n";
return 0;
}
输出:
Library is loaded and generating first random number ...
Generating random number ...
Random number generated with length of 20
0
在上面的输出中,我期望 cout main
函数中有 20 个,但我收到的是空 vector
您很可能患有 static initialization order fiasco。
我建议延迟初始化 vector
:
auto& instance() {
static std::vector<uint8_t> g_randomNr;
return g_randomNr;
}
然后在你的共享库构造函数中:
__attribute__((constructor)) void generateRandomNrAtStart(void)
{
auto& g_randomNr = instance();
// ...
并且也在制作副本的函数中:
void getRandomNr(std::vector<uint8_t>& randomNr)
{
randomNr = instance();
}
另一种选择是使用 priorities:
来控制向量初始化和构造函数调用的顺序__attribute__((init_priority(101))) static std::vector<uint8_t> g_randomNr{};
__attribute__((constructor(102))) void generateRandomNrAtStart() { ... }
现场演示:https://godbolt.org/z/bh9zj9cE3
可能是 OT 问题:请注意,在构造函数中使用 I/O(在您的情况下为 std::cout
)可能会遇到同样的问题。参见,例如,