通过共享库初始化C ++全局变量

问题描述

共享。h

    #pragma once
    
    extern int uninitialized_variable;
    extern int initialized_variable;
    
    void print();

shared.cpp

    // shared.cpp
    #include "shared.h"
    #include <stdio.h>
    
    int uninitialized_variable;
    int initialized_variable = 8;
    
    void print() {
        printf("%d\n",uninitialized_variable);
        printf("%d\n",initialized_variable);
    }

main.cpp

    #include "shared.h"
    #include <stdio.h>
    
    
    int main() {
        printf("%d\n",initialized_variable);
        print();
    }

g++ -O0 -pedantic -std=c++11 -fPIC shared.cpp -c -o shared.o
g++ -shared -o libshared.so shared.o

g++ -O0 -pedantic -std=c++11 main.cpp -L. -lshared

当我运行./a.out时,结果为0 8 0 8。 但是我找不到initialized_variable是8的原因。

由于我使用gbd检查了initialized_variable的确切位置,发现它位于a.out中的.bss中。但是在libshared.so的.init部分中,我找不到任何内容。代码来对a.out的.bss中的initialized_variable进行初始化。

谁和何时initialized_variable初始化?

解决方法

它作为.data段中的原始数据提供:

Disassembly of section .data:

....

0000000000004028 <initialized_variable>:
    4028:   08 00                   or     %al,(%rax)
    402a:   00 00                   add    %al,(%rax)

忽略该程序集,因为它不是可执行数据。请注意,initialized_variable所在的偏移量包含四个字节(此处为十六进制):08 00 0000。解释为4字节带符号的Little-Endian整数,值为8。

很简单,将库映射到内存后,该值为8。无需其他说明即可对其进行初始化。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...