如何解决通过共享库初始化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。无需其他说明即可对其进行初始化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。