以下部分索引是保留的,引用这些部分的符号没有任何部分-
#define SHN_UNDEF 0x00
#define SHN_LORESERVE 0xFF00
#define SHN_LOPROC 0xFF00
#define SHN_HIPROC 0xFF1F
#define SHN_ABS 0xFFF1
#define SHN_COMMON 0xFFF2
#define SHN_HIRESERVE 0xFFFF
根据 ELF 格式规范,
SHN_UNDEF是一个标记未定义、不相关或其他无意义的节引用的值。相对于节定义的符号是未定义符号。
SHN_LORESERVE值指定保留索引范围的下限。
SHN_LOPROC 到 SHN_HIPROC 的范围是针对特定于处理器的语义。您应该查看您平台的 ABI,以获取有关这些部分索引的信息。
SHN_ABS值指定相应参考的绝对值。这意味着如果一个符号引用了这个部分,那么它已经有一个绝对值并且不受 relocation 的影响。
SHN_COMMON由未分配的外部 C 变量的符号引用。
SHN_HIRESERVE值指定保留索引范围的上限。
请注意,节头表包含这些节的条目,但从 SHN_LOPROC 到 SHN_HIPROC 的包含范围除外。
其他具体说明:
对于可重定位文件,具有节索引 SHN_COMMON 的符号的值指定对齐约束,而不是地址。这可能适用于声明为全局变量的 .BSS 变量 -
int arrayofIntegersToDisplay[256];// Declared a COMMON symbol
对于 STT_FILE 类型的符号(它保存编译代码的文件名的字符串值),它们的节索引始终是 SHN_ABS。这意味着肯定应该声明这种类型的符号。
当目标文件引用另一个文件中分配的数据时,使用未定义的符号(如前所述的部分索引 SHN_UNDEF) -
一个例子是这样的,
/// @file Main.cpp
///
/// Here, we are declaring the variable "var". It is a STT_DATA
/// symbol which (should) have the section-index for ".data"
int var;
在另一个文件中,
/// @file Referer.cpp
///
/// Here, we are referencing the variable "var" allocated in the
/// object file for Main.cpp. It is an undefined symbol.
extern int var;