未在 __attribute__((constructor)) 内设置变量或在调用 __attribute__((constructor)) 后重置全局静态变量

Variable not set inside __attribute__((constructor)) or global static variable reset after __attribute__((constructor)) invoked

我有一个 std::vector 需要在加载库时填充一些随机值。但我看到它在加载库后已被重置。是不是因为globalstatic

图书馆代码:

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)可能会遇到同样的问题。参见,例如,.