符号和符号表

每个可重定位目标模块m都有一个符号表,它包含m所定义和引用的符号的信息。
有三种不同的符号:

  • 由m定义并能被其他模块引用的全局符号。对应非静态的C函数以及不带C static属性的全局变量
  • 由其他模块定义,并被m引用的全局符号。这些符号称为外部符号,对应定义在其他模块中的C函数和变量。
  • 只被模块m定义和引用的本地符号。对应带static属性的C函数和全局变量。这些符号不能不其他模块引用。

.symtab中的符号表不包含本地非静态变量。这些符号在运行时在栈中被管理。

定义为带有C static属性的本地过程变量不在栈中管理。编译器为其在.data和.bss中定义分配空间,并在符号表中创建一个有唯一名字的本地链接器符号。

例如:

int f()
{
	static int x=0;
	return x;
}
int g()
{
	static int x=1;
	return x;
}

编译器在.data中为两个整数分配空间,并export两个唯一的本地链接器符号给汇编器。编译器把初始化为0的变量放在.bss而不是.data中,所以函数f()中定义的x实例在.bss中而不是.data中。

相关文章:

  • 2021-08-19
  • 2021-08-02
  • 2021-09-29
  • 2022-12-23
  • 2021-12-03
  • 2021-06-23
猜你喜欢
  • 2021-12-08
  • 2021-11-28
  • 2021-12-06
  • 2021-07-18
  • 2021-11-03
相关资源
相似解决方案