问题描述
共享。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。无需其他说明即可对其进行初始化。